forked from box2ai-robotics/lerobot-joycon2
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPAROL6_Architecture.drawio
More file actions
309 lines (258 loc) · 27.7 KB
/
Copy pathPAROL6_Architecture.drawio
File metadata and controls
309 lines (258 loc) · 27.7 KB
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
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
<mxfile host="app.diagrams.net" modified="2025-01-20T00:00:00.000Z" agent="5.0" version="21.6.5" type="device">
<diagram name="PAROL6架构图" id="parol6-arch">
<mxGraphModel dx="1434" dy="844" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1200" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<!-- 背景 -->
<mxCell id="bg" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#F5F5F5;strokeColor=none;" vertex="1" parent="1">
<mxGeometry width="1600" height="1200" as="geometry" />
</mxCell>
<!-- 标题 -->
<mxCell id="title" value="PAROL6 LeRobot & ROS2 集成架构" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=28;fontStyle=1;fontColor=#1A1A1A;" vertex="1" parent="1">
<mxGeometry x="400" y="20" width="800" height="40" as="geometry" />
</mxCell>
<!-- 第1层:应用层 -->
<mxCell id="app-layer-bg" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E3F2FD;strokeColor=#1976D2;strokeWidth=2;opacity=60;" vertex="1" parent="1">
<mxGeometry x="100" y="100" width="1400" height="180" as="geometry" />
</mxCell>
<mxCell id="app-layer-title" value="应用层 (LeRobot 工作流)" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=top;whiteSpace=wrap;rounded=0;fontSize=16;fontStyle=1;fontColor=#0D47A1;" vertex="1" parent="1">
<mxGeometry x="120" y="110" width="300" height="30" as="geometry" />
</mxCell>
<!-- 应用模块 -->
<mxCell id="app-teleoperate" value="<b>遥操作</b><br><br>文件: teleoperate.py<br>函数: main()<br><br>控制方式:<br>• Joycon 输入<br>• 键盘控制" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#1976D2;strokeColor=#0D47A1;strokeWidth=2;fontColor=#FFFFFF;fontSize=12;align=left;verticalAlign=top;spacingLeft=10;spacingTop=5;" vertex="1" parent="1">
<mxGeometry x="140" y="150" width="180" height="110" as="geometry" />
</mxCell>
<mxCell id="app-record" value="<b>数据采集</b><br><br>文件: record.py<br>函数: record_episode()<br><br>配置:<br>• episode_time_s: 30<br>• num_episodes: 50" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#1976D2;strokeColor=#0D47A1;strokeWidth=2;fontColor=#FFFFFF;fontSize=12;align=left;verticalAlign=top;spacingLeft=10;spacingTop=5;" vertex="1" parent="1">
<mxGeometry x="360" y="150" width="180" height="110" as="geometry" />
</mxCell>
<mxCell id="app-train" value="<b>模型训练</b><br><br>文件: train.py<br>函数: train()<br><br>配置:<br>• policy: smolvla_base<br>• batch_size: 8<br>• steps: 20000" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#1976D2;strokeColor=#0D47A1;strokeWidth=2;fontColor=#FFFFFF;fontSize=12;align=left;verticalAlign=top;spacingLeft=10;spacingTop=5;" vertex="1" parent="1">
<mxGeometry x="580" y="150" width="180" height="110" as="geometry" />
</mxCell>
<mxCell id="app-inference" value="<b>模型推理</b><br><br>文件: record.py<br>函数: inference()<br><br>配置:<br>• policy.path: checkpoint<br>• use_policy: true" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#1976D2;strokeColor=#0D47A1;strokeWidth=2;fontColor=#FFFFFF;fontSize=12;align=left;verticalAlign=top;spacingLeft=10;spacingTop=5;" vertex="1" parent="1">
<mxGeometry x="800" y="150" width="180" height="110" as="geometry" />
</mxCell>
<mxCell id="app-simulation" value="<b>仿真环境</b><br><br>文件: test_parol6_robosuite.py<br>函数: test_robosuite_basic()<br><br>环境:<br>• Robosuite (UR5e)<br>• 控制频率: 20Hz" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#43A047;strokeColor=#2E7D32;strokeWidth=2;fontColor=#FFFFFF;fontSize=12;align=left;verticalAlign=top;spacingLeft=10;spacingTop=5;" vertex="1" parent="1">
<mxGeometry x="1020" y="150" width="200" height="110" as="geometry" />
</mxCell>
<!-- 第2层:机器人接口层 -->
<mxCell id="robot-layer-bg" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF3E0;strokeColor=#E65100;strokeWidth=2;opacity=60;" vertex="1" parent="1">
<mxGeometry x="100" y="320" width="1400" height="220" as="geometry" />
</mxCell>
<mxCell id="robot-layer-title" value="机器人接口层 (PAROL6 类)" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=top;whiteSpace=wrap;rounded=0;fontSize=16;fontStyle=1;fontColor=#BF360C;" vertex="1" parent="1">
<mxGeometry x="120" y="330" width="350" height="30" as="geometry" />
</mxCell>
<!-- 机器人配置 -->
<mxCell id="robot-config" value="<b>PAROL6 配置</b><br><br>文件: config_parol6.py<br>类: Parol6Config<br><br>参数:<br>• port: /dev/ttyUSB0<br>• baudrate: 115200<br>• use_ros2_bridge: bool<br>• max_relative_target: 0.5<br>• control_frequency: 100Hz<br>• joint_limits: dict<br>• enable_position_filter: true<br>• position_filter_coeff: 0.8" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FF6F00;strokeColor=#E65100;strokeWidth=2;fontColor=#FFFFFF;fontSize=11;align=left;verticalAlign=top;spacingLeft=10;spacingTop=5;" vertex="1" parent="1">
<mxGeometry x="140" y="370" width="260" height="150" as="geometry" />
</mxCell>
<!-- 机器人控制 -->
<mxCell id="robot-control" value="<b>PAROL6 机器人类</b><br><br>文件: parol6.py<br>类: Parol6<br><br>主要函数:<br>• connect() - 初始化连接<br>• disconnect() - 关闭连接<br>• get_observation() - 读取状态<br>• send_action() - 发送命令<br>• calibrate() - 验证限制<br><br>特性:<br>• 6自由度关节控制<br>• 相机集成<br>• 安全限制<br>• 位置过滤" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FF6F00;strokeColor=#E65100;strokeWidth=2;fontColor=#FFFFFF;fontSize=11;align=left;verticalAlign=top;spacingLeft=10;spacingTop=5;" vertex="1" parent="1">
<mxGeometry x="440" y="370" width="280" height="150" as="geometry" />
</mxCell>
<!-- 关节配置 -->
<mxCell id="robot-joints" value="<b>关节配置</b><br><br>关节 (6自由度):<br>• shoulder_pan (肩部旋转)<br>• shoulder_lift (肩部抬升)<br>• elbow (肘关节)<br>• wrist_1 (腕关节1)<br>• wrist_2 (腕关节2)<br>• wrist_3 (腕关节3)<br><br>初始位置:<br>[0.0, -1.57, 1.57,<br> -1.57, -1.57, 0.0]" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#F57C00;strokeColor=#E65100;strokeWidth=2;fontColor=#FFFFFF;fontSize=11;align=left;verticalAlign=top;spacingLeft=10;spacingTop=5;" vertex="1" parent="1">
<mxGeometry x="760" y="370" width="200" height="150" as="geometry" />
</mxCell>
<!-- 相机集成 -->
<mxCell id="robot-camera" value="<b>相机集成</b><br><br>文件: cameras/opencv.py<br><br>配置:<br>• type: opencv<br>• width: 640<br>• height: 480<br>• fps: 30<br><br>函数:<br>• async_read()<br>• connect()<br>• disconnect()" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#F57C00;strokeColor=#E65100;strokeWidth=2;fontColor=#FFFFFF;fontSize=11;align=left;verticalAlign=top;spacingLeft=10;spacingTop=5;" vertex="1" parent="1">
<mxGeometry x="1000" y="370" width="200" height="150" as="geometry" />
</mxCell>
<!-- 安全功能 -->
<mxCell id="robot-safety" value="<b>安全功能</b><br><br>文件: utils.py<br>函数:<br>ensure_safe_goal_position()<br><br>检查项:<br>• 关节限制<br>• 最大相对目标<br>• 位置裁剪<br>• 速度限制" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#F57C00;strokeColor=#E65100;strokeWidth=2;fontColor=#FFFFFF;fontSize=11;align=left;verticalAlign=top;spacingLeft=10;spacingTop=5;" vertex="1" parent="1">
<mxGeometry x="1240" y="370" width="220" height="150" as="geometry" />
</mxCell>
<!-- 第3层:通信层 -->
<mxCell id="comm-layer-bg" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#F3E5F5;strokeColor=#6A1B9A;strokeWidth=2;opacity=60;" vertex="1" parent="1">
<mxGeometry x="100" y="580" width="1400" height="200" as="geometry" />
</mxCell>
<mxCell id="comm-layer-title" value="通信层" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=top;whiteSpace=wrap;rounded=0;fontSize=16;fontStyle=1;fontColor=#4A148C;" vertex="1" parent="1">
<mxGeometry x="120" y="590" width="250" height="30" as="geometry" />
</mxCell>
<!-- 串口通信 -->
<mxCell id="comm-serial" value="<b>串口通信</b><br><br>库: pyserial<br><br>配置:<br>• 端口: /dev/ttyUSB0<br>• 波特率: 115200<br>• 超时: 1.0s<br><br>协议:<br>• 命令: MOVE,j0,j1,...,j5<br>• 响应: OK/ERROR<br><br>函数:<br>• _send_joint_positions()<br>• _read_joint_positions()" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#7B1FA2;strokeColor=#4A148C;strokeWidth=2;fontColor=#FFFFFF;fontSize=11;align=left;verticalAlign=top;spacingLeft=10;spacingTop=5;" vertex="1" parent="1">
<mxGeometry x="180" y="630" width="260" height="130" as="geometry" />
</mxCell>
<!-- ROS2 桥接 -->
<mxCell id="comm-ros2-bridge" value="<b>ROS2 桥接</b><br><br>文件: parol6_ros2_bridge.py<br>类: Parol6ROS2Bridge<br><br>配置:<br>• namespace: /parol6<br>• control_frequency: 100Hz<br><br>函数:<br>• connect() - 初始化ROS2<br>• disconnect() - 关闭<br>• send_joint_positions(pos)<br>• get_joint_positions() → np.array<br>• get_joint_velocities() → np.array<br>• _joint_state_callback(pos, vel)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#7B1FA2;strokeColor=#4A148C;strokeWidth=2;fontColor=#FFFFFF;fontSize=11;align=left;verticalAlign=top;spacingLeft=10;spacingTop=5;" vertex="1" parent="1">
<mxGeometry x="520" y="630" width="300" height="130" as="geometry" />
</mxCell>
<!-- ROS2 节点 -->
<mxCell id="comm-ros2-node" value="<b>ROS2 节点</b><br><br>文件: parol6_ros2_node.py<br>类: Parol6ROS2Node<br><br>发布话题:<br>• /parol6/joint_states<br> (sensor_msgs/JointState)<br>• /parol6/joint_trajectory_controller/state<br> (control_msgs/JointTrajectoryControllerState)<br><br>订阅话题:<br>• /parol6/joint_trajectory_controller/joint_trajectory<br> (trajectory_msgs/JointTrajectory)<br>• /parol6/joint_commands<br> (sensor_msgs/JointState)<br><br>函数:<br>• publish_joint_state()<br>• joint_command_callback(msg)<br>• publish_controller_state()" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#7B1FA2;strokeColor=#4A148C;strokeWidth=2;fontColor=#FFFFFF;fontSize=11;align=left;verticalAlign=top;spacingLeft=10;spacingTop=5;" vertex="1" parent="1">
<mxGeometry x="900" y="630" width="380" height="130" as="geometry" />
</mxCell>
<!-- 第4层:硬件/仿真层 -->
<mxCell id="hw-layer-bg" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E9;strokeColor=#2E7D32;strokeWidth=2;opacity=60;" vertex="1" parent="1">
<mxGeometry x="100" y="820" width="1400" height="160" as="geometry" />
</mxCell>
<mxCell id="hw-layer-title" value="硬件与仿真层" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=top;whiteSpace=wrap;rounded=0;fontSize=16;fontStyle=1;fontColor=#1B5E20;" vertex="1" parent="1">
<mxGeometry x="120" y="830" width="300" height="30" as="geometry" />
</mxCell>
<!-- 硬件 -->
<mxCell id="hw-parol6" value="<b>PAROL6 硬件</b><br><br>规格:<br>• 自由度: 6 (类似 UR5)<br>• 最大速度: 3.15 rad/s<br>• 最大加速度: 10 rad/s²<br>• 通信方式: USB/串口<br><br>关节:<br>• 所有关节: ±180° 范围<br>• 位置控制模式<br><br>接口:<br>• 串口: /dev/ttyUSB0<br>• 波特率: 115200" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#43A047;strokeColor=#2E7D32;strokeWidth=2;fontColor=#FFFFFF;fontSize=11;align=left;verticalAlign=top;spacingLeft=10;spacingTop=5;" vertex="1" parent="1">
<mxGeometry x="200" y="870" width="300" height="90" as="geometry" />
</mxCell>
<!-- Robosuite -->
<mxCell id="hw-robosuite" value="<b>Robosuite 仿真</b><br><br>文件: test_parol6_robosuite.py<br><br>配置:<br>• env_name: Lift, Stack 等<br>• robots: UR5e (PAROL6代理)<br>• control_freq: 20Hz<br>• has_renderer: true<br><br>函数:<br>• test_robosuite_basic()<br>• test_parol6_robosuite_integration()<br>• test_robosuite_teleoperation()" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#43A047;strokeColor=#2E7D32;strokeWidth=2;fontColor=#FFFFFF;fontSize=11;align=left;verticalAlign=top;spacingLeft=10;spacingTop=5;" vertex="1" parent="1">
<mxGeometry x="580" y="870" width="380" height="90" as="geometry" />
</mxCell>
<!-- 脚本 -->
<mxCell id="hw-scripts" value="<b>启动脚本</b><br><br>文件:<br>• scripts/parol6/start_parol6_ros2.sh<br>• ros2_adapter/launch/parol6_bringup.launch.py<br><br>测试:<br>• scripts/parol6/test_parol6_lerobot.py<br>• tests/parol6/test_ros2_integration.py<br><br>示例:<br>• examples/parol6_example.py" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#66BB6A;strokeColor=#2E7D32;strokeWidth=2;fontColor=#FFFFFF;fontSize=11;align=left;verticalAlign=top;spacingLeft=10;spacingTop=5;" vertex="1" parent="1">
<mxGeometry x="1040" y="870" width="380" height="90" as="geometry" />
</mxCell>
<!-- 箭头:应用 -> 机器人 -->
<mxCell id="arrow-app-robot1" value="" style="endArrow=classic;html=1;strokeColor=#1976D2;strokeWidth=3;exitX=0.5;exitY=1;entryX=0.167;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;edgeStyle=orthogonalEdgeStyle;curved=1;" edge="1" parent="1" source="app-teleoperate" target="robot-control">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="700" y="500" as="sourcePoint" />
<mxPoint x="750" y="450" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="arrow-app-robot2" value="" style="endArrow=classic;html=1;strokeColor=#1976D2;strokeWidth=3;exitX=0.5;exitY=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;edgeStyle=orthogonalEdgeStyle;curved=1;" edge="1" parent="1" source="app-record" target="robot-control">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="700" y="500" as="sourcePoint" />
<mxPoint x="750" y="450" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="arrow-app-robot3" value="" style="endArrow=classic;html=1;strokeColor=#1976D2;strokeWidth=3;exitX=0.5;exitY=1;entryX=0.833;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;edgeStyle=orthogonalEdgeStyle;curved=1;" edge="1" parent="1" source="app-inference" target="robot-control">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="700" y="500" as="sourcePoint" />
<mxPoint x="750" y="450" as="targetPoint" />
</mxGeometry>
</mxCell>
<!-- 箭头:仿真 -> 机器人 -->
<mxCell id="arrow-sim-robot" value="测试验证" style="endArrow=classic;html=1;strokeColor=#43A047;strokeWidth=3;exitX=0;exitY=0.75;entryX=1;entryY=0.25;entryDx=0;entryDy=0;edgeStyle=orthogonalEdgeStyle;curved=1;labelBackgroundColor=#FFFFFF;fontColor=#2E7D32;fontSize=12;fontStyle=1;" edge="1" parent="1" source="app-simulation" target="robot-control">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="700" y="500" as="sourcePoint" />
<mxPoint x="750" y="450" as="targetPoint" />
<Array as="points">
<mxPoint x="900" y="233" />
<mxPoint x="900" y="408" />
</Array>
</mxGeometry>
</mxCell>
<!-- 箭头:机器人 -> 配置 -->
<mxCell id="arrow-robot-config" value="使用" style="endArrow=classic;html=1;strokeColor=#FF6F00;strokeWidth=2;exitX=0;exitY=0.5;entryX=1;entryY=0.5;entryDx=0;entryDy=0;dashed=1;labelBackgroundColor=#FFFFFF;fontColor=#E65100;fontSize=11;" edge="1" parent="1" source="robot-control" target="robot-config">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="700" y="500" as="sourcePoint" />
<mxPoint x="750" y="450" as="targetPoint" />
</mxGeometry>
</mxCell>
<!-- 箭头:机器人 -> 关节 -->
<mxCell id="arrow-robot-joints" value="控制" style="endArrow=classic;html=1;strokeColor=#FF6F00;strokeWidth=2;exitX=1;exitY=0.5;entryX=0;entryY=0.5;entryDx=0;entryDy=0;dashed=1;labelBackgroundColor=#FFFFFF;fontColor=#E65100;fontSize=11;" edge="1" parent="1" source="robot-control" target="robot-joints">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="700" y="500" as="sourcePoint" />
<mxPoint x="750" y="450" as="targetPoint" />
</mxGeometry>
</mxCell>
<!-- 箭头:机器人 -> 相机 -->
<mxCell id="arrow-robot-camera" value="读取" style="endArrow=classic;html=1;strokeColor=#FF6F00;strokeWidth=2;exitX=0.857;exitY=1;entryX=0;entryY=0;entryDx=0;entryDy=0;edgeStyle=orthogonalEdgeStyle;curved=1;labelBackgroundColor=#FFFFFF;fontColor=#E65100;fontSize=11;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="robot-control" target="robot-camera">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="700" y="500" as="sourcePoint" />
<mxPoint x="750" y="450" as="targetPoint" />
<Array as="points">
<mxPoint x="680" y="550" />
<mxPoint x="1000" y="550" />
</Array>
</mxGeometry>
</mxCell>
<!-- 箭头:机器人 -> 安全 -->
<mxCell id="arrow-robot-safety" value="验证" style="endArrow=classic;html=1;strokeColor=#FF6F00;strokeWidth=2;exitX=1;exitY=0.75;entryX=0;entryY=0.25;entryDx=0;entryDy=0;edgeStyle=orthogonalEdgeStyle;curved=1;labelBackgroundColor=#FFFFFF;fontColor=#E65100;fontSize=11;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="robot-control" target="robot-safety">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="700" y="500" as="sourcePoint" />
<mxPoint x="750" y="450" as="targetPoint" />
<Array as="points">
<mxPoint x="1100" y="483" />
<mxPoint x="1100" y="408" />
</Array>
</mxGeometry>
</mxCell>
<!-- 箭头:机器人 -> 通信 -->
<mxCell id="arrow-robot-serial" value="串口模式" style="endArrow=classic;html=1;strokeColor=#7B1FA2;strokeWidth=3;exitX=0.25;exitY=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;edgeStyle=orthogonalEdgeStyle;curved=1;labelBackgroundColor=#FFFFFF;fontColor=#4A148C;fontSize=12;fontStyle=1;" edge="1" parent="1" source="robot-control" target="comm-serial">
<mxGeometry x="-0.2" width="50" height="50" relative="1" as="geometry">
<mxPoint x="700" y="500" as="sourcePoint" />
<mxPoint x="750" y="450" as="targetPoint" />
<Array as="points">
<mxPoint x="510" y="580" />
<mxPoint x="310" y="580" />
</Array>
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="arrow-robot-ros2" value="ROS2模式" style="endArrow=classic;html=1;strokeColor=#7B1FA2;strokeWidth=3;exitX=0.75;exitY=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;edgeStyle=orthogonalEdgeStyle;curved=1;labelBackgroundColor=#FFFFFF;fontColor=#4A148C;fontSize=12;fontStyle=1;" edge="1" parent="1" source="robot-control" target="comm-ros2-bridge">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="700" y="500" as="sourcePoint" />
<mxPoint x="750" y="450" as="targetPoint" />
<Array as="points">
<mxPoint x="650" y="580" />
<mxPoint x="670" y="580" />
</Array>
</mxGeometry>
</mxCell>
<!-- 箭头:ROS2桥接 -> 节点 -->
<mxCell id="arrow-bridge-node" value="使用" style="endArrow=classic;html=1;strokeColor=#7B1FA2;strokeWidth=2;exitX=1;exitY=0.5;entryX=0;entryY=0.5;entryDx=0;entryDy=0;labelBackgroundColor=#FFFFFF;fontColor=#4A148C;fontSize=11;" edge="1" parent="1" source="comm-ros2-bridge" target="comm-ros2-node">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="700" y="700" as="sourcePoint" />
<mxPoint x="750" y="650" as="targetPoint" />
</mxGeometry>
</mxCell>
<!-- 箭头:通信 -> 硬件 -->
<mxCell id="arrow-serial-hw" value="USB/串口" style="endArrow=classic;html=1;strokeColor=#43A047;strokeWidth=3;exitX=0.5;exitY=1;entryX=0.25;entryY=0;entryDx=0;entryDy=0;edgeStyle=orthogonalEdgeStyle;labelBackgroundColor=#FFFFFF;fontColor=#2E7D32;fontSize=12;fontStyle=1;" edge="1" parent="1" source="comm-serial" target="hw-parol6">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="700" y="900" as="sourcePoint" />
<mxPoint x="750" y="850" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="arrow-ros2-hw" value="ROS2话题" style="endArrow=classic;html=1;strokeColor=#43A047;strokeWidth=3;exitX=0.25;exitY=1;entryX=0.75;entryY=0;entryDx=0;entryDy=0;edgeStyle=orthogonalEdgeStyle;labelBackgroundColor=#FFFFFF;fontColor=#2E7D32;fontSize=12;fontStyle=1;" edge="1" parent="1" source="comm-ros2-node" target="hw-parol6">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="700" y="900" as="sourcePoint" />
<mxPoint x="750" y="850" as="targetPoint" />
<Array as="points">
<mxPoint x="995" y="800" />
<mxPoint x="425" y="800" />
</Array>
</mxGeometry>
</mxCell>
<!-- 箭头:Robosuite连接 -->
<mxCell id="arrow-sim-robosuite" value="测试环境" style="endArrow=classic;html=1;strokeColor=#43A047;strokeWidth=3;exitX=0.75;exitY=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;edgeStyle=orthogonalEdgeStyle;labelBackgroundColor=#FFFFFF;fontColor=#2E7D32;fontSize=12;fontStyle=1;" edge="1" parent="1" source="comm-ros2-node" target="hw-robosuite">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="700" y="900" as="sourcePoint" />
<mxPoint x="750" y="850" as="targetPoint" />
</mxGeometry>
</mxCell>
<!-- 图例 -->
<mxCell id="legend-bg" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#424242;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="100" y="1020" width="1400" height="150" as="geometry" />
</mxCell>
<mxCell id="legend-title" value="图例与关键信息" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=top;whiteSpace=wrap;rounded=0;fontSize=16;fontStyle=1;fontColor=#1A1A1A;" vertex="1" parent="1">
<mxGeometry x="120" y="1030" width="250" height="30" as="geometry" />
</mxCell>
<!-- 图例项 -->
<mxCell id="legend-app" value="应用层" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#1976D2;strokeColor=#0D47A1;strokeWidth=2;fontColor=#FFFFFF;fontSize=11;" vertex="1" parent="1">
<mxGeometry x="140" y="1070" width="150" height="30" as="geometry" />
</mxCell>
<mxCell id="legend-robot" value="机器人接口层" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FF6F00;strokeColor=#E65100;strokeWidth=2;fontColor=#FFFFFF;fontSize=11;" vertex="1" parent="1">
<mxGeometry x="310" y="1070" width="150" height="30" as="geometry" />
</mxCell>
<mxCell id="legend-comm" value="通信层" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#7B1FA2;strokeColor=#4A148C;strokeWidth=2;fontColor=#FFFFFF;fontSize=11;" vertex="1" parent="1">
<mxGeometry x="480" y="1070" width="150" height="30" as="geometry" />
</mxCell>
<mxCell id="legend-hw" value="硬件/仿真层" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#43A047;strokeColor=#2E7D32;strokeWidth=2;fontColor=#FFFFFF;fontSize=11;" vertex="1" parent="1">
<mxGeometry x="650" y="1070" width="150" height="30" as="geometry" />
</mxCell>
<!-- 关键特性 -->
<mxCell id="key-features" value="<b>主要特性:</b><br>• 6自由度关节控制 (类似 UR5)<br>• 双模式通信: 串口和ROS2<br>• 安全功能: 关节限制、位置过滤<br>• 控制频率: 100Hz<br>• 相机集成支持" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=top;whiteSpace=wrap;rounded=0;fontSize=12;fontColor=#1A1A1A;" vertex="1" parent="1">
<mxGeometry x="140" y="1110" width="300" height="50" as="geometry" />
</mxCell>
<mxCell id="key-files" value="<b>重要文件:</b><br>• lerobot/common/robots/parol6/parol6.py<br>• ros2_adapter/parol6_adapter/parol6_ros2_bridge.py<br>• ros2_adapter/parol6_adapter/parol6_ros2_node.py<br>• tests/parol6/test_parol6_robosuite.py" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=top;whiteSpace=wrap;rounded=0;fontSize=11;fontColor=#1A1A1A;" vertex="1" parent="1">
<mxGeometry x="480" y="1110" width="400" height="50" as="geometry" />
</mxCell>
<mxCell id="key-config" value="<b>关键配置:</b><br>• 端口: /dev/ttyUSB0<br>• 波特率: 115200<br>• ROS2命名空间: /parol6<br>• 最大相对目标: 0.5" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=top;whiteSpace=wrap;rounded=0;fontSize=11;fontColor=#1A1A1A;" vertex="1" parent="1">
<mxGeometry x="920" y="1110" width="250" height="50" as="geometry" />
</mxCell>
<mxCell id="key-tests" value="<b>测试命令:</b><br>python tests/parol6/test_parol6_robosuite.py --test all<br>python tests/parol6/test_ros2_integration.py --test all<br>python examples/parol6_example.py --example basic" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=top;whiteSpace=wrap;rounded=0;fontSize=10;fontColor=#1A1A1A;" vertex="1" parent="1">
<mxGeometry x="1200" y="1110" width="280" height="50" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>