codroid-robot-sdk 2.0.0__tar.gz → 2.1.0__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 (45) hide show
  1. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.0}/.gitignore +3 -1
  2. codroid_robot_sdk-2.1.0/CHANGELOG.md +30 -0
  3. codroid_robot_sdk-2.1.0/PKG-INFO +208 -0
  4. codroid_robot_sdk-2.1.0/README.md +181 -0
  5. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.0}/examples/01_basic_usage.py +34 -9
  6. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.0}/examples/02_run_script.py +21 -6
  7. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.0}/examples/03_run_project.py +20 -6
  8. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.0}/examples/04_global_value.py +18 -6
  9. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.0}/examples/05_rs485.py +21 -6
  10. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.0}/examples/06_jog_mode.py +28 -7
  11. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.0}/examples/07_move_to.py +41 -13
  12. codroid_robot_sdk-2.1.0/examples/08_move.py +124 -0
  13. codroid_robot_sdk-2.1.0/examples/09_move_path.py +97 -0
  14. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.0}/examples/10_control_commands.py +19 -6
  15. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.0}/examples/11_io_demo.py +18 -6
  16. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.0}/examples/12_register_demo.py +20 -6
  17. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.0}/examples/13_cri_realtime.py +20 -6
  18. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.0}/examples/codroid_cri_test.py +41 -14
  19. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.0}/examples/codroid_test.py +49 -23
  20. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.0}/pyproject.toml +1 -1
  21. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.0}/src/codroid/Codroid.py +241 -109
  22. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.0}/src/codroid/__about__.py +1 -1
  23. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.0}/src/codroid/__init__.py +10 -0
  24. codroid_robot_sdk-2.1.0/src/codroid/console_utf8.py +31 -0
  25. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.0}/src/codroid/define.py +306 -48
  26. codroid_robot_sdk-2.1.0/src/codroid/robot_motion.py +84 -0
  27. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.0}/src/codroid/types.py +8 -0
  28. codroid_robot_sdk-2.1.0/update1.md +439 -0
  29. codroid_robot_sdk-2.0.0/PKG-INFO +0 -158
  30. codroid_robot_sdk-2.0.0/README.md +0 -132
  31. codroid_robot_sdk-2.0.0/examples/08_move.py +0 -71
  32. codroid_robot_sdk-2.0.0/examples/09_move_path.py +0 -73
  33. codroid_robot_sdk-2.0.0/plan.md +0 -385
  34. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.0}/LICENSE.txt +0 -0
  35. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.0}/mkdocs.yml +0 -0
  36. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.0}/src/codroid/async_tcp_client.py +0 -0
  37. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.0}/src/codroid/client.py +0 -0
  38. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.0}/src/codroid/console.py +0 -0
  39. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.0}/src/codroid/cri_realtime_dispatcher.py +0 -0
  40. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.0}/src/codroid/cri_realtime_packet_parser.py +0 -0
  41. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.0}/src/codroid/exceptions.py +0 -0
  42. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.0}/src/codroid/publish.py +0 -0
  43. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.0}/src/codroid/py.typed +0 -0
  44. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.0}/src/codroid/trajectory.py +0 -0
  45. {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.0}/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,30 @@
