codroid-robot-sdk 2.0.0__tar.gz → 2.1.1__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 (52) hide show
  1. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/.gitignore +3 -1
  2. codroid_robot_sdk-2.1.1/CHANGELOG.md +52 -0
  3. codroid_robot_sdk-2.1.1/PKG-INFO +212 -0
  4. codroid_robot_sdk-2.1.1/README.md +185 -0
  5. codroid_robot_sdk-2.1.1/examples/01_basic_usage.py +93 -0
  6. codroid_robot_sdk-2.1.1/examples/02_run_script.py +60 -0
  7. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/examples/03_run_project.py +27 -13
  8. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/examples/04_global_value.py +20 -8
  9. codroid_robot_sdk-2.1.1/examples/05_rs485.py +65 -0
  10. codroid_robot_sdk-2.1.1/examples/06_jog_mode.py +87 -0
  11. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/examples/07_move_to.py +43 -15
  12. codroid_robot_sdk-2.1.1/examples/08_move.py +167 -0
  13. codroid_robot_sdk-2.1.1/examples/09_move_path.py +97 -0
  14. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/examples/10_control_commands.py +26 -13
  15. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/examples/11_io_demo.py +24 -12
  16. codroid_robot_sdk-2.1.1/examples/12_register_demo.py +59 -0
  17. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/examples/13_cri_realtime.py +23 -9
  18. codroid_robot_sdk-2.1.1/examples/14_robot_parameters.py +202 -0
  19. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/examples/codroid_cri_test.py +62 -35
  20. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/examples/codroid_test.py +104 -56
  21. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/pyproject.toml +1 -1
  22. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/src/codroid/Codroid.py +382 -259
  23. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/src/codroid/__about__.py +1 -1
  24. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/src/codroid/__init__.py +14 -1
  25. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/src/codroid/client.py +0 -8
  26. codroid_robot_sdk-2.1.1/src/codroid/console_utf8.py +31 -0
  27. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/src/codroid/cri_realtime_dispatcher.py +3 -5
  28. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/src/codroid/define.py +303 -49
  29. codroid_robot_sdk-2.1.1/src/codroid/robot_motion.py +84 -0
  30. codroid_robot_sdk-2.1.1/src/codroid/robot_settings.py +243 -0
  31. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/src/codroid/types.py +8 -0
  32. codroid_robot_sdk-2.1.1/update1.md +439 -0
  33. codroid_robot_sdk-2.0.0/PKG-INFO +0 -158
  34. codroid_robot_sdk-2.0.0/README.md +0 -132
  35. codroid_robot_sdk-2.0.0/examples/01_basic_usage.py +0 -68
  36. codroid_robot_sdk-2.0.0/examples/02_run_script.py +0 -45
  37. codroid_robot_sdk-2.0.0/examples/05_rs485.py +0 -50
  38. codroid_robot_sdk-2.0.0/examples/06_jog_mode.py +0 -66
  39. codroid_robot_sdk-2.0.0/examples/08_move.py +0 -71
  40. codroid_robot_sdk-2.0.0/examples/09_move_path.py +0 -73
  41. codroid_robot_sdk-2.0.0/examples/12_register_demo.py +0 -45
  42. codroid_robot_sdk-2.0.0/plan.md +0 -385
  43. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/LICENSE.txt +0 -0
  44. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/mkdocs.yml +0 -0
  45. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/src/codroid/async_tcp_client.py +0 -0
  46. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/src/codroid/console.py +0 -0
  47. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/src/codroid/cri_realtime_packet_parser.py +0 -0
  48. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/src/codroid/exceptions.py +0 -0
  49. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/src/codroid/publish.py +0 -0
  50. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/src/codroid/py.typed +0 -0
  51. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/src/codroid/trajectory.py +0 -0
  52. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/src/codroid/utils.py +0 -0
@@ -92,4 +92,6 @@ htmlcov/
92
92
  AGENTS.md
93
93
  PROTOCOL_LINE_BY_LINE.md
94
94
  SDK_API_AND_DESIGN.md
