codroid-robot-sdk 2.1.0__tar.gz → 2.1.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- codroid_robot_sdk-2.1.2/.claude/settings.local.json +11 -0
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/.gitignore +2 -3
- codroid_robot_sdk-2.1.2/CHANGELOG.md +65 -0
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/PKG-INFO +38 -6
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/README.md +37 -5
- codroid_robot_sdk-2.1.2/docs/01-quick-start.md +160 -0
- codroid_robot_sdk-2.1.2/docs/02-concepts.md +167 -0
- codroid_robot_sdk-2.1.2/docs/03-api-reference-codroidclient.md +945 -0
- codroid_robot_sdk-2.1.2/docs/04-api-reference-motion.md +324 -0
- codroid_robot_sdk-2.1.2/docs/05-api-reference-types.md +397 -0
- codroid_robot_sdk-2.1.2/docs/06-api-reference-cri.md +321 -0
- codroid_robot_sdk-2.1.2/docs/07-api-reference-io-register.md +247 -0
- codroid_robot_sdk-2.1.2/docs/08-api-reference-utilities.md +321 -0
- codroid_robot_sdk-2.1.2/docs/CodroidPython-SDK-Manual-v2.1.2-en.md +2939 -0
- codroid_robot_sdk-2.1.2/docs/CodroidPython-SDK-Manual-v2.1.2-en.pdf +0 -0
- codroid_robot_sdk-2.1.2/docs/CodroidPython-SDK-Manual-v2.1.2-zh.md +2938 -0
- codroid_robot_sdk-2.1.2/docs/CodroidPython-SDK-Manual-v2.1.2-zh.pdf +0 -0
- codroid_robot_sdk-2.1.2/docs/README.md +74 -0
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/examples/01_basic_usage.py +4 -4
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/examples/02_run_script.py +31 -3
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/examples/03_run_project.py +7 -7
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/examples/04_global_value.py +2 -2
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/examples/05_rs485.py +5 -5
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/examples/06_jog_mode.py +6 -6
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/examples/07_move_to.py +22 -7
- codroid_robot_sdk-2.1.2/examples/08_move.py +186 -0
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/examples/09_move_path.py +2 -2
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/examples/10_control_commands.py +7 -7
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/examples/11_io_demo.py +6 -6
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/examples/12_register_demo.py +5 -5
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/examples/13_cri_realtime.py +3 -3
- codroid_robot_sdk-2.1.2/examples/14_robot_parameters.py +202 -0
- codroid_robot_sdk-2.1.2/examples/15_sync_motion.py +138 -0
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/examples/codroid_cri_test.py +21 -21
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/examples/codroid_test.py +55 -33
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/pyproject.toml +0 -15
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/src/codroid/Codroid.py +579 -255
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/src/codroid/__about__.py +1 -1
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/src/codroid/__init__.py +5 -1
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/src/codroid/client.py +0 -8
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/src/codroid/cri_realtime_dispatcher.py +3 -5
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/src/codroid/define.py +32 -8
- codroid_robot_sdk-2.1.2/src/codroid/robot_settings.py +243 -0
- codroid_robot_sdk-2.1.0/CHANGELOG.md +0 -30
- codroid_robot_sdk-2.1.0/examples/08_move.py +0 -124
- codroid_robot_sdk-2.1.0/mkdocs.yml +0 -34
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/LICENSE.txt +0 -0
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/src/codroid/async_tcp_client.py +0 -0
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/src/codroid/console.py +0 -0
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/src/codroid/console_utf8.py +0 -0
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/src/codroid/cri_realtime_packet_parser.py +0 -0
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/src/codroid/exceptions.py +0 -0
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/src/codroid/publish.py +0 -0
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/src/codroid/py.typed +0 -0
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/src/codroid/robot_motion.py +0 -0
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/src/codroid/trajectory.py +0 -0
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/src/codroid/types.py +0 -0
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/src/codroid/utils.py +0 -0
- {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/update1.md +0 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 2.1.2 — 阻塞式运动 API / RunScript 完整参数 / StopMoveTo
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- **阻塞式运动 API**(对齐 C# `*Sync` 方法):
|
|
8
|
+
- `MoveSync`、`MovJSync`、`MovLSync`、`MovCSync`、`MovCircleSync`
|
|
9
|
+
- `MotionWaitOptions`:可配置超时、轮询间隔、CRI 过期判定、稳定采样数、关节/笛卡尔容差
|
|
10
|
+
- 内部 CRI 新鲜度追踪(`_last_cri_received_utc`)
|
|
11
|
+
- **`RunScript` 完整参数**:新增 `sub_threads`、`sub_programs`、`interrupts` 可选字典参数(对齐 C# `RunScript(main, subThreads, subPrograms, interrupts, vars)`)
|
|
12
|
+
- **`StopMoveTo()`**:发送 `type=-1` 停止 MoveTo 运动
|
|
13
|
+
- `MoveToType.STOP = -1` 枚举值
|
|
14
|
+
- 更新示例:`08_move.py` 增加 Sync 阻塞运动演示;`02_run_script.py` 增加子线程/子程序/中断演示;`07_move_to.py` 增加 StopMoveTo 演示
|
|
15
|
+
|
|
16
|
+
## 2.1.1 — 机器人设置 API(协议 19.x)
|
|
17
|
+
|
|
18
|
+
### Added
|
|
19
|
+
|
|
20
|
+
- `robot_settings.py`:`RobotFrame`、`RobotPayloadFrame`、`RobotParameters`
|
|
21
|
+
- `SetCollisionSensitivity`、`GetRobotParameters`
|
|
22
|
+
- 仅改默认编号:`SetDefaultPayloadId`、`SetDefaultToolId`、`SetDefaultUserCoordinateId`
|
|
23
|
+
- 先读后改:`SetToolFrame`、`SetPayloadFrame`、`SetUserCoordinateFrame`
|
|
24
|
+
- 整表下发:`SaveToolFrames`、`SavePayloadFrames`、`SaveUserCoordinateFrames`
|
|
25
|
+
- 示例:`examples/14_robot_parameters.py`;`codroid_test.py robotparam`;`examples/08_move.py` 四组合 + MovC
|
|
26
|
+
|
|
27
|
+
### Changed / Breaking
|
|
28
|
+
|
|
29
|
+
- 运动门面仅保留 C# 同名:`MovJ`、`MovL`、`MovC`、`MovCircle`、`Move`、`MoveTo`、`MoveToHeartbeat`
|
|
30
|
+
- 移除 `move_j` / `move_l` / `move_c` / `move_circle` / `execute_path` / `move` / `move_to` / `move_to_heartbeat`
|
|
31
|
+
- `MoveTarget` 更名为 `MoveToTarget`(与 C# 一致);`MotionPath.mov_*` 更名为 `MovJ` / `MovL` / `MovC`
|
|
32
|
+
- **`CodroidSession` / `CodroidClient` 全部公开方法改为 PascalCase**(`Connect`、`SwitchOn`、`GetDi`、`StartCriDataPush` 等);移除文件末尾历史 snake_case 别名
|
|
33
|
+
- `get_cri_data()` 改为属性 **`CriData`**(对齐 C#)
|
|
34
|
+
- `close` / `disconnect` 合并为 **`Disconnect`**
|
|
35
|
+
- `CriRealtimeDispatcher.send_command` → **`SendCommand`**,`send_trajectory` → **`SendTrajectory`**
|
|
36
|
+
- 移除 `subscribe_publish_topic` 别名
|
|
37
|
+
|
|
38
|
+
## 2.1.0 — 运动 API 类型化(Breaking)
|
|
39
|
+
|
|
40
|
+
与 C++ SDK v2.1.1 / `update1.md` 对齐。
|
|
41
|
+
|
|
42
|
+
### Added
|
|
43
|
+
|
|
44
|
+
- `JointPoint`、`CartesianPoint`、`MoveInstruction` 及工厂(`Degrees`、`MmDeg`、`MmDegWithRef`、`MovJ`/`MovL`/…)
|
|
45
|
+
- `pack_move_point` / `pack_instruction`(`jp` 优先;笛卡尔缺省 `rj=[20,…,20]`)
|
|
46
|
+
- 门面 API:`MovJ`、`MovL`、`MovC`、`MovCircle`、`Move`、`MoveTo`、`MoveToHeartbeat`
|
|
47
|
+
- `MoveToTarget.Joint` / `MoveToTarget.Cartesian`
|
|
48
|
+
- `InitConsoleUtf8()`(Windows 控制台 UTF-8)
|
|
49
|
+
|
|
50
|
+
### Changed
|
|
51
|
+
|
|
52
|
+
- `MovePoint.to_dict()` 经统一打包逻辑,仅 `cp` 时 JSON 会带默认 `rj`
|
|
53
|
+
- 示例与 `codroid_test` 运动段改用类型化 API
|
|
54
|
+
|
|
55
|
+
### Deprecated
|
|
56
|
+
|
|
57
|
+
- 旧版 snake_case 运动方法(2.1.1 起已删除,见 2.1.1 Breaking)
|
|
58
|
+
- 直接 `MovePoint(jp=…)` 作业务目标(请改用 `JointPoint` / `CartesianPoint`)
|
|
59
|
+
|
|
60
|
+
### Migration
|
|
61
|
+
|
|
62
|
+
1. 程序入口首行:`InitConsoleUtf8()`
|
|
63
|
+
2. 关节目标 → `JointPoint.Degrees([...])` + `MovJ` / `MoveInstruction.MovJ`
|
|
64
|
+
3. TCP 目标 → `CartesianPoint.MmDeg` 或 `MmDegWithRef(pose, cri_joint)`
|
|
65
|
+
4. 多段路径 → `Move([MoveInstruction.MovJ(...), ...])`
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: codroid-robot-sdk
|
|
3
|
-
Version: 2.1.
|
|
3
|
+
Version: 2.1.2
|
|
4
4
|
Summary: Codroid robot controller Python SDK (TCP/CRI, typed motion API)
|
|
5
5
|
Project-URL: Documentation, https://guybod.github.io/CodroidSDK/
|
|
6
6
|
Project-URL: Issues, https://github.com/guybod/CodroidSDK/issues
|
|
@@ -71,8 +71,8 @@ InitConsoleUtf8() # Windows cmd 下中文日志不乱码;Linux 上为 no-op
|
|
|
71
71
|
ROBOT_IP = "192.168.1.136" # 改成实际控制器 IP
|
|
72
72
|
|
|
73
73
|
with CodroidControlInterface(host=ROBOT_IP) as robot:
|
|
74
|
-
robot.
|
|
75
|
-
robot.
|
|
74
|
+
robot.ToRemote()
|
|
75
|
+
robot.SwitchOn()
|
|
76
76
|
```
|
|
77
77
|
|
|
78
78
|
运行:
|
|
@@ -102,6 +102,10 @@ python3 demo.py
|
|
|
102
102
|
| `MovJ(target, speed, acceleration)` | 目标:`JointPoint` 或 `CartesianPoint` |
|
|
103
103
|
| `MovL(target, speed, acceleration)` | 目标:`CartesianPoint` 或 `JointPoint` |
|
|
104
104
|
| `Move([MoveInstruction.MovJ(...), ...])` | 多段路径 |
|
|
105
|
+
| `MovJSync(target, speed, acc, wait?)` | 阻塞式关节运动,等待到达目标 |
|
|
106
|
+
| `MovLSync(target, speed, acc, wait?)` | 阻塞式直线运动,等待到达目标 |
|
|
107
|
+
| `MovCSync(middle, target, speed, acc, wait?)` | 阻塞式圆弧运动 |
|
|
108
|
+
| `MoveSync(instructions, wait?)` | 阻塞式路径执行 |
|
|
105
109
|
|
|
106
110
|
四组合路径示例(与 C++ `04_move` 一致):
|
|
107
111
|
|
|
@@ -127,7 +131,30 @@ robot.Move(path)
|
|
|
127
131
|
|
|
128
132
|
打包规则:`jp` 优先;仅 `cp` 时若未提供 `rj`,JSON 中带默认 `[20,20,20,20,20,20]`(度)。
|
|
129
133
|
|
|
130
|
-
|
|
134
|
+
### 阻塞式运动 API
|
|
135
|
+
|
|
136
|
+
`*Sync` 方法发送运动指令后自动轮询 CRI 数据,直到机器人稳定到达目标。需要先启动 CRI 数据推送(`StartListenUdp`)。
|
|
137
|
+
|
|
138
|
+
```python
|
|
139
|
+
from codroid import CodroidClient, JointPoint, MotionWaitOptions
|
|
140
|
+
|
|
141
|
+
with CodroidClient(host="192.168.1.136") as robot:
|
|
142
|
+
robot.ConnectRemoteAndSwitchOn()
|
|
143
|
+
robot.StartListenUdp()
|
|
144
|
+
robot.WaitForCriData() # 等待第一个 CRI 包到达
|
|
145
|
+
|
|
146
|
+
# 阻塞式关节运动,使用默认等待参数
|
|
147
|
+
robot.MovJSync(JointPoint.Degrees([0, 0, 90, 0, 90, 0]), speed=40, acceleration=100)
|
|
148
|
+
|
|
149
|
+
# 自定义等待参数
|
|
150
|
+
opts = MotionWaitOptions(timeout=30.0, joint_tolerance_deg=0.5)
|
|
151
|
+
robot.MovLSync(CartesianPoint.MmDeg([400, 200, 500, 180, 0, 90]),
|
|
152
|
+
speed=150, acceleration=500, wait=opts)
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
`MotionWaitOptions` 可调整超时、轮询间隔、到达容差等参数。
|
|
156
|
+
|
|
157
|
+
**Breaking(2.1.1)**:公开 API 与 C# 一致,统一 **PascalCase**(`Connect`、`SwitchOn`、`GetDi`、`MovJ`、`SetToolFrame` 等);`CriData` 为属性;`move_j` / `switch_on` 等 snake_case 已移除。见 [CHANGELOG.md](CHANGELOG.md)。
|
|
131
158
|
|
|
132
159
|
## Windows 控制台 UTF-8
|
|
133
160
|
|
|
@@ -151,18 +178,23 @@ from codroid import CodroidClient, InitConsoleUtf8
|
|
|
151
178
|
InitConsoleUtf8()
|
|
152
179
|
|
|
153
180
|
with CodroidClient(host="192.168.1.136") as robot:
|
|
154
|
-
robot.
|
|
155
|
-
robot.
|
|
181
|
+
robot.ToRemote()
|
|
182
|
+
robot.SwitchOn()
|
|
156
183
|
```
|
|
157
184
|
|
|
158
185
|
## 示例
|
|
159
186
|
|
|
160
187
|
```bash
|
|
161
188
|
PYTHONPATH=src python examples/08_move.py --robot 192.168.8.136
|
|
189
|
+
PYTHONPATH=src python examples/15_sync_motion.py --robot 192.168.8.136
|
|
190
|
+
PYTHONPATH=src python examples/14_robot_parameters.py --robot 192.168.8.136
|
|
162
191
|
PYTHONPATH=src python examples/codroid_test.py motion
|
|
163
192
|
PYTHONPATH=src python examples/codroid_test.py s20
|
|
193
|
+
PYTHONPATH=src python examples/codroid_test.py robotparam
|
|
164
194
|
```
|
|
165
195
|
|
|
196
|
+
机器人设置(协议 19.x):`GetRobotParameters`、`SetToolFrame`、`SetDefaultToolId` 等见 `examples/14_robot_parameters.py`。
|
|
197
|
+
|
|
166
198
|
寄存器与 S20 运动常量见仓库根目录 `AGENTS.md` §5.1。
|
|
167
199
|
|
|
168
200
|
## 常见问题
|
|
@@ -44,8 +44,8 @@ InitConsoleUtf8() # Windows cmd 下中文日志不乱码;Linux 上为 no-op
|
|
|
44
44
|
ROBOT_IP = "192.168.1.136" # 改成实际控制器 IP
|
|
45
45
|
|
|
46
46
|
with CodroidControlInterface(host=ROBOT_IP) as robot:
|
|
47
|
-
robot.
|
|
48
|
-
robot.
|
|
47
|
+
robot.ToRemote()
|
|
48
|
+
robot.SwitchOn()
|
|
49
49
|
```
|
|
50
50
|
|
|
51
51
|
运行:
|
|
@@ -75,6 +75,10 @@ python3 demo.py
|
|
|
75
75
|
| `MovJ(target, speed, acceleration)` | 目标:`JointPoint` 或 `CartesianPoint` |
|
|
76
76
|
| `MovL(target, speed, acceleration)` | 目标:`CartesianPoint` 或 `JointPoint` |
|
|
77
77
|
| `Move([MoveInstruction.MovJ(...), ...])` | 多段路径 |
|
|
78
|
+
| `MovJSync(target, speed, acc, wait?)` | 阻塞式关节运动,等待到达目标 |
|
|
79
|
+
| `MovLSync(target, speed, acc, wait?)` | 阻塞式直线运动,等待到达目标 |
|
|
80
|
+
| `MovCSync(middle, target, speed, acc, wait?)` | 阻塞式圆弧运动 |
|
|
81
|
+
| `MoveSync(instructions, wait?)` | 阻塞式路径执行 |
|
|
78
82
|
|
|
79
83
|
四组合路径示例(与 C++ `04_move` 一致):
|
|
80
84
|
|
|
@@ -100,7 +104,30 @@ robot.Move(path)
|
|
|
100
104
|
|
|
101
105
|
打包规则:`jp` 优先;仅 `cp` 时若未提供 `rj`,JSON 中带默认 `[20,20,20,20,20,20]`(度)。
|
|
102
106
|
|
|
103
|
-
|
|
107
|
+
### 阻塞式运动 API
|
|
108
|
+
|
|
109
|
+
`*Sync` 方法发送运动指令后自动轮询 CRI 数据,直到机器人稳定到达目标。需要先启动 CRI 数据推送(`StartListenUdp`)。
|
|
110
|
+
|
|
111
|
+
```python
|
|
112
|
+
from codroid import CodroidClient, JointPoint, MotionWaitOptions
|
|
113
|
+
|
|
114
|
+
with CodroidClient(host="192.168.1.136") as robot:
|
|
115
|
+
robot.ConnectRemoteAndSwitchOn()
|
|
116
|
+
robot.StartListenUdp()
|
|
117
|
+
robot.WaitForCriData() # 等待第一个 CRI 包到达
|
|
118
|
+
|
|
119
|
+
# 阻塞式关节运动,使用默认等待参数
|
|
120
|
+
robot.MovJSync(JointPoint.Degrees([0, 0, 90, 0, 90, 0]), speed=40, acceleration=100)
|
|
121
|
+
|
|
122
|
+
# 自定义等待参数
|
|
123
|
+
opts = MotionWaitOptions(timeout=30.0, joint_tolerance_deg=0.5)
|
|
124
|
+
robot.MovLSync(CartesianPoint.MmDeg([400, 200, 500, 180, 0, 90]),
|
|
125
|
+
speed=150, acceleration=500, wait=opts)
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
`MotionWaitOptions` 可调整超时、轮询间隔、到达容差等参数。
|
|
129
|
+
|
|
130
|
+
**Breaking(2.1.1)**:公开 API 与 C# 一致,统一 **PascalCase**(`Connect`、`SwitchOn`、`GetDi`、`MovJ`、`SetToolFrame` 等);`CriData` 为属性;`move_j` / `switch_on` 等 snake_case 已移除。见 [CHANGELOG.md](CHANGELOG.md)。
|
|
104
131
|
|
|
105
132
|
## Windows 控制台 UTF-8
|
|
106
133
|
|
|
@@ -124,18 +151,23 @@ from codroid import CodroidClient, InitConsoleUtf8
|
|
|
124
151
|
InitConsoleUtf8()
|
|
125
152
|
|
|
126
153
|
with CodroidClient(host="192.168.1.136") as robot:
|
|
127
|
-
robot.
|
|
128
|
-
robot.
|
|
154
|
+
robot.ToRemote()
|
|
155
|
+
robot.SwitchOn()
|
|
129
156
|
```
|
|
130
157
|
|
|
131
158
|
## 示例
|
|
132
159
|
|
|
133
160
|
```bash
|
|
134
161
|
PYTHONPATH=src python examples/08_move.py --robot 192.168.8.136
|
|
162
|
+
PYTHONPATH=src python examples/15_sync_motion.py --robot 192.168.8.136
|
|
163
|
+
PYTHONPATH=src python examples/14_robot_parameters.py --robot 192.168.8.136
|
|
135
164
|
PYTHONPATH=src python examples/codroid_test.py motion
|
|
136
165
|
PYTHONPATH=src python examples/codroid_test.py s20
|
|
166
|
+
PYTHONPATH=src python examples/codroid_test.py robotparam
|
|
137
167
|
```
|
|
138
168
|
|
|
169
|
+
机器人设置(协议 19.x):`GetRobotParameters`、`SetToolFrame`、`SetDefaultToolId` 等见 `examples/14_robot_parameters.py`。
|
|
170
|
+
|
|
139
171
|
寄存器与 S20 运动常量见仓库根目录 `AGENTS.md` §5.1。
|
|
140
172
|
|
|
141
173
|
## 常见问题
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# 快速上手
|
|
2
|
+
|
|
3
|
+
## 安装
|
|
4
|
+
|
|
5
|
+
### 通过 pip 安装
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pip install codroid-robot-sdk
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
可选彩色终端输出:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
pip install "codroid-robot-sdk[color]"
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### 从源码安装
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
git clone https://github.com/guybod/CodroidSDK.git
|
|
21
|
+
cd CodroidSDK/CodroidPython
|
|
22
|
+
pip install -e .
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## 最小示例
|
|
28
|
+
|
|
29
|
+
连接控制器,进入远程模式,上使能。
|
|
30
|
+
|
|
31
|
+
```python
|
|
32
|
+
from codroid import CodroidControlInterface, InitConsoleUtf8
|
|
33
|
+
|
|
34
|
+
InitConsoleUtf8() # Windows cmd 下中文日志不乱码;Linux 上为 no-op
|
|
35
|
+
|
|
36
|
+
ROBOT_IP = "192.168.1.136"
|
|
37
|
+
|
|
38
|
+
with CodroidControlInterface(host=ROBOT_IP) as robot:
|
|
39
|
+
robot.EnterRemoteModeViaAuto()
|
|
40
|
+
robot.SwitchOn()
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
运行:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
python3 demo.py
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## 完整工作流示例
|
|
52
|
+
|
|
53
|
+
```python
|
|
54
|
+
from codroid import (
|
|
55
|
+
CodroidControlInterface,
|
|
56
|
+
JointPoint,
|
|
57
|
+
CartesianPoint,
|
|
58
|
+
MoveInstruction,
|
|
59
|
+
InitConsoleUtf8,
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
InitConsoleUtf8()
|
|
63
|
+
|
|
64
|
+
ROBOT_IP = "192.168.1.136"
|
|
65
|
+
|
|
66
|
+
with CodroidControlInterface(host=ROBOT_IP) as robot:
|
|
67
|
+
# 1. 连接并上电
|
|
68
|
+
robot.EnterRemoteModeViaAuto()
|
|
69
|
+
robot.SwitchOn()
|
|
70
|
+
|
|
71
|
+
# 2. IO 操作
|
|
72
|
+
di0 = robot.GetDi(0)
|
|
73
|
+
robot.SetDo(10, di0)
|
|
74
|
+
|
|
75
|
+
# 3. 寄存器
|
|
76
|
+
reg_val = robot.GetRegisterValue(0)
|
|
77
|
+
robot.SetRegisterValue(0, reg_val + 1)
|
|
78
|
+
|
|
79
|
+
# 4. 关节运动
|
|
80
|
+
robot.MovJ(JointPoint.Degrees([0, 0, 90, 0, 90, 0]), speed=40, acceleration=100)
|
|
81
|
+
|
|
82
|
+
# 5. 直线运动
|
|
83
|
+
robot.MovL(CartesianPoint.MmDeg([400, 200, 500, 180, 0, 90]),
|
|
84
|
+
speed=150, acceleration=500)
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## 使用 CodroidClient
|
|
90
|
+
|
|
91
|
+
`CodroidClient` 继承自 `CodroidSession`,使用后台线程接收数据,支持 publish/subscribe 事件分发。适用于需要持续收包的场景。
|
|
92
|
+
|
|
93
|
+
```python
|
|
94
|
+
from codroid import CodroidClient, InitConsoleUtf8
|
|
95
|
+
|
|
96
|
+
InitConsoleUtf8()
|
|
97
|
+
|
|
98
|
+
with CodroidClient(host="192.168.1.136") as robot:
|
|
99
|
+
robot.EnterRemoteModeViaAuto()
|
|
100
|
+
robot.SwitchOn()
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## 运行示例项目
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
# 基本用法
|
|
109
|
+
PYTHONPATH=src python examples/01_basic_usage.py --robot 192.168.8.136
|
|
110
|
+
|
|
111
|
+
# 运动示例
|
|
112
|
+
PYTHONPATH=src python examples/08_move.py --robot 192.168.8.136
|
|
113
|
+
|
|
114
|
+
# 阻塞式运动
|
|
115
|
+
PYTHONPATH=src python examples/15_sync_motion.py --robot 192.168.8.136
|
|
116
|
+
|
|
117
|
+
# 机器人设置
|
|
118
|
+
PYTHONPATH=src python examples/14_robot_parameters.py --robot 192.168.8.136
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## 错误处理
|
|
124
|
+
|
|
125
|
+
所有 TCP 指令在失败时抛出异常:
|
|
126
|
+
|
|
127
|
+
| 异常 | 条件 |
|
|
128
|
+
|------|------|
|
|
129
|
+
| `CodroidError` | 基础异常类 |
|
|
130
|
+
| `CodroidCommandException` | 控制器返回 `err` 字段 |
|
|
131
|
+
| `CodroidNetworkError` | TCP 连接或通信失败 |
|
|
132
|
+
| `CodroidTimeoutError` | 操作超时 |
|
|
133
|
+
|
|
134
|
+
```python
|
|
135
|
+
from codroid import CodroidControlInterface, CodroidError, CodroidTimeoutError
|
|
136
|
+
|
|
137
|
+
try:
|
|
138
|
+
with CodroidControlInterface(host="192.168.1.136") as robot:
|
|
139
|
+
robot.EnterRemoteModeViaAuto()
|
|
140
|
+
robot.SwitchOn()
|
|
141
|
+
robot.MovJ([0, 0, 90, 0, 90, 0], speed=40, acceleration=100)
|
|
142
|
+
except CodroidTimeoutError:
|
|
143
|
+
print("操作超时")
|
|
144
|
+
except CodroidError as e:
|
|
145
|
+
print(f"SDK 错误: {e}")
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## Windows 控制台 UTF-8
|
|
151
|
+
|
|
152
|
+
在 `cmd`(非 Windows Terminal)下运行含中文的示例时,请在入口调用:
|
|
153
|
+
|
|
154
|
+
```python
|
|
155
|
+
from codroid import InitConsoleUtf8
|
|
156
|
+
|
|
157
|
+
InitConsoleUtf8()
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
所有 `examples/*.py` 已在 `if __name__ == "__main__"` 首行调用。自建 CLI 请同样处理;`chcp 65001` 不能替代此调用。Linux / macOS 上为 no-op。
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# 核心概念
|
|
2
|
+
|
|
3
|
+
## 客户端生命周期
|
|
4
|
+
|
|
5
|
+
`CodroidSession`(别名 `CodroidControlInterface`)和 `CodroidClient` 的典型生命周期:
|
|
6
|
+
|
|
7
|
+
```python
|
|
8
|
+
from codroid import CodroidClient
|
|
9
|
+
|
|
10
|
+
# 方式一:with 语句(推荐)
|
|
11
|
+
with CodroidClient(host="192.168.1.136") as robot:
|
|
12
|
+
robot.EnterRemoteModeViaAuto()
|
|
13
|
+
robot.SwitchOn()
|
|
14
|
+
# ... 使用 API ...
|
|
15
|
+
# 自动调用 Disconnect()
|
|
16
|
+
|
|
17
|
+
# 方式二:手动管理
|
|
18
|
+
robot = CodroidClient(host="192.168.1.136")
|
|
19
|
+
robot.Connect()
|
|
20
|
+
try:
|
|
21
|
+
robot.EnterRemoteModeViaAuto()
|
|
22
|
+
robot.SwitchOn()
|
|
23
|
+
# ... 使用 API ...
|
|
24
|
+
finally:
|
|
25
|
+
robot.Disconnect()
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### CodroidSession vs CodroidClient
|
|
29
|
+
|
|
30
|
+
| 特性 | CodroidSession | CodroidClient |
|
|
31
|
+
|------|---------------|---------------|
|
|
32
|
+
| 传输层 | `JsonStreamClient`(同步阻塞) | `TransportClient`(后台线程) |
|
|
33
|
+
| 请求/响应匹配 | 同步发送-接收 | 异步 ID 匹配 |
|
|
34
|
+
| Publish/Subscribe | 不支持 | 支持 |
|
|
35
|
+
| 适用场景 | 简单脚本、一次性操作 | 持续收包、事件驱动 |
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## TCP 命令模型
|
|
40
|
+
|
|
41
|
+
SDK 通过 TCP JSON 与控制器通信。每条指令的流程:
|
|
42
|
+
|
|
43
|
+
1. SDK 分配自增 `id`
|
|
44
|
+
2. 发送请求:`{"id": N, "ty": "command/path", "db": {...}}`
|
|
45
|
+
3. 控制器响应:`{"id": N, "ty": "...", "db": {...}, "err": ...}`
|
|
46
|
+
4. SDK 按 `id` 匹配请求与响应
|
|
47
|
+
|
|
48
|
+
```python
|
|
49
|
+
# SDK 内部自动处理 id 分配和匹配
|
|
50
|
+
response = robot._send_command("Robot/switchOn", "")
|
|
51
|
+
# response = CommonResponse(id=1, ty="Robot/switchOn", db=None, err=None)
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### CommonResponse
|
|
55
|
+
|
|
56
|
+
所有 TCP 指令返回 `CommonResponse`:
|
|
57
|
+
|
|
58
|
+
```python
|
|
59
|
+
@dataclass
|
|
60
|
+
class CommonResponse:
|
|
61
|
+
id: Union[int, str] # 请求 ID
|
|
62
|
+
ty: str # 响应类型
|
|
63
|
+
db: Optional[Any] # 响应数据
|
|
64
|
+
err: Optional[Any] # 错误信息(None 表示成功)
|
|
65
|
+
|
|
66
|
+
@property
|
|
67
|
+
def is_success(self) -> bool:
|
|
68
|
+
return self.err is None
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## 单位约定
|
|
74
|
+
|
|
75
|
+
| 层级 | 线性 | 角度 |
|
|
76
|
+
|------|------|------|
|
|
77
|
+
| SDK 公共 API | **mm** | **deg(度)** |
|
|
78
|
+
| TCP JSON 协议 | **mm** | **deg** |
|
|
79
|
+
| CRI UDP 二进制(线路层) | **m** | **rad(弧度)** |
|
|
80
|
+
| `CriRealTimeData`(已解析) | **mm** | **deg** |
|
|
81
|
+
|
|
82
|
+
`CriRealtimePacketParser.parse()` 自动将线路层的 m/rad 转换为 mm/deg。
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## API 命名约定
|
|
87
|
+
|
|
88
|
+
所有公共方法使用 **PascalCase**,与 C# / C++ SDK 保持一致:
|
|
89
|
+
|
|
90
|
+
```python
|
|
91
|
+
robot.Connect()
|
|
92
|
+
robot.SwitchOn()
|
|
93
|
+
robot.GetDi(0)
|
|
94
|
+
robot.MovJ(JointPoint.Degrees([0, 0, 90, 0, 90, 0]), speed=40, acceleration=100)
|
|
95
|
+
robot.SetToolFrame(1, RobotFrame(id=1, x=100, y=0, z=0, a=0, b=0, c=0))
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
> **Breaking(2.1.1)**:`move_j`、`switch_on` 等 snake_case 别名已移除。
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## 异常处理
|
|
103
|
+
|
|
104
|
+
SDK 定义了四种异常类型:
|
|
105
|
+
|
|
106
|
+
| 异常 | 触发条件 |
|
|
107
|
+
|------|----------|
|
|
108
|
+
| `CodroidError` | 基础异常类;参数校验失败、非法操作 |
|
|
109
|
+
| `CodroidCommandException` | 控制器返回 `err` 字段(协议层错误) |
|
|
110
|
+
| `CodroidNetworkError` | TCP 连接失败、通信中断 |
|
|
111
|
+
| `CodroidTimeoutError` | 操作超时(连接、CRI 等待、阻塞运动) |
|
|
112
|
+
|
|
113
|
+
```python
|
|
114
|
+
from codroid import (
|
|
115
|
+
CodroidError,
|
|
116
|
+
CodroidCommandException,
|
|
117
|
+
CodroidNetworkError,
|
|
118
|
+
CodroidTimeoutError,
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
try:
|
|
122
|
+
with CodroidClient(host="192.168.1.136") as robot:
|
|
123
|
+
robot.ConnectRemoteAndSwitchOn()
|
|
124
|
+
except CodroidNetworkError:
|
|
125
|
+
print("无法连接控制器")
|
|
126
|
+
except CodroidTimeoutError:
|
|
127
|
+
print("连接超时")
|
|
128
|
+
except CodroidCommandException as e:
|
|
129
|
+
print(f"控制器错误: {e}")
|
|
130
|
+
except CodroidError as e:
|
|
131
|
+
print(f"SDK 错误: {e}")
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## 线程安全
|
|
137
|
+
|
|
138
|
+
- `CriData` 属性返回当前缓存的 CRI 快照,可从任意线程读取。
|
|
139
|
+
- TCP 方法(`GetDi`、`MovJ` 等)可从任意线程调用,但同一客户端实例不支持并发调用。
|
|
140
|
+
- `CriRealtimeDispatcher` 的 `SendCommand` / `SendTrajectory` 是线程安全的(UDP 无状态)。
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## Publish / Subscribe
|
|
145
|
+
|
|
146
|
+
`CodroidClient` 支持订阅控制器推送的事件主题:
|
|
147
|
+
|
|
148
|
+
```python
|
|
149
|
+
from codroid import CodroidClient, PublishTopics
|
|
150
|
+
|
|
151
|
+
def on_robot_status(notification):
|
|
152
|
+
print(f"收到 {notification.ty}: {notification.db}")
|
|
153
|
+
|
|
154
|
+
with CodroidClient(host="192.168.1.136") as robot:
|
|
155
|
+
sub = robot.SubscribePublishTopic(PublishTopics.ROBOT_STATUS, on_robot_status)
|
|
156
|
+
# ... 运行 ...
|
|
157
|
+
sub.dispose() # 取消订阅
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
可用主题见 `PublishTopics` 常量:
|
|
161
|
+
- `PROJECT_STATE` — 工程状态变更
|
|
162
|
+
- `VAR_UPDATE` — 变量更新
|
|
163
|
+
- `ROBOT_STATUS` — 机器人状态
|
|
164
|
+
- `ROBOT_POSTURE` — 机器人姿态
|
|
165
|
+
- `ROBOT_COORDINATE` — 机器人坐标
|
|
166
|
+
- `LOG` — 日志
|
|
167
|
+
- `ERROR` — 错误
|