1
+ # Changelog
2
+
3
+ ## 2.1.0 — 运动 API 类型化(Breaking)
4
+
5
+ 与 C++ SDK v2.1.1 / `update1.md` 对齐。
6
+
7
+ ### Added
8
+
9
+ - `JointPoint`、`CartesianPoint`、`MoveInstruction` 及工厂(`Degrees`、`MmDeg`、`MmDegWithRef`、`MovJ`/`MovL`/…)
10
+ - `pack_move_point` / `pack_instruction`(`jp` 优先;笛卡尔缺省 `rj=[20,…,20]`)
11
+ - 门面 API:`MovJ`、`MovL`、`MovC`、`MovCircle`、`Move`、`MoveTo`、`MoveToHeartbeat`
12
+ - `MoveTarget.Joint` / `MoveTarget.Cartesian`(别名 `MoveToTarget`)
13
+ - `InitConsoleUtf8()`(Windows 控制台 UTF-8)
14
+
15
+ ### Changed
16
+
17
+ - `MovePoint.to_dict()` 经统一打包逻辑,仅 `cp` 时 JSON 会带默认 `rj`
18
+ - 示例与 `codroid_test` 运动段改用类型化 API
19
+
20
+ ### Deprecated
21
+
22
+ - `move_j` / `move_l` / `move_c` / `move_circle` / `execute_path`(请改用 PascalCase 门面)
23
+ - 直接 `MovePoint(jp=…)` 作业务目标(请改用 `JointPoint` / `CartesianPoint`)
24
+
25
+ ### Migration
26
+
27
+ 1. 程序入口首行:`InitConsoleUtf8()`
28
+ 2. 关节目标 → `JointPoint.Degrees([...])` + `MovJ` / `MoveInstruction.MovJ`
29
+ 3. TCP 目标 → `CartesianPoint.MmDeg` 或 `MmDegWithRef(pose, cri_joint)`
30
+ 4. 多段路径 → `Move([MoveInstruction.MovJ(...), ...])`
@@ -0,0 +1,208 @@
1
+ Metadata-Version: 2.4
2
+ Name: codroid-robot-sdk
3
+ Version: 2.1.0
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.to_remote()
75
+ robot.switch_on()
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.0)**:请勿再用 `MovePoint(jp=...)` 作业务入口;`move_j` / `move_l` 已废弃,见 [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.to_remote()
155
+ robot.switch_on()
156
+ ```
157
+
158
+ ## 示例
159
+
160
+ ```bash
161
+ PYTHONPATH=src python examples/08_move.py --robot 192.168.8.136
162
+ PYTHONPATH=src python examples/codroid_test.py motion
163
+ PYTHONPATH=src python examples/codroid_test.py s20
164
+ ```
165
+
166
+ 寄存器与 S20 运动常量见仓库根目录 `AGENTS.md` §5.1。
167
+
168
+ ## 常见问题
169
+
170
+ ### `ModuleNotFoundError: No module named codroid`
171
+
172
+ 未在当前 Python 环境安装 SDK。重新执行:
173
+
174
+ ```bash
175
+ pip install codroid-robot-sdk
176
+ ```
177
+
178
+ ### 脚本无响应或连接失败
179
+
180
+ - 检查控制器 IP 与端口配置。
181
+ - 检查本机与控制器网络连通性、防火墙策略。
182
+ - 确认控制器处于可远程控制状态。
183
+
184
+ ## 项目架构
185
+
186
+ ```text
187
+ src/codroid/
188
+ ├── __init__.py # 公开 API 导出(含 __version__)
189
+ ├── __about__.py # 版本号
190
+ ├── Codroid.py # CodroidSession / CodroidControlInterface
191
+ ├── client.py # CodroidClient
192
+ ├── async_tcp_client.py # JsonStreamClient、TransportClient
193
+ ├── define.py # DTO / 常量(JointPoint、MoveInstruction 等)
194
+ ├── robot_motion.py # pack_move_point / pack_instruction
195
+ ├── types.py # DTO 再导出
196
+ ├── exceptions.py # 异常定义
197
+ ├── publish.py # 发布订阅模型
198
+ ├── trajectory.py # 轨迹生成
199
+ ├── cri_realtime_packet_parser.py # CRI UDP 数据解析
200
+ ├── cri_realtime_dispatcher.py # CRI 实时控制下发
201
+ ├── console.py # PrintBanner
202
+ ├── console_utf8.py # InitConsoleUtf8
203
+ └── utils.py # 通用工具
204
+ ```
205
+
206
+ ## 许可证
207
+
208
+ 本项目采用 [MIT](https://spdx.org/licenses/MIT.html) 许可证。
@@ -0,0 +1,181 @@
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.to_remote()
48
+ robot.switch_on()
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.0)**:请勿再用 `MovePoint(jp=...)` 作业务入口;`move_j` / `move_l` 已废弃,见 [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.to_remote()
128
+ robot.switch_on()
129
+ ```
130
+
131
+ ## 示例
132
+
133
+ ```bash
134
+ PYTHONPATH=src python examples/08_move.py --robot 192.168.8.136
135
+ PYTHONPATH=src python examples/codroid_test.py motion
136
+ PYTHONPATH=src python examples/codroid_test.py s20
137
+ ```
138
+
139
+ 寄存器与 S20 运动常量见仓库根目录 `AGENTS.md` §5.1。
140
+
141
+ ## 常见问题
142
+
143
+ ### `ModuleNotFoundError: No module named codroid`
144
+
145
+ 未在当前 Python 环境安装 SDK。重新执行:
146
+
147
+ ```bash
148
+ pip install codroid-robot-sdk
149
+ ```
150
+
151
+ ### 脚本无响应或连接失败
152
+
153
+ - 检查控制器 IP 与端口配置。
154
+ - 检查本机与控制器网络连通性、防火墙策略。
155
+ - 确认控制器处于可远程控制状态。
156
+
157
+ ## 项目架构
158
+
159
+ ```text
160
+ src/codroid/
161
+ ├── __init__.py # 公开 API 导出(含 __version__)
162
+ ├── __about__.py # 版本号
163
+ ├── Codroid.py # CodroidSession / CodroidControlInterface
164
+ ├── client.py # CodroidClient
165
+ ├── async_tcp_client.py # JsonStreamClient、TransportClient
166
+ ├── define.py # DTO / 常量(JointPoint、MoveInstruction 等)
167
+ ├── robot_motion.py # pack_move_point / pack_instruction
168
+ ├── types.py # DTO 再导出
169
+ ├── exceptions.py # 异常定义
170
+ ├── publish.py # 发布订阅模型
171
+ ├── trajectory.py # 轨迹生成
172
+ ├── cri_realtime_packet_parser.py # CRI UDP 数据解析
173
+ ├── cri_realtime_dispatcher.py # CRI 实时控制下发
174
+ ├── console.py # PrintBanner
175
+ ├── console_utf8.py # InitConsoleUtf8
176
+ └── utils.py # 通用工具
177
+ ```
178
+
179
+ ## 许可证
180
+
181
+ 本项目采用 [MIT](https://spdx.org/licenses/MIT.html) 许可证。
@@ -1,12 +1,26 @@
1
1
  #!/usr/bin/env python3
2
2
  """
3
- 基础示例:连接、远程、上使能、关节运动,并打印 CRI 缓存中的关节角。
3
+ 示例 01 — 最简联调流程(连接 → 远程 → 使能 → movJ → CRI 打印)
4
4
 
5
- 用法:
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
+ 【运行】
6
18
  PYTHONPATH=src python examples/01_basic_usage.py
7
19
  PYTHONPATH=src python examples/01_basic_usage.py --robot 192.168.8.136
8
20
 
9
- 彩色横幅(可选): pip install codroid-robot-sdk[color] 或 pip install colorama
21
+ 【注意】
22
+ - 会实际运动机器人,请在安全空间内运行
23
+ - ``JointPoint.Degrees`` 表示六轴关节角(度),勿与 TCP 位姿混用
10
24
  """
11
25
  from __future__ import annotations
12
26
 
@@ -14,13 +28,14 @@ import argparse
14
28
  import sys
15
29
  import time
16
30
 
17
- from codroid import CodroidControlInterface, MovePoint, PrintBanner
31
+ from codroid import CodroidControlInterface, InitConsoleUtf8, JointPoint, PrintBanner
18
32
 
19
33
 
20
34
  def main(argv: list[str]) -> int:
35
+ # ---------- 命令行:现场改 IP / 本机 CRI 绑定 ----------
21
36
  p = argparse.ArgumentParser(description="Basic connect, moveJ, CRI cache")
22
37
  p.add_argument("--robot", default="192.168.8.136", help="控制器 IP")
23
- p.add_argument("--local-ip", default="192.168.8.150", help="本机 IP(CRI 推送)")
38
+ p.add_argument("--local-ip", default="192.168.8.150", help="本机 IP(CRI 推送目标)")
24
39
  p.add_argument(
25
40
  "--udp-port",
26
41
  type=int,
@@ -31,27 +46,34 @@ def main(argv: list[str]) -> int:
31
46
 
32
47
  PrintBanner("01 — Basic usage", subtitle=f"{args.robot} CRI → {args.local_ip}:{args.udp_port}")
33
48
 
49
+ # with 退出时自动 Disconnect,避免 TCP/UDP 泄漏
34
50
  with CodroidControlInterface(
35
51
  host=args.robot,
36
52
  local_ip=args.local_ip,
37
53
  udp_port=args.udp_port,
38
54
  ) as robot:
55
+ # 典型上电顺序:先自动再远程(与 C# ConnectRemoteAndSwitchOn 子步骤一致)
39
56
  robot.enter_remote_mode_via_auto()
40
57
  robot.switch_on()
58
+
59
+ # 后台线程收 CRI UDP,结果写入 robot.cri_cache(线程安全快照)
41
60
  robot._start_cri_receiver()
42
61
  robot.start_cri_data_push(ip=args.local_ip, port=args.udp_port)
43
62
 
44
63
  try:
45
- p1 = MovePoint(jp=[0, 0, 90, 0, 90, 0])
46
- p2 = MovePoint(jp=[0, 0, 0, 0, 0, 0])
64
+ # 类型化目标:明确是「关节角」而非 TCP
65
+ p1 = JointPoint.Degrees([0, 0, 90, 0, 90, 0])
66
+ p2 = JointPoint.Degrees([0, 0, 0, 0, 0, 0])
47
67
  for _ in range(3):
48
- robot.move_j(p1, 60, 120)
49
- robot.move_j(p2, 60, 120)
68
+ # MovJ(target, speed, acceleration);单位:度、%/s 等按控制器约定
69
+ robot.MovJ(p1, 60, 120)
70
+ robot.MovJ(p2, 60, 120)
50
71
 
51
72
  PrintBanner("CRI cache loop", subtitle="Ctrl+C 退出")
52
73
  while True:
53
74
  data = robot.cri_cache
54
75
  if data:
76
+ # joint_pos / is_moving 来自 CRI 解析(已是度、mm 等对外单位)
55
77
  print(f"关节角 / joint_pos: {data.joint_pos}")
56
78
  print(f"运动中 / is_moving: {data.status.is_moving}")
57
79
  time.sleep(0.1)
@@ -59,10 +81,13 @@ def main(argv: list[str]) -> int:
59
81
  print("已中断 / Interrupted", file=sys.stderr)
60
82
  return 130
61
83
  finally:
84
+ # 停止推送,释放控制器侧推送任务
62
85
  robot.stop_cri_data_push(ip=args.local_ip, port=args.udp_port)
63
86
 
64
87
  return 0
65
88
 
66
89
 
67
90
  if __name__ == "__main__":
91
+ # Windows cmd 下中文不乱码;Linux 为 no-op
92
+ InitConsoleUtf8()
68
93
  raise SystemExit(main(sys.argv[1:]))
@@ -1,19 +1,30 @@
1
1
  #!/usr/bin/env python3
2
2
  """
3
- 通过 ``project/runScript`` 下发 Lua 与共享变量。
3
+ 示例 02 远程 Lua 脚本(project/runScript)
4
4
 
5
- 用法:
6
- PYTHONPATH=src python examples/02_run_script.py
7
- PYTHONPATH=src python examples/02_run_script.py --robot 192.168.8.136
5
+ 【目的】
6
+ 向控制器下发一段 Lua 源码及可选全局变量字典,由控制器解释执行。
8
7
 
9
- 彩色横幅(可选): pip install codroid-robot-sdk[color] 或 pip install colorama
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 键名须符合控制器变量命名规则
10
21
  """
11
22
  from __future__ import annotations
12
23
 
13
24
  import argparse
14
25
  import sys
15
26
 
16
- from codroid import CodroidControlInterface, PrintBanner
27
+ from codroid import CodroidControlInterface, InitConsoleUtf8, PrintBanner
17
28
 
18
29
 
19
30
  def main(argv: list[str]) -> int:
@@ -23,7 +34,9 @@ def main(argv: list[str]) -> int:
23
34
 
24
35
  PrintBanner("02 — Run script", subtitle=args.robot)
25
36
 
37
+ # 下发到控制器的 Lua 源码(字符串);换行用 \\n
26
38
  lua_code = "print('Hello Codroid')\nmovej([0,0,0,0,0,0])"
39
+ # 与脚本一起传入的共享变量(控制器侧可见)
27
40
  vars_data = {"v1": 100, "v2": "test"}
28
41
 
29
42
  try:
@@ -34,6 +47,7 @@ def main(argv: list[str]) -> int:
34
47
  if res.is_success:
35
48
  print("脚本请求已发送 / Script request sent")
36
49
  else:
50
+ # res.err 非空表示控制器拒绝或执行报错
37
51
  print(f"失败 / Failed: {res.err}", file=sys.stderr)
38
52
  return 1
39
53
  except KeyboardInterrupt:
@@ -42,4 +56,5 @@ def main(argv: list[str]) -> int:
42
56
 
43
57
 
44
58
  if __name__ == "__main__":
59
+ InitConsoleUtf8()
45
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:
@@ -35,6 +46,7 @@ def main(argv: list[str]) -> int:
35
46
  with CodroidControlInterface(host=args.robot) as robot:
36
47
  robot.enter_remote_mode_via_auto()
37
48
 
49
+ # 按工程名启动
38
50
  res = robot.run_project(args.project_id)
39
51
  print("运行 / run:", "ok" if res.is_success else res.err)
40
52
  time.sleep(args.step_sleep)
@@ -51,6 +63,7 @@ def main(argv: list[str]) -> int:
51
63
  print("停止 / stop:", "ok" if res.is_success else res.err)
52
64
  time.sleep(args.step_sleep)
53
65
 
66
+ # 按索引启动(与示教器工程列表顺序相关)
54
67
  res = robot.run_project_by_index(args.index)
55
68
  print("按索引启动 / by_index:", "ok" if res.is_success else res.err)
56
69
  time.sleep(args.step_sleep)
@@ -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:]))
@@ -1,19 +1,29 @@
1
1
  #!/usr/bin/env python3
