yincheng.zhong
2025-11-24 08da431bc5693c77659d664bb131f2bfdd14d8e4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
o
¯$i`vã@s€dZddlmZddlZddlZddlZddlZddlZddlZddl m
Z
ddl m Z m Z mZmZz ddlmZmZmZWn eyIdZYnwzddlmZWn ey]dZYnwdd   lmZmZmZmZdd
lmZmZmZd Z d Z!d Z"dZ#dZ$dZ%dZ&e
e'ƒ (¡j)dZ*d%dd„Z+Gdd„dƒZ,Gdd„dej-ƒZ.Gdd„dej/ƒZ0d&d d!„Z1d"d#„Z2e3d$kr¾e 4e2ƒ¡dSdS)'u]
HITL ä»¿çœŸå™¨ GUI:左侧地图显示路径/车辆,右侧显示状态与控制信息。
é)Ú annotationsN)ÚPath)ÚDictÚListÚOptionalÚTuple)ÚQtCoreÚQtGuiÚ  QtWidgets)Ú
list_portsé)Ú ControlStatusÚ
PoseStatusÚ StackStatusÚ StateStatus)Ú
HitlConfigÚ HitlSimulatorÚ  RunLoggerZCOM35ZCOM17zX$GNGGA,080112.000,3949.8105069,N,11616.6876082,E,4,44,0.42,48.502,M,-6.684,M,1.0,0409*73)çrrriÂiz
runlog.txtÚ path_filerÚreturnúList[Tuple[float, float]]c  Cs"| ¡s
tt|ƒƒ‚|jdd ¡}|sgSg}|j ¡dks$| d¡rZz)t    |¡}|D]}t
|t t fƒrJt |ƒdkrJ| t|dƒt|dƒf¡q,|WStjyYgYSw| d¡D]/}| ¡}|shq_| d ¡}t |ƒdkrtq_z| t|dƒt|dƒf¡Wq_tyŽYq_w|S)
Nzutf-8)Úencodingz.jsonú[érr ú;ú,)ÚexistsÚFileNotFoundErrorÚstrZ  read_textÚstripÚsuffixÚlowerÚ
startswithÚjsonÚloadsÚ
isinstanceÚlistÚtupleÚlenÚappendÚfloatZJSONDecodeErrorÚsplitÚ
ValueError)rÚtextÚpointsÚdataÚptZtokenÚparts©r3ú/E:\GIT\Lawnmower_STM32H7\python\hitl\run_sim.pyÚload_path_points's< 
€ÿ
 " ÿr5c@s.eZdZdd„Zd dd„Zdd„Zd d
„Zd S) Ú HitlGuiBridgecCstjdd|_t ¡|_dS)NéÈ)Úmaxsize)ÚqueueZQueueÚ threadingZLockÚ_lock©Úselfr3r3r4Ú__init__FszHitlGuiBridge.__init__ÚkindrcCs:|j| ||f¡WdƒdS1swYdS©N)r;Ú_enqueue)r=r?r0r3r3r4ÚpublishJs"ÿzHitlGuiBridge.publishc Cs„|j5|j ¡s(z|j ¡Wn
tjyYnw|j ¡r   WdƒdSWdƒdSWdƒdS1s;wYdSr@)r;r9ZemptyÚ
get_nowaitÚEmptyr<r3r3r4ÚresetNs
ÿ ýÿÿ"ûzHitlGuiBridge.resetc Csvz |j |¡WdStjy:z|j ¡Wn
tjy"Ynwz
|j |¡WYdStjy9YYdSwwr@)r9Z
put_nowaitZFullrCrD)r=Úitemr3r3r4rAVsÿÿùzHitlGuiBridge._enqueueN)r?r)Ú__name__Ú
__module__Ú __qualname__r>rBrErAr3r3r3r4r6Es
 
 r6csTeZdZdZ‡fdd„Zddd„Zd‡fd   d
„ Zd‡fd d „ Zd‡fd d„ Z‡Z   S)ÚZoomableGraphicsViewu6支持鼠标滚轮缩放 + æŒ‰ä½å·¦é”®å¹³ç§»çš„视图csztƒj|i|¤Ž| tjjd¡| tjj  ¡| 
tjj   ¡|  tjj ¡|  tjj¡d|_d|_t ¡|_d|_dS)NTgffffffò?F)Úsuperr>Z setRenderHintr    ZQPainterZ AntialiasingZsetTransformationAnchorr
Ú QGraphicsViewZAnchorUnderMouseZsetResizeAnchorZ setDragModeZNoDragÚ setCursorrÚQtÚOpenHandCursorÚ _zoom_factorÚ_panningZQPointÚ _pan_last_posÚ on_user_pan)r=ÚargsÚkwargs©Ú  __class__r3r4r>gs
 
zZoomableGraphicsView.__init__ÚeventúQtGui.QWheelEventcCs4| ¡ ¡}|dkr |jnd|j}| ||¡dS)Nrçð?)Z
angleDeltaÚyrPZscale)r=rXÚdeltaZ scale_factorr3r3r4Ú
wheelEventss zZoomableGraphicsView.wheelEventúQtGui.QMouseEventcsJ| ¡tjjkrd|_| ¡|_| tjj¡|     ¡dSt
ƒ  |¡dS)NT) ÚbuttonrrNÚ
LeftButtonrQÚposrRrMZClosedHandCursorÚacceptrKÚmousePressEvent©r=rXrVr3r4rcxs
z$ZoomableGraphicsView.mousePressEventcst|jr2| | ¡¡}| |j¡}||}| ¡|_| | ¡ | ¡ ¡|jr,| ¡| ¡dSt  ƒ 
|¡dSr@) rQZ
mapToScenerarRÚ   translateÚxr[rSrbrKÚmouseMoveEvent)r=rXZ   scene_posZlast_scene_posr\rVr3r4rgs 
z#ZoomableGraphicsView.mouseMoveEventcsF| ¡tjjkr|jrd|_| tjj¡| ¡dStƒ  |¡dS)NF)
r_rrNr`rQrMrOrbrKÚmouseReleaseEventrdrVr3r4rhŽs z&ZoomableGraphicsView.mouseReleaseEvent)rXrY)rXr^)
rGrHrIÚ__doc__r>r]rcrgrhÚ __classcell__r3r3rVr4rJds 
     rJcsÆeZdZd8‡fd