95
- TRAJECTORY_ALGORITHM.md
95
+ TRAJECTORY_ALGORITHM.md
96
+ plan.md
97
+ aaa.txt
@@ -0,0 +1,52 @@
1
+ # Changelog
2
+
3
+ ## 2.1.1 — 机器人设置 API(协议 19.x)
4
+
5
+ ### Added
6
+
7
+ - `robot_settings.py`:`RobotFrame`、`RobotPayloadFrame`、`RobotParameters`
8
+ - `SetCollisionSensitivity`、`GetRobotParameters`
9
+ - 仅改默认编号:`SetDefaultPayloadId`、`SetDefaultToolId`、`SetDefaultUserCoordinateId`
10
+ - 先读后改:`SetToolFrame`、`SetPayloadFrame`、`SetUserCoordinateFrame`
11
+ - 整表下发:`SaveToolFrames`、`SavePayloadFrames`、`SaveUserCoordinateFrames`
12
+ - 示例:`examples/14_robot_parameters.py`;`codroid_test.py robotparam`
13
+
14
+ ### Changed / Breaking
15
+
16
+ - 运动门面仅保留 C# 同名:`MovJ`、`MovL`、`MovC`、`MovCircle`、`Move`、`MoveTo`、`MoveToHeartbeat`
17
+ - 移除 `move_j` / `move_l` / `move_c` / `move_circle` / `execute_path` / `move` / `move_to` / `move_to_heartbeat`
18
+ - `MoveTarget` 更名为 `MoveToTarget`(与 C# 一致);`MotionPath.mov_*` 更名为 `MovJ` / `MovL` / `MovC`
19
+ - **`CodroidSession` / `CodroidClient` 全部公开方法改为 PascalCase**(`Connect`、`SwitchOn`、`GetDi`、`StartCriDataPush` 等);移除文件末尾历史 snake_case 别名
20
+ - `get_cri_data()` 改为属性 **`CriData`**(对齐 C#)
21
+ - `close` / `disconnect` 合并为 **`Disconnect`**
22
+ - `CriRealtimeDispatcher.send_command` → **`SendCommand`**,`send_trajectory` → **`SendTrajectory`**
23
+ - 移除 `subscribe_publish_topic` 别名
24
+
25
+ ## 2.1.0 — 运动 API 类型化(Breaking)
26
+
27
+ 与 C++ SDK v2.1.1 / `update1.md` 对齐。
28
+
29
+ ### Added
30
+
31
+ - `JointPoint`、`CartesianPoint`、`MoveInstruction` 及工厂(`Degrees`、`MmDeg`、`MmDegWithRef`、`MovJ`/`MovL`/…)
32
+ - `pack_move_point` / `pack_instruction`(`jp` 优先;笛卡尔缺省 `rj=[20,…,20]`)
33
+ - 门面 API:`MovJ`、`MovL`、`MovC`、`MovCircle`、`Move`、`MoveTo`、`MoveToHeartbeat`
34
+ - `MoveToTarget.Joint` / `MoveToTarget.Cartesian`
35
+ - `InitConsoleUtf8()`(Windows 控制台 UTF-8)
36
+
37
+ ### Changed
38
+
39
+ - `MovePoint.to_dict()` 经统一打包逻辑,仅 `cp` 时 JSON 会带默认 `rj`
40
+ - 示例与 `codroid_test` 运动段改用类型化 API
41
+
42
+ ### Deprecated
43
+
44
+ - 旧版 snake_case 运动方法(2.1.1 起已删除,见 2.1.1 Breaking)
45
+ - 直接 `MovePoint(jp=…)` 作业务目标(请改用 `JointPoint` / `CartesianPoint`)
46
+
47
+ ### Migration
48
+
49
+ 1. 程序入口首行:`InitConsoleUtf8()`
50
+ 2. 关节目标 → `JointPoint.Degrees([...])` + `MovJ` / `MoveInstruction.MovJ`
51
+ 3. TCP 目标 → `CartesianPoint.MmDeg` 或 `MmDegWithRef(pose, cri_joint)`
52
+ 4. 多段路径 → `Move([MoveInstruction.MovJ(...), ...])`
@@ -0,0 +1,212 @@
1
+ Metadata-Version: 2.4
2
+ Name: codroid-robot-sdk
3
+ Version: 2.1.1
4
+ Summary: Codroid robot controller Python SDK (TCP/CRI, typed motion API)
5
+ Project-URL: Documentation, https://guybod.github.io/CodroidSDK/
6
+ Project-URL: Issues, https://github.com/guybod/CodroidSDK/issues
7
+ Project-URL: Source, https://github.com/guybod/CodroidSDK
8
+ Author-email: guybod <b13140185898@outlook.com>
9
+ License-Expression: MIT
10
+ License-File: LICENSE.txt
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Programming Language :: Python
13
+ Classifier: Programming Language :: Python :: 3.7
14
+ Classifier: Programming Language :: Python :: 3.8
15
+ Classifier: Programming Language :: Python :: 3.9
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Programming Language :: Python :: 3.14
21
+ Classifier: Programming Language :: Python :: Implementation :: CPython
22
+ Classifier: Programming Language :: Python :: Implementation :: PyPy
23
+ Requires-Python: >=3.7
24
+ Provides-Extra: color
25
+ Requires-Dist: colorama>=0.4.6; extra == 'color'
26
+ Description-Content-Type: text/markdown
27
+
28
+ # Codroid 机器人 Python SDK
29
+
30
+ Codroid 控制器 Python SDK,提供 TCP 控制、实时数据(CRI)与轨迹相关能力。
31
+
32
+ [![PyPI - Version](https://img.shields.io/pypi/v/codroid-robot-sdk.svg)](https://pypi.org/project/codroid-robot-sdk)
33
+ [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/codroid-robot-sdk.svg)](https://pypi.org/project/codroid-robot-sdk)
34
+
35
+ ---
36
+
37
+ ## 教程:5 分钟跑通
38
+
39
+ ### 1) 环境准备
40
+
41
+ - Python 3.7 及以上(建议 3.8+)
42
+ - 机器人控制器与运行脚本的电脑网络互通
43
+
44
+ ### 2) 安装 SDK
45
+
46
+ ```bash
47
+ pip install codroid-robot-sdk
48
+ ```
49
+
50
+ 可选彩色终端输出:
51
+
52
+ ```bash
53
+ pip install "codroid-robot-sdk[color]"
54
+ ```
55
+
56
+ ### 3) 验证安装
57
+
58
+ ```bash
59
+ python3 -c "import codroid; print(codroid.__version__)"
60
+ ```
61
+
62
+ ### 4) 第一个控制脚本
63
+
64
+ 新建 `demo.py`:
65
+
66
+ ```python
67
+ from codroid import CodroidControlInterface, InitConsoleUtf8
68
+
69
+ InitConsoleUtf8() # Windows cmd 下中文日志不乱码;Linux 上为 no-op
70
+
71
+ ROBOT_IP = "192.168.1.136" # 改成实际控制器 IP
72
+
73
+ with CodroidControlInterface(host=ROBOT_IP) as robot:
74
+ robot.ToRemote()
75
+ robot.SwitchOn()
76
+ ```
77
+
78
+ 运行:
79
+
80
+ ```bash
81
+ python3 demo.py
82
+ ```
83
+
84
+ ### 5) 常见下一步
85
+
86
+ - 进入远程模式后,继续调用运动、IO、寄存器等 API。
87
+ - 需要持续收包和 publish 分发时,改用 `CodroidClient`。
88
+ - 运动示例见 `examples/08_move.py`(四组合路径)与 `examples/codroid_test.py motion`。
89
+
90
+ ## 运动 API(2.1+)
91
+
92
+ 协议 JSON 未变;业务层须用类型区分关节与 TCP,避免把位姿当关节角下发。
93
+
94
+ | 业务类型 | 工厂 | 用于 |
95
+ |----------|------|------|
96
+ | `JointPoint` | `Degrees([j1..j6])` | 六轴角(度) |
97
+ | `CartesianPoint` | `MmDeg([x,y,z,rx,ry,rz])` | TCP(mm + 度) |
98
+ | | `MmDegWithRef(pose, ref_joints)` | TCP + 逆解参考关节(推荐) |
99
+
100
+ | 门面 API | 说明 |
101
+ |----------|------|
102
+ | `MovJ(target, speed, acceleration)` | 目标:`JointPoint` 或 `CartesianPoint` |
103
+ | `MovL(target, speed, acceleration)` | 目标:`CartesianPoint` 或 `JointPoint` |
104
+ | `Move([MoveInstruction.MovJ(...), ...])` | 多段路径 |
105
+
106
+ 四组合路径示例(与 C++ `04_move` 一致):
107
+
108
+ ```python
109
+ from codroid import (
110
+ CodroidClient,
111
+ JointPoint,
112
+ CartesianPoint,
113
+ MoveInstruction,
114
+ InitConsoleUtf8,
115
+ )
116
+
117
+ InitConsoleUtf8()
118
+
119
+ path = [
120
+ MoveInstruction.MovJ(JointPoint.Degrees([0, 0, 90, 0, 90, 0]), speed=40, acc=100),
121
+ MoveInstruction.MovJ(CartesianPoint.MmDeg([...]), speed=40, acc=100),
122
+ MoveInstruction.MovL(CartesianPoint.MmDeg([...]), speed=150, acc=500),
123
+ MoveInstruction.MovL(JointPoint.Degrees([0, 0, 0, 0, 0, 0]), speed=150, acc=500),
124
+ ]
125
+ robot.Move(path)
126
+ ```
127
+
128
+ 打包规则:`jp` 优先;仅 `cp` 时若未提供 `rj`,JSON 中带默认 `[20,20,20,20,20,20]`(度)。
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)。
131
+
132
+ ## Windows 控制台 UTF-8
133
+
134
+ 在 `cmd`(非 Windows Terminal)下运行含中文的示例时,请在入口调用:
135
+
136
+ ```python
137
+ from codroid import InitConsoleUtf8
138
+
139
+ InitConsoleUtf8()
140
+ ```
141
+
142
+ 所有 `examples/*.py` 已在 `if __name__ == "__main__"` 首行调用。自建 CLI 请同样处理;`chcp 65001` 不能替代此调用。
143
+
144
+ ## 教程:进阶连接方式
145
+
146
+ `CodroidClient` 适用于后台持续接收、请求 `id` 配对、publish 分发:
147
+
148
+ ```python
149
+ from codroid import CodroidClient, InitConsoleUtf8
150
+
151
+ InitConsoleUtf8()
152
+
153
+ with CodroidClient(host="192.168.1.136") as robot:
154
+ robot.ToRemote()
155
+ robot.SwitchOn()
156
+ ```
157
+
158
+ ## 示例
159
+
160
+ ```bash
161
+ PYTHONPATH=src python examples/08_move.py --robot 192.168.8.136
162
+ PYTHONPATH=src python examples/14_robot_parameters.py --robot 192.168.8.136
163
+ PYTHONPATH=src python examples/codroid_test.py motion
164
+ PYTHONPATH=src python examples/codroid_test.py s20
165
+ PYTHONPATH=src python examples/codroid_test.py robotparam
166
+ ```
167
+
168
+ 机器人设置(协议 19.x):`GetRobotParameters`、`SetToolFrame`、`SetDefaultToolId` 等见 `examples/14_robot_parameters.py`。
169
+
170
+ 寄存器与 S20 运动常量见仓库根目录 `AGENTS.md` §5.1。
171
+
172
+ ## 常见问题
173
+
174
+ ### `ModuleNotFoundError: No module named codroid`
175
+
176
+ 未在当前 Python 环境安装 SDK。重新执行:
177
+
178
+ ```bash
179
+ pip install codroid-robot-sdk
180
+ ```
181
+
182
+ ### 脚本无响应或连接失败
183
+
184
+ - 检查控制器 IP 与端口配置。
185
+ - 检查本机与控制器网络连通性、防火墙策略。
186
+ - 确认控制器处于可远程控制状态。
187
+
188
+ ## 项目架构
189
+
190
+ ```text
191
+ src/codroid/
192
+ ├── __init__.py # 公开 API 导出(含 __version__)
193
+ ├── __about__.py # 版本号
194
+ ├── Codroid.py # CodroidSession / CodroidControlInterface
195
+ ├── client.py # CodroidClient
196
+ ├── async_tcp_client.py # JsonStreamClient、TransportClient
197
+ ├── define.py # DTO / 常量(JointPoint、MoveInstruction 等)
198
+ ├── robot_motion.py # pack_move_point / pack_instruction
199
+ ├── types.py # DTO 再导出
200
+ ├── exceptions.py # 异常定义
201
+ ├── publish.py # 发布订阅模型
202
+ ├── trajectory.py # 轨迹生成
203
+ ├── cri_realtime_packet_parser.py # CRI UDP 数据解析
204
+ ├── cri_realtime_dispatcher.py # CRI 实时控制下发
205
+ ├── console.py # PrintBanner
206
+ ├── console_utf8.py # InitConsoleUtf8
207
+ └── utils.py # 通用工具
208
+ ```
209
+
210
+ ## 许可证
211
+
212
+ 本项目采用 [MIT](https://spdx.org/licenses/MIT.html) 许可证。
@@ -0,0 +1,185 @@
1
+ # Codroid 机器人 Python SDK
2
+
3
+ Codroid 控制器 Python SDK,提供 TCP 控制、实时数据(CRI)与轨迹相关能力。
4
+
5
+ [![PyPI - Version](https://img.shields.io/pypi/v/codroid-robot-sdk.svg)](https://pypi.org/project/codroid-robot-sdk)
6
+ [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/codroid-robot-sdk.svg)](https://pypi.org/project/codroid-robot-sdk)
7
+
8
+ ---
9
+
10
+ ## 教程:5 分钟跑通
11
+
12
+ ### 1) 环境准备
13
+
14
+ - Python 3.7 及以上(建议 3.8+)
15
+ - 机器人控制器与运行脚本的电脑网络互通
16
+
17
+ ### 2) 安装 SDK
18
+
19
+ ```bash
20
+ pip install codroid-robot-sdk
21
+ ```
22
+
23
+ 可选彩色终端输出:
24
+
25
+ ```bash
26
+ pip install "codroid-robot-sdk[color]"
27
+ ```
28
+
29
+ ### 3) 验证安装
30
+
31
+ ```bash
32
+ python3 -c "import codroid; print(codroid.__version__)"
33
+ ```
34
+
35
+ ### 4) 第一个控制脚本
36
+
37
+ 新建 `demo.py`:
38
+
39
+ ```python
40
+ from codroid import CodroidControlInterface, InitConsoleUtf8
41
+
42
+ InitConsoleUtf8() # Windows cmd 下中文日志不乱码;Linux 上为 no-op
43
+
44
+ ROBOT_IP = "192.168.1.136" # 改成实际控制器 IP
45
+
46
+ with CodroidControlInterface(host=ROBOT_IP) as robot:
47
+ robot.ToRemote()
48
+ robot.SwitchOn()
49
+ ```
50
+
51
+ 运行:
52
+
53
+ ```bash
54
+ python3 demo.py
55
+ ```
56
+
57
+ ### 5) 常见下一步
58
+
59
+ - 进入远程模式后,继续调用运动、IO、寄存器等 API。
60
+ - 需要持续收包和 publish 分发时,改用 `CodroidClient`。
61
+ - 运动示例见 `examples/08_move.py`(四组合路径)与 `examples/codroid_test.py motion`。
62
+
63
+ ## 运动 API(2.1+)
64
+
65
+ 协议 JSON 未变;业务层须用类型区分关节与 TCP,避免把位姿当关节角下发。
66
+
67
+ | 业务类型 | 工厂 | 用于 |
68
+ |----------|------|------|
69
+ | `JointPoint` | `Degrees([j1..j6])` | 六轴角(度) |
70
+ | `CartesianPoint` | `MmDeg([x,y,z,rx,ry,rz])` | TCP(mm + 度) |
71
+ | | `MmDegWithRef(pose, ref_joints)` | TCP + 逆解参考关节(推荐) |
72
+
73
+ | 门面 API | 说明 |
74
+ |----------|------|
75
+ | `MovJ(target, speed, acceleration)` | 目标:`JointPoint` 或 `CartesianPoint` |
76
+ | `MovL(target, speed, acceleration)` | 目标:`CartesianPoint` 或 `JointPoint` |
77
+ | `Move([MoveInstruction.MovJ(...), ...])` | 多段路径 |
78
+
79
+ 四组合路径示例(与 C++ `04_move` 一致):
80
+
81
+ ```python
82
+ from codroid import (
83
+ CodroidClient,
84
+ JointPoint,
85
+ CartesianPoint,
86
+ MoveInstruction,
87
+ InitConsoleUtf8,
88
+ )
89
+
90
+ InitConsoleUtf8()
91
+
92
+ path = [
93
+ MoveInstruction.MovJ(JointPoint.Degrees([0, 0, 90, 0, 90, 0]), speed=40, acc=100),
94
+ MoveInstruction.MovJ(CartesianPoint.MmDeg([...]), speed=40, acc=100),
95
+ MoveInstruction.MovL(CartesianPoint.MmDeg([...]), speed=150, acc=500),
96
+ MoveInstruction.MovL(JointPoint.Degrees([0, 0, 0, 0, 0, 0]), speed=150, acc=500),
97
+ ]
98
+ robot.Move(path)
99
+ ```
100
+
101
+ 打包规则:`jp` 优先;仅 `cp` 时若未提供 `rj`,JSON 中带默认 `[20,20,20,20,20,20]`(度)。
102
+
103
+ **Breaking(2.1.1)**:公开 API 与 C# 一致,统一 **PascalCase**(`Connect`、`SwitchOn`、`GetDi`、`MovJ`、`SetToolFrame` 等);`CriData` 为属性;`move_j` / `switch_on` 等 snake_case 已移除。见 [CHANGELOG.md](CHANGELOG.md)。
104
+
105
+ ## Windows 控制台 UTF-8
106
+
107
+ 在 `cmd`(非 Windows Terminal)下运行含中文的示例时,请在入口调用:
108
+
109
+ ```python
110
+ from codroid import InitConsoleUtf8
111
+
112
+ InitConsoleUtf8()
113
+ ```
114
+
115
+ 所有 `examples/*.py` 已在 `if __name__ == "__main__"` 首行调用。自建 CLI 请同样处理;`chcp 65001` 不能替代此调用。
116
+
117
+ ## 教程:进阶连接方式
118
+
119
+ `CodroidClient` 适用于后台持续接收、请求 `id` 配对、publish 分发:
120
+
121
+ ```python
122
+ from codroid import CodroidClient, InitConsoleUtf8
123
+
124
+ InitConsoleUtf8()
125
+
126
+ with CodroidClient(host="192.168.1.136") as robot:
127
+ robot.ToRemote()
128
+ robot.SwitchOn()
129
+ ```
130
+
131
+ ## 示例
132
+
133
+ ```bash
134
+ PYTHONPATH=src python examples/08_move.py --robot 192.168.8.136
135
+ PYTHONPATH=src python examples/14_robot_parameters.py --robot 192.168.8.136
136
+ PYTHONPATH=src python examples/codroid_test.py motion
137
+ PYTHONPATH=src python examples/codroid_test.py s20
138
+ PYTHONPATH=src python examples/codroid_test.py robotparam
139
+ ```
140
+
141
+ 机器人设置(协议 19.x):`GetRobotParameters`、`SetToolFrame`、`SetDefaultToolId` 等见 `examples/14_robot_parameters.py`。
142
+
143
+ 寄存器与 S20 运动常量见仓库根目录 `AGENTS.md` §5.1。
144
+
145
+ ## 常见问题
146
+
147
+ ### `ModuleNotFoundError: No module named codroid`
148
+
149
+ 未在当前 Python 环境安装 SDK。重新执行:
150
+
151
+ ```bash
152
+ pip install codroid-robot-sdk
153
+ ```
154
+
155
+ ### 脚本无响应或连接失败
156
+
157
+ - 检查控制器 IP 与端口配置。
158
+ - 检查本机与控制器网络连通性、防火墙策略。
159
+ - 确认控制器处于可远程控制状态。
160
+
161
+ ## 项目架构
162
+
163
+ ```text
164
+ src/codroid/
165
+ ├── __init__.py # 公开 API 导出(含 __version__)
166
+ ├── __about__.py # 版本号
167
+ ├── Codroid.py # CodroidSession / CodroidControlInterface
168
+ ├── client.py # CodroidClient
169
+ ├── async_tcp_client.py # JsonStreamClient、TransportClient
170
+ ├── define.py # DTO / 常量(JointPoint、MoveInstruction 等)
171
+ ├── robot_motion.py # pack_move_point / pack_instruction
172
+ ├── types.py # DTO 再导出
173
+ ├── exceptions.py # 异常定义
174
+ ├── publish.py # 发布订阅模型
175
+ ├── trajectory.py # 轨迹生成
176
+ ├── cri_realtime_packet_parser.py # CRI UDP 数据解析
177
+ ├── cri_realtime_dispatcher.py # CRI 实时控制下发
178
+ ├── console.py # PrintBanner
179
+ ├── console_utf8.py # InitConsoleUtf8
180
+ └── utils.py # 通用工具
181
+ ```
182
+
183
+ ## 许可证
184
+
185
+ 本项目采用 [MIT](https://spdx.org/licenses/MIT.html) 许可证。
@@ -0,0 +1,93 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ 示例 01 — 最简联调流程(连接 → 远程 → 使能 → movJ → CRI 打印)
4
+
5
+ 【目的】
6
+ 演示 SDK 2.1+ 最小闭环:TCP 控制 + CRI 实时缓存读取。
7
+
8
+ 【前置条件】
9
+ - 控制器与 PC 同网段,TCP 9001 可达
10
+ - 本机 UDP 端口(默认 18888)未被占用,且防火墙放行
11
+ - 机器人可远程控制、允许上使能
12
+
13
+ 【涉及协议】
14
+ - TCP:模式切换、使能、Robot/move(movJ)、CRI/StartDataPush / StopDataPush
15
+ - UDP:308 字节 CRI 推送(解析后为 mm + 度,见 AGENTS.md §2.3)
16
+
17
+ 【运行】
18
+ PYTHONPATH=src python examples/01_basic_usage.py
19
+ PYTHONPATH=src python examples/01_basic_usage.py --robot 192.168.8.136
20
+
21
+ 【注意】
22
+ - 会实际运动机器人,请在安全空间内运行
23
+ - ``JointPoint.Degrees`` 表示六轴关节角(度),勿与 TCP 位姿混用
24
+ """
25
+ from __future__ import annotations
26
+
27
+ import argparse
28
+ import sys
29
+ import time
30
+
31
+ from codroid import CodroidControlInterface, InitConsoleUtf8, JointPoint, PrintBanner
32
+
33
+
34
+ def main(argv: list[str]) -> int:
35
+ # ---------- 命令行:现场改 IP / 本机 CRI 绑定 ----------
36
+ p = argparse.ArgumentParser(description="Basic connect, moveJ, CRI cache")
37
+ p.add_argument("--robot", default="192.168.8.136", help="控制器 IP")
38
+ p.add_argument("--local-ip", default="192.168.8.150", help="本机 IP(CRI 推送目标)")
39
+ p.add_argument(
40
+ "--udp-port",
41
+ type=int,
42
+ default=18888,
43
+ help="本机 UDP 端口(建议 10000–65534)",
44
+ )
45
+ args = p.parse_args(argv)
46
+
47
+ PrintBanner("01 — Basic usage", subtitle=f"{args.robot} CRI → {args.local_ip}:{args.udp_port}")
48
+
49
+ # with 退出时自动 Disconnect,避免 TCP/UDP 泄漏
50
+ with CodroidControlInterface(
51
+ host=args.robot,
52
+ local_ip=args.local_ip,
53
+ udp_port=args.udp_port,
54
+ ) as robot:
55
+ # 典型上电顺序:先自动再远程(与 C# ConnectRemoteAndSwitchOn 子步骤一致)
56
+ robot.EnterRemoteModeViaAuto()
57
+ robot.SwitchOn()
58
+
59
+ # 后台线程收 CRI UDP,结果写入 robot.cri_cache(线程安全快照)
60
+ robot._start_cri_receiver()
61
+ robot.StartCriDataPush(ip=args.local_ip, port=args.udp_port)
62
+
63
+ try:
64
+ # 类型化目标:明确是「关节角」而非 TCP
65
+ p1 = JointPoint.Degrees([0, 0, 90, 0, 90, 0])
66
+ p2 = JointPoint.Degrees([0, 0, 0, 0, 0, 0])
67
+ for _ in range(3):
68
+ # MovJ(target, speed, acceleration);单位:度、%/s 等按控制器约定
69
+ robot.MovJ(p1, 60, 120)
70
+ robot.MovJ(p2, 60, 120)
71
+
72
+ PrintBanner("CRI cache loop", subtitle="Ctrl+C 退出")
73
+ while True:
74
+ data = robot.cri_cache
75
+ if data:
76
+ # joint_pos / is_moving 来自 CRI 解析(已是度、mm 等对外单位)
77
+ print(f"关节角 / joint_pos: {data.joint_pos}")
78
+ print(f"运动中 / is_moving: {data.status.is_moving}")
79
+ time.sleep(0.1)
80
+ except KeyboardInterrupt:
81
+ print("已中断 / Interrupted", file=sys.stderr)
82
+ return 130
83
+ finally:
84
+ # 停止推送,释放控制器侧推送任务
85
+ robot.StopCriDataPush(ip=args.local_ip, port=args.udp_port)
86
+
87
+ return 0
88
+
89
+
90
+ if __name__ == "__main__":
91
+ # Windows cmd 下中文不乱码;Linux 为 no-op
92
+ InitConsoleUtf8()
93
+ raise SystemExit(main(sys.argv[1:]))
@@ -0,0 +1,60 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ 示例 02 — 远程 Lua 脚本(project/runScript)
4
+
5
+ 【目的】
6
+ 向控制器下发一段 Lua 源码及可选全局变量字典,由控制器解释执行。
7
+
8
+ 【前置条件】
9
+ - 已进入远程模式(本示例调用 enter_remote_mode_via_auto)
10
+ - Lua 语法与控制器内置 API 匹配(如 movej 等)
11
+
12
+ 【涉及协议】
13
+ - TCP ``project/runScript``:db 含脚本文本与 vars
14
+
15
+ 【运行】
16
+ PYTHONPATH=src python examples/02_run_script.py --robot <IP>
17
+
18
+ 【注意】
19
+ - 示例脚本含 movej,会运动;请按现场修改 lua_code
20
+ - vars 键名须符合控制器变量命名规则
21
+ """
22
+ from __future__ import annotations
23
+
24
+ import argparse
25
+ import sys
26
+
27
+ from codroid import CodroidControlInterface, InitConsoleUtf8, PrintBanner
28
+
29
+
30
+ def main(argv: list[str]) -> int:
31
+ p = argparse.ArgumentParser(description="Run remote Lua script")
32
+ p.add_argument("--robot", default="192.168.8.136", help="控制器 IP")
33
+ args = p.parse_args(argv)
34
+
35
+ PrintBanner("02 — Run script", subtitle=args.robot)
36
+
37
+ # 下发到控制器的 Lua 源码(字符串);换行用 \\n
38
+ lua_code = "print('Hello Codroid')\nmovej([0,0,0,0,0,0])"
39
+ # 与脚本一起传入的共享变量(控制器侧可见)
40
+ vars_data = {"v1": 100, "v2": "test"}
41
+
42
+ try:
43
+ with CodroidControlInterface(host=args.robot) as robot:
44
+ robot.EnterRemoteModeViaAuto()
45
+ print("发送脚本 / Sending script...")
46
+ res = robot.RunScript(lua_code, vars=vars_data)
47
+ if res.is_success:
48
+ print("脚本请求已发送 / Script request sent")
49
+ else:
50
+ # res.err 非空表示控制器拒绝或执行报错
51
+ print(f"失败 / Failed: {res.err}", file=sys.stderr)
52
+ return 1
53
+ except KeyboardInterrupt:
54
+ return 130
55
+ return 0
56
+
57
+
58
+ if __name__ == "__main__":
59
+ InitConsoleUtf8()
60
+ raise SystemExit(main(sys.argv[1:]))
@@ -1,12 +1,23 @@
1
1
  #!/usr/bin/env python3
2
2
  """
3
- 工程控制:运行、暂停、恢复、停止、按索引启动。
3
+ 示例 03 — 工程运行控制(运行 / 暂停 / 恢复 / 停止 / 按索引启动)
4
4
 
5
- 用法:
6
- PYTHONPATH=src python examples/03_run_project.py
7
- PYTHONPATH=src python examples/03_run_project.py --robot 192.168.8.136
5
+ 【目的】
6
+ 演示与示教器工程相关的 TCP 指令序列,便于集成 MES/上位机调度。
8
7
 
9
- 彩色横幅(可选): pip install codroid-robot-sdk[color] 或 pip install colorama
8
+ 【前置条件】
9
+ - 控制器内存在对应工程(--project-id 默认 projectluademo)
10
+ - 远程模式
11
+
12
+ 【涉及协议】
13
+ - project/run、pause、resume、stop、runByIndex 等(见 PROTOCOL_LINE_BY_LINE.md)
14
+
15
+ 【运行】
16
+ PYTHONPATH=src python examples/03_run_project.py --robot <IP>
17
+
18
+ 【注意】
19
+ - 每步之间有 --step-sleep 间隔,便于观察示教器状态
20
+ - 不传工程名时 run_project 可能失败,请按现场修改 --project-id
10
21
  """
11
22
  from __future__ import annotations
12
23
 
@@ -14,7 +25,7 @@ import argparse
14
25
  import sys
15
26
  import time
16
27
 
17
- from codroid import CodroidControlInterface, PrintBanner
28
+ from codroid import CodroidControlInterface, InitConsoleUtf8, PrintBanner
18
29
 
19
30
 
20
31
  def main(argv: list[str]) -> int:
@@ -33,29 +44,31 @@ def main(argv: list[str]) -> int:
33
44
 
34
45
  try:
35
46
  with CodroidControlInterface(host=args.robot) as robot:
36
- robot.enter_remote_mode_via_auto()
47
+ robot.EnterRemoteModeViaAuto()
37
48
 
38
- res = robot.run_project(args.project_id)
49
+ # 按工程名启动
50
+ res = robot.Run(args.project_id)
39
51
  print("运行 / run:", "ok" if res.is_success else res.err)
40
52
  time.sleep(args.step_sleep)
41
53
 
42
- res = robot.pause_project()
54
+ res = robot.PauseProject()
43
55
  print("暂停 / pause:", "ok" if res.is_success else res.err)
44
56
  time.sleep(args.step_sleep)
45
57
 
46
- res = robot.resume_project()
58
+ res = robot.ResumeProject()
47
59
  print("恢复 / resume:", "ok" if res.is_success else res.err)
48
60
  time.sleep(args.step_sleep)
49
61
 
50
- res = robot.stop_project()
62
+ res = robot.StopProject()
51
63
  print("停止 / stop:", "ok" if res.is_success else res.err)
52
64
  time.sleep(args.step_sleep)
53
65
 
54
- res = robot.run_project_by_index(args.index)
66
+ # 按索引启动(与示教器工程列表顺序相关)
67
+ res = robot.RunByIndex(args.index)
55
68
  print("按索引启动 / by_index:", "ok" if res.is_success else res.err)
56
69
  time.sleep(args.step_sleep)
57
70
 
58
- res = robot.stop_project()
71
+ res = robot.StopProject()
59
72
  print("再次停止 / stop:", "ok" if res.is_success else res.err)
60
73
  except KeyboardInterrupt:
61
74
  return 130
@@ -63,4 +76,5 @@ def main(argv: list[str]) -> int:
63
76
 
64
77
 
65
78
  if __name__ == "__main__":
79
+ InitConsoleUtf8()
66
80
  raise SystemExit(main(sys.argv[1:]))