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.
Files changed (59) hide show
  1. codroid_robot_sdk-2.1.2/.claude/settings.local.json +11 -0
  2. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/.gitignore +2 -3
  3. codroid_robot_sdk-2.1.2/CHANGELOG.md +65 -0
  4. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/PKG-INFO +38 -6
  5. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/README.md +37 -5
  6. codroid_robot_sdk-2.1.2/docs/01-quick-start.md +160 -0
  7. codroid_robot_sdk-2.1.2/docs/02-concepts.md +167 -0
  8. codroid_robot_sdk-2.1.2/docs/03-api-reference-codroidclient.md +945 -0
  9. codroid_robot_sdk-2.1.2/docs/04-api-reference-motion.md +324 -0
  10. codroid_robot_sdk-2.1.2/docs/05-api-reference-types.md +397 -0
  11. codroid_robot_sdk-2.1.2/docs/06-api-reference-cri.md +321 -0
  12. codroid_robot_sdk-2.1.2/docs/07-api-reference-io-register.md +247 -0
  13. codroid_robot_sdk-2.1.2/docs/08-api-reference-utilities.md +321 -0
  14. codroid_robot_sdk-2.1.2/docs/CodroidPython-SDK-Manual-v2.1.2-en.md +2939 -0
  15. codroid_robot_sdk-2.1.2/docs/CodroidPython-SDK-Manual-v2.1.2-en.pdf +0 -0
  16. codroid_robot_sdk-2.1.2/docs/CodroidPython-SDK-Manual-v2.1.2-zh.md +2938 -0
  17. codroid_robot_sdk-2.1.2/docs/CodroidPython-SDK-Manual-v2.1.2-zh.pdf +0 -0
  18. codroid_robot_sdk-2.1.2/docs/README.md +74 -0
  19. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/examples/01_basic_usage.py +4 -4
  20. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/examples/02_run_script.py +31 -3
  21. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/examples/03_run_project.py +7 -7
  22. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/examples/04_global_value.py +2 -2
  23. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/examples/05_rs485.py +5 -5
  24. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/examples/06_jog_mode.py +6 -6
  25. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/examples/07_move_to.py +22 -7
  26. codroid_robot_sdk-2.1.2/examples/08_move.py +186 -0
  27. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/examples/09_move_path.py +2 -2
  28. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/examples/10_control_commands.py +7 -7
  29. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/examples/11_io_demo.py +6 -6
  30. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/examples/12_register_demo.py +5 -5
  31. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/examples/13_cri_realtime.py +3 -3
  32. codroid_robot_sdk-2.1.2/examples/14_robot_parameters.py +202 -0
  33. codroid_robot_sdk-2.1.2/examples/15_sync_motion.py +138 -0
  34. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/examples/codroid_cri_test.py +21 -21
  35. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/examples/codroid_test.py +55 -33
  36. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/pyproject.toml +0 -15
  37. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/src/codroid/Codroid.py +579 -255
  38. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/src/codroid/__about__.py +1 -1
  39. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/src/codroid/__init__.py +5 -1
  40. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/src/codroid/client.py +0 -8
  41. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/src/codroid/cri_realtime_dispatcher.py +3 -5
  42. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/src/codroid/define.py +32 -8
  43. codroid_robot_sdk-2.1.2/src/codroid/robot_settings.py +243 -0
  44. codroid_robot_sdk-2.1.0/CHANGELOG.md +0 -30
  45. codroid_robot_sdk-2.1.0/examples/08_move.py +0 -124
  46. codroid_robot_sdk-2.1.0/mkdocs.yml +0 -34
  47. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/LICENSE.txt +0 -0
  48. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/src/codroid/async_tcp_client.py +0 -0
  49. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/src/codroid/console.py +0 -0
  50. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/src/codroid/console_utf8.py +0 -0
  51. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/src/codroid/cri_realtime_packet_parser.py +0 -0
  52. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/src/codroid/exceptions.py +0 -0
  53. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/src/codroid/publish.py +0 -0
  54. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/src/codroid/py.typed +0 -0
  55. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/src/codroid/robot_motion.py +0 -0
  56. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/src/codroid/trajectory.py +0 -0
  57. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/src/codroid/types.py +0 -0
  58. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/src/codroid/utils.py +0 -0
  59. {codroid_robot_sdk-2.1.0 → codroid_robot_sdk-2.1.2}/update1.md +0 -0
@@ -0,0 +1,11 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(git add *)",
5
+ "Bash(git rm *)",
6
+ "Bash(git commit *)",
7
+ "Bash(git push *)",
8
+ "Bash(python3 *)"
9
+ ]
10
+ }
11
+ }
@@ -6,7 +6,6 @@ build_msvc/
6
6
  bin/
7
7
  lib/
8
8
  out/
9
- docs/
10
9
  up.md
11
10
 
12
11
  # === 编译器产生的中间文件 (Objects & Libraries) ===
@@ -72,8 +71,8 @@ dist/
72
71
  build/
73
72
  *.egg-info/
74
73
 
75
- # 文档输出
76
- site/
74
+ # 文档输出(mkdocs 已移除,site/ 不再生成)
75
+ # site/
77
76
 
78
77
  # IDE 设置
79
78
  .vscode/
@@ -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.0
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.to_remote()
75
- robot.switch_on()
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
- **Breaking(2.1.0)**:请勿再用 `MovePoint(jp=...)` 作业务入口;`move_j` / `move_l` 已废弃,见 [CHANGELOG.md](CHANGELOG.md)。
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.to_remote()
155
- robot.switch_on()
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.to_remote()
48
- robot.switch_on()
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
- **Breaking(2.1.0)**:请勿再用 `MovePoint(jp=...)` 作业务入口;`move_j` / `move_l` 已废弃,见 [CHANGELOG.md](CHANGELOG.md)。
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.to_remote()
128
- robot.switch_on()
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` — 错误