d „ Zd9d d „Zdd„Zd:dd„Zd;d9dd„Zd<dd„Zdd„Z dd„Z
dd„Z ‡fd d!„Z d"d#„Z d$d%„Zd&d'„Zd(d)„Zd*d+„Zd=d.d/„Zd0d1„Zd2d3„Zd4d5„Zd6d7„Z‡ZS)>Ú HitlDashboardÚ    simulatorrÚbridger6Ú path_pointsrÚ initial_uart2ú Optional[str]Ú initial_uart5csªtƒ ¡||_||_t|pgƒ|_g|_d|_d|_d|_ i|_
d|_ |  d¡|  dd¡d|_g|_| ||¡| ¡t |¡|_|jj |j¡|j d¡dS)NTuHITL ä»¿çœŸçŠ¶æ€é¢æ¿iiÐFéP)rKr>rlrmr'rnÚ trail_pointsÚcontrol_statusÚ pose_statusÚ state_statusÚ stack_statusÚ _auto_followZsetWindowTitleZresizeÚ _serial_openÚ _last_portsÚ   _build_uiÚ _init_scenerZQTimerZtimerÚtimeoutÚconnectÚ _drain_queueÚstart)r=rlrmrnrorqrVr3r4r>˜s&
 
   zHitlDashboard.__init__c Cs8t ¡}t |¡}| |¡t |¡|_t ¡}t |¡}| dddd¡| d¡t    |jƒ|_
|j |j
_ |j |j
ddt d¡|_|j d¡|jj |j¡|j |jtjjd|j |ddtdu|_t ¡}t |¡}| d ddd¡|j |d
dt d ¡} t |   ¡}
t ¡|_t ¡|_t d ¡|_t d ¡|_ t !d¡|_"|j" #d¡|
  t !d¡dd¡|
  |jdd¡|
  t !d¡dd¡|
  |jdd¡|
  |jdd