2
2
  """
3
- 增量保存全局变量(整数、字符串、列表、字典)。
3
+ 示例 04 — 全局变量增量保存(globalVar/save)
4
4
 
5
- 用法:
6
- PYTHONPATH=src python examples/04_global_value.py
7
- PYTHONPATH=src python examples/04_global_value.py --robot 192.168.8.136
5
+ 【目的】
6
+ 演示 ``GlobalVariable`` 包装不同类型(int/str/list/dict)并批量写入控制器。
8
7
 
9
- 彩色横幅(可选): pip install codroid-robot-sdk[color] 或 pip install colorama
8
+ 【前置条件】
9
+ - 远程模式
10
+ - 变量名合法(字母数字下划线等,见 SDK 校验)
11
+
12
+ 【涉及协议】
13
+ - TCP globalVar/save:每个变量含 val(JSON 字符串)与可选 nm(备注)
14
+
15
+ 【运行】
16
+ PYTHONPATH=src python examples/04_global_value.py --robot <IP>
17
+
18
+ 【注意】
19
+ - save_global_vars 为增量保存,不会删除未出现在字典中的其它全局变量
10
20
  """
11
21
  from __future__ import annotations
12
22
 
13
23
  import argparse
14
24
  import sys
15
25
 
16
- from codroid import CodroidControlInterface, GlobalVariable, PrintBanner
26
+ from codroid import CodroidControlInterface, GlobalVariable, InitConsoleUtf8, PrintBanner
17
27
 
18
28
 
19
29
  def main(argv: list[str]) -> int:
@@ -23,6 +33,7 @@ def main(argv: list[str]) -> int:
23
33
 
24
34
  PrintBanner("04 — Global variables", subtitle=args.robot)
25
35
 
36
+ # 键为控制器侧全局变量名;value 为 GlobalVariable(value=..., note=...)
26
37
  vars_to_save = {
27
38
  "v_int": GlobalVariable(value=1024, note="整数示例"),
28
39
  "v_str": GlobalVariable(value="Codroid", note="字符串示例"),
@@ -49,4 +60,5 @@ def main(argv: list[str]) -> int:
49
60
 
50
61
 
51
62
  if __name__ == "__main__":
63
+ InitConsoleUtf8()
52
64
  raise SystemExit(main(sys.argv[1:]))