d
d¡|
  |j d
ddd¡|
  |j"dddd¡|  | ¡tdur   |j $d¡|j %d¡|j %d¡t d¡} t | ¡} t &¡|_'t d¡|_(t d¡|_)|   |j'¡|   |j(¡|   |j)¡|  | ¡t d¡} t | ¡}t &t*¡|_+t d¡|_,|  t !d¡dd¡|  |j+dddd
¡|  |j,dd¡gd¢}g|_-t.|ƒD]N\}}t /¡}|dkr‘| 0dd¡| 1d¡n | 0dd¡| 1d
¡|  t !|¡d|d
|d
d
¡|  |d|d
|d
d
d¡|j- 2|¡qxt d¡|_3|  |j3dddd¡|  | ¡t d¡}t |¡}t !d ¡|_4|j4 5tjj6tjjB¡|j4 #d!¡t 7¡}| 8d¡| 9|j4¡|  |¡|j |ddt d"¡}t |¡}t :dd¡|_;|j; <gd#¢¡|j; =¡ >d¡|  |j;¡|  |¡t d$¡}t |¡}t ?¡|_@|j@ Ad¡|  |j@¡|j |dd|j BtC D¡tC EtC Fd%¡d&¡¡|_G|j BtC D¡tC EtC Fd'¡d(¡¡|_H|j Id)d)d*d*tC EtC Fd+¡d(¡tC JtC Fd,¡¡¡|_KtC EtC Fd-¡d¡}| LtjjM¡|j BtC D¡|tC JtC Fd-¡¡¡|_N|j Id.d.d/d/tC EtC Fd0¡¡tC JtC Fd0¡¡¡|_O|j(jP |jQ¡|j)jP |jR¡|j,jP |jS¡|j3jP |jT¡|jjP |jU¡|j jP |jV¡| U||¡| Wd¡| X¡dS)1Nrér )Zstretchu自动跟随车辆T)Z    alignmentééru 串口设置u刷新õ 打开串口õ状态: æœªè¿žæŽ¥ú color: gray;zUART2:zUART5:Fu 路径文件u浏览u加载u 原点/起点u 更新原点zGGA:)zE (m)zN (m)zU (m)z Heading (deg)g@Àg@@g€vÀg€v@u 重置位置u 车辆状态õ等待数据...z6font-family: Consolas, 'Courier New'; font-size: 12px;u 堆栈监测)u任务u堆栈余量(word)u剩余堆(byte)u 串口日志Zgraygš™™™™™é?ZbluerZg333333Ó¿ç333333ã?z#d11d29z#ff4b5cz#ff8c00gš™™™™™É¿çš™™™™™Ù?Zgreen)Yr
ZQWidgetZ QHBoxLayoutZsetCentralWidgetZQGraphicsSceneÚsceneZ QVBoxLayoutZsetContentsMarginsZ
setSpacingrJÚviewÚ_handle_user_panrSZ   addWidgetZ  QCheckBoxÚfollow_checkboxÚ
setCheckedZtoggledr~Ú_on_follow_toggledrrNZ AlignLeftr Ú_port_refresh_supportedZ    QGroupBoxZ QGridLayoutZ QComboBoxÚ port2_comboÚ port5_comboZ QPushButtonÚport_refresh_btnÚserial_toggle_btnZQLabelÚserial_status_labelÚ setStyleSheetÚ
setEnabledZ setEditableZ    QLineEditÚ  path_lineÚpath_browse_btnÚ path_load_btnÚDEFAULT_ORIGIN_GGAÚ origin_editÚ
origin_btnÚpos_spinÚ   enumerateZQDoubleSpinBoxZsetRangeZ setDecimalsr*Úreset_pose_btnÚ
info_labelZ setAlignmentZAlignTopZ QScrollAreaZsetWidgetResizableZ    setWidgetZ QTableWidgetÚ stack_tableZsetHorizontalHeaderLabelsZhorizontalHeaderZsetStretchLastSectionZQPlainTextEditÚlog_viewÚ setReadOnlyZaddPathr   Ú QPainterPathZQPenZQColorÚ    path_itemÚ
trail_itemZ
addEllipseZQBrushÚ
robot_itemZ setJoinStyleZ   RoundJoinÚ heading_itemÚ target_itemZclickedÚ _browse_pathÚ
_load_pathÚ_update_originÚ_reset_positionÚ_refresh_serial_portsÚ_toggle_serialÚ_set_controls_enabledÚ_update_serial_ui)r=rorqZcentralZlayoutZ
left_panelZ left_layoutZ right_panelZ right_layoutZ serial_groupZ serial_layoutZ
path_groupZ path_layoutZ origin_groupZgridZlabelsÚidxZlabelZspinZ status_groupZ status_layoutZ info_scrollZ stack_groupZ stack_layoutZ log_groupZ
log_layoutZ arrow_penr3r3r4r{¶sô
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
$" 
 
 
 
 
 
 
 
 
 
 
  ""úý0 
 zHitlDashboard._build_uicCs8|jr|j d¡|j d¡|j d¡d|_dSdS)NTF)rxrÚ blockSignalsrŽr<r3r3r4rŒKs    
üzHitlDashboard._handle_user_panÚcheckedÚboolcCs4||_|r|jr|j |jj|jj ¡dSdSdSr@)rxrur‹ÚcenterOnÚeastÚnorth)r=rµr3r3r4rRs
ÿz HitlDashboard._on_follow_toggledNcsŠg‰trz dd„t ¡Dƒ‰Wn tyg‰Ynw|p#|jjjp#d}|p,|jjjp,d}d
‡fdd „ }||j|ƒ||j|ƒˆ|_   dS) NcSsg|]}|j‘qSr3)Zdevice)Ú.0Úpr3r3r4Ú
<listcomp>[sz7HitlDashboard._refresh_serial_ports.<locals>.<listcomp>ÚÚcomboúQtWidgets.QComboBoxÚsavedrcst| ¡}| d¡| ¡ˆr| ˆ¡|r|ˆvr| |¡|p"|}|r3| |¡}|dkr3| |¡| d¡dS)NTrF)Ú currentTextr´ÚclearZaddItemsZaddItemZfindTextZsetCurrentIndex)r¾rÀZcurrentÚtargetr³©Zportsr3r4Ú_fillas
 
 
 
 
z2HitlDashboard._refresh_serial_ports.<locals>._fill)r¾r¿rÀr)
r ZcomportsÚ    ExceptionrlÚconfigÚ
uart2_portÚ
uart5_portr‘r’rz)r=rorqZ saved_uart2Z saved_uart5rÅr3rÄr4r¯Ws ÿ  
z#HitlDashboard._refresh_serial_portsÚenabledcCsL|j|j|j|j|j|jfD]}| |¡q|j | ¡|j | ¡dSr@)r˜r™ršrœrr r—r¤)r=rÊZwidgetr3r3r4r±tsú z#HitlDashboard._set_controls_enabledcCsÊ|j |jrdnd¡|jr0|jjjpd}|jjjpd}|j d|›d|›d¡|j d¡n |j d ¡|j d
¡|j }|j  
|pI|j   ¡¡|j  
|pT|j   ¡¡|j rc|j 
|j ¡dSdS) Nu 关闭串口r„u未知u无u状态: å·²è¿žæŽ¥ (UART2=z, UART5=ú)z color: green;r…r†)r”ÚsetTextryrlÚuart2ÚportÚlog_uartr•r–r‘r—Z
isEditabler’rr“)r=rÍÚuart5Z enable_portsr3r3r4r²s  ÿzHitlDashboard._update_serial_uic
Csò|jr   | ¡dS|j ¡ ¡}|stj |dd¡dS|j ¡ ¡}|p&d}||j   j
_ ||j j
_ ||j j _||j   j_z|j    ¡Wn#tye}z|j  ¡tj |dd|›¡WYd}~dSd}~wwd|_|j ¡| d¡| ¡dS)Nu串口u请先选择 UART2 ç«¯å£ã€‚u打开串口失败: T)ryÚ _close_serialr‘rÁr r
Ú QMessageBoxÚwarningr’rlrÇrÈrÉrÍrÎrÏr€rÆÚstopZcriticalrmrEr±r²)r=rÍZ
uart5_textrÐÚexcr3r3r4r°‘s2
 
 
 
 
€ý
 
 zHitlDashboard._toggle_serialcCs€|j ¡|j ¡|j ¡d|_d|_d|_|j   ¡|j
 ¡|j   d¡|j  d¡d|_| d¡| ¡| ¡dS)Nr‡rF)rlrÔrmrErsrÂrtrurvrwr£r¡rÌr¢Ú setRowCountryr±r²Ú _refresh_viewr<r3r3r4rѪs
 
 
 
 
 
 zHitlDashboard._close_serialcs|jr| ¡tƒ |¡dSr@)ryrÑrKÚ
closeEventrdrVr3r4rغszHitlDashboard.closeEventcCs6tj |dtt ¡ƒd¡\}}|r|j |¡dSdS)Nu选择路径文件u-路径文件 (*.txt *.json);;所有文件 (*))r
Z QFileDialogZgetOpenFileNamerrÚcwdr˜rÌ)r=Ú  file_nameÚ_r3r3r4r«¿sÿzHitlDashboard._browse_pathc
Csº|j ¡ ¡}|stj |dd¡dSztt|ƒƒ}Wnty9}ztj |dd|›¡WYd}~dSd}~ww|sFtj |dd¡dS||_   | 
¡tj  |ddt |ƒ›d¡dS)Nu路径u请先选择路径文件。u加载失败: u未解析到有效路径点。u
已加载 u ä¸ªè·¯å¾„点。) r˜r.r r
rÒrÓr5rrÆrnr|Ú informationr))r=Z    file_textZ
new_pointsrÕr3r3r4r¬Äs"€þ zHitlDashboard._load_pathcCsZ|j ¡ ¡}|stj |dd¡dS|j |¡r#tj |dd¡dStj |dd¡dS)Nu原点u请输入 GGA å­—符串。u原点已更新。u'原点更新失败,请检查格式。)   rœr.r r
rÒrÓrlZ update_originrÜ)r=Zggar3r3r4r­Õs zHitlDashboard._update_origincCs^|jd ¡}|jd ¡}|jd ¡}|jd ¡}|j ||||¡tj |dd¡dS)Nrr rr‚u位置u已重置仿真状态。)ržÚvaluerlZ reset_stater
rÒrÜ)r=r¸r¹ÚupÚheadingr3r3r4r®ßs zHitlDashboard._reset_positioncCs$|js|j dddd¡dSt ¡}d}g}g}|jD]"\}}| |¡| | ¡|r6| || ¡d}q| || ¡q|j   |¡t
|ƒ}t |ƒ}t
|ƒ}   t |ƒ}
||} |
|   } t d| dƒ} t d| dƒ}t   || | || dkrx| nd| d   | dkrƒ| nd|d   ¡}|j |¡dS)
NiÿÿÿiôTFg$@gè?rrZg@)rnrŠZ setSceneRectr   r¥r*ÚmoveToÚlineTor¦ÚsetPathÚminÚmaxrZQRectF)r=ÚpathÚfirstZxsZysZpxÚpyZmin_xZmax_xZmin_yZmax_yÚwidthZheightZpad_xZpad_yZ
scene_rectr3r3r4r|çs<
  üzHitlDashboard._init_scener.rcCs*|j |¡|j ¡ |j ¡ ¡¡dSr@)r£ZappendPlainTextZverticalScrollBarZsetValueZmaximum)r=r.r3r3r4Ú _append_logs zHitlDashboard._append_logcCsÐd}   z
|jj ¡\}}Wn
tjyYnGw|dkr ||_n;|dkr?||_|j |j|j f¡t
|jƒdkr>|j  d¡n|dkrG||_ n|dkrR||j |j<n |d kr[| |¡d}q|rf| ¡dSdS)
NFTÚcontrolÚposeiÐrÚstateÚstackÚlog)rmr9rCrDrtrursr*r¸r¹r)ÚpoprvrwÚ    task_namerér×)r=Úupdatedr?r0r3r3r4r s4ÿ €
î ÿzHitlDashboard._drain_queuecCsŽg}|jr?|j}|dd|jd›d|jd›d|jd›ddd|jd    ›d
|jd   ›d |jd ›d |jd ›d|jd ›dg
7}|j rn|j   }|ddd|j
d›dd|j d›dd|j ›d|j ›d|jd›dd|j›g7}|jrŒ|j}|dd|j›d|jd›dd|jd ›dg7}|jr¯|dd g7}|j ¡D]}| d!|j›d"|j›d#|j›d$¡qš|s´d%g}|j d& |¡¡| ¡| ¡dS)'Nu位置 (ENU, m):z  E: z+7.3fz  N: z  U: r½u 姿态 (deg):z   Heading: z+7.2fz   Pitch  : z   Roll   : z   Target : (z+6.2fz, rËu
控制量:z   Forward : z+6.3fz m/sz   Turn    : z rad/sz  PWM     : steer=z
 throttle=z   Freq    : z6.2fú Hzz   Stage   : u算法状态: z   XTE    : z mz degu 堆栈监测:z  z: stack=z  words heap=z Br‡Ú
)rur¸r¹rÞÚ heading_degZ    pitch_degZroll_degÚ target_eastÚ target_northrtÚ forward_mpsÚ   turn_rateZ steering_pwmZ throttle_pwmÚfreq_hzÚstagervZcross_track_errorZheading_error_degrwÚvaluesr*rðÚstack_high_waterÚheap_free_bytesr¡rÌÚjoinÚ_update_scene_itemsÚ_refresh_stack_table)r=Z
info_linesrëZctrlÚstrFr3r3r4r×$sZ      ö 
ù    
ü ÿ zHitlDashboard._refresh_viewc Cs~|j t|jƒ¡t|j ¡ƒD],\}}|j |dt |j   ¡¡|j |dt t
|j ƒ¡¡|j |dt t
|j ƒ¡¡qdS)Nrr r) r¢rÖr)rwrŸrûZsetItemr
ZQTableWidgetItemrðrrürý)r=ZrowÚstatusr3r3r4rSs ýz"HitlDashboard._refresh_stack_tablec
Cst|jr/t ¡}d}|jdd…D]\}}| }|r"| ||¡d}q| ||¡q|j |¡|jr6|j}|j}|j    }|j
  |d|ddd¡t   d|j¡}t  |¡}t  |¡ } |    }
|} d} d} d   }d
}d }||| || | f}|d || |d | | f}|d |||d | |f}|d |
||d | |f|d |
||d | |f|d |
||d | |f||d |
||d | |f|d |
||d | |f|d |
||d | |fg}t ¡}|j|d Ž|d d…D]}|j|ސq| ¡|j |¡|j  |jd|j ddd¡|jr8|j ||¡dSdSdS)NTi$úÿÿFg333333Ó?rˆg€V@gÐ?g333333ë?gìQ¸…ë±?gÍÌÌÌÌÌÜ?gìQ¸…ëÑ?rr gš™™™™™É?r‰)rsr  r¥ràrár§rârur¸r¹r¨ZsetRectÚmathZradiansrôZcosZsinZ closeSubpathr©rªrõrörxr‹r·)r=Útrailrærfr[Zscene_yrëZ heading_radZdir_xZdir_yZperp_xZperp_yÚoffsetZ shaft_lengthZshaft_half_widthZ head_lengthZhead_half_widthr€Z  shaft_endZtipr/Z
arrow_pathr1r3r3r4rÿZs‚  
 
 
þþþþþþþþþê  ¹Fz!HitlDashboard._update_scene_items)
rlrrmr6rnrrorprqrp)rorprqrp)rµr¶)NN)rÊr¶)r.r)rGrHrIr>r{rŒrr¯r±r²r°rÑrØr«r¬r­r®r|rérr×rrÿrjr3r3rVr4rk—s,

 
 
 
!/rkúargparse.NamespacecCsÚtjdd}|jdtdd|jdtdd|jdtd   d|jd
ttd d d |jdttddd |jdttddd |jdttdd |jdt   t
dd |jdt t dd |jddd|jdddd |  ¡S)!NuHITL ä»¿çœŸå™¨ GUI)Z descriptionz--uart2uSTM32 UART2 ä¸²å£å·)ÚdefaultÚhelpz--uart5uSTM32 UART5 ä¸²å£å·z--originu
GGA åŽŸç‚¹z--eastru 初始 E (m))Útyperrz--northr u 初始 N (m)z--upru 初始 U (m)z   --headingu初始航向 (deg)z
--gps-bauduUART2 æ³¢ç‰¹çއz
--log-bauduUART5 æ³¢ç‰¹çއz--pathu初始路径文件 (.json/.txt))rz--no-guiZ
store_trueu"不启动 Qt GUI,仅打印数据)Úactionr) ÚargparseZArgumentParserZ add_argumentÚDEFAULT_UART2_PORTÚDEFAULT_UART5_PORTr›r+Ú DEFAULT_ENUÚDEFAULT_HEADING_DEGÚintÚDEFAULT_UART2_BAUDÚDEFAULT_UART5_BAUDÚ
parse_args)Zparserr3r3r4r°s rc
 
s†tƒ}t|j|j|j|j|j|jf|j|j   |j
d}t t ƒ}t ||d}tƒ‰‡fdd„‰‡fdd„|_‡fdd„|_‡fdd„|_‡fd d„|_‡fd
d„|_g}|jrxz tt|jƒƒ}Wntyw}z td |›ƒWYd}~nd}~wwtdus|jrïzbzE| ¡td ƒ  z ˆjjdd\}}Wn
tjyŸYq‰w|dkr©t|ƒn|dkrÅtd|j›d|j d›d|j!d›d|j"d›d   ƒqŠt#yÒtdƒYnwW| $¡| %¡tdƒdS| $¡| %¡tdƒwtj& '¡pøt &g¡}t(|ˆ||j|jƒ} |jr|   j) *|j¡|    +¡z| ,¡W| j-r |  .¡| $¡| %¡tdƒdS| j-r6|  .¡| $¡| %¡tdƒw)N)rÈrÉZ
origin_ggaZ initial_enuZinitial_heading_degZ gps_baudrateZ log_baudrate)Ú
run_loggercsˆ ||¡dSr@©rB)r?r0)rmr3r4rBÐszmain.<locals>.publishcó
ˆd|ƒS)Nrêr3©rrr3r4Ú<lambda>Óó
zmain.<locals>.<lambda>cr)Nrër3rrr3r4rÔrcr)Nrìr3rrr3r4rÕrcr)Nrír3rrr3r4rÖrcr)Nrîr3)Úlinerr3r4r×ruARN] è·¯å¾„加载失败: uF[INFO] HITL ä»¿çœŸå™¨å·²å¯åЍ (无 GUI æ¨¡å¼)。按 Ctrl+C é€€å‡ºã€‚TrZ)r}rîrêz [CTRL] stage=z F=z+.2fz m/s T=z  rad/s freq=z.2fròu
[INFO] ç”¨æˆ·ä¸­æ–­ã€‚u[INFO] ä»¿çœŸå™¨å·²åœæ­¢ã€‚)/rrrÍrÐÚoriginr¸r¹rÞrßZgps_baudZlog_baudrÚ RUN_LOG_PATHrr6Zon_control_statusZon_pose_statusZon_state_statusZon_stack_statusZon_logrår5rrÆÚprintr
Zno_guir€r9ÚgetrDrúr÷rørùÚKeyboardInterruptrÔÚcloseZ QApplicationÚinstancerkr˜rÌZshowZexec_ryrÑ)
rTZcfgrZsimrnrÕr?r0ZappZ  dashboardr3)rmrBr4ÚmainÀsœù
 €ÿÿ
 
ÿÿþÿø ÿý
 
 ü
r"Ú__main__)rrrr)rr)5riZ
__future__rr r$rr9Úsysr:ZpathlibrÚtypingrrrrZPyQt5rr    r
rÆZ serial.toolsr Z    protocolsr rrrrlrrrr r r›rrrrÚ__file__ZresolveÚparentrr5r6rLrJZ QMainWindowrkrr"rGÚexitr3r3r3r4Ú<module>sV   ÿ ÿ
3
Hÿ