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.
- {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/.gitignore +3 -1
- codroid_robot_sdk-2.1.1/CHANGELOG.md +52 -0
- codroid_robot_sdk-2.1.1/PKG-INFO +212 -0
- codroid_robot_sdk-2.1.1/README.md +185 -0
- codroid_robot_sdk-2.1.1/examples/01_basic_usage.py +93 -0
- codroid_robot_sdk-2.1.1/examples/02_run_script.py +60 -0
- {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/examples/03_run_project.py +27 -13
- {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/examples/04_global_value.py +20 -8
- codroid_robot_sdk-2.1.1/examples/05_rs485.py +65 -0
- codroid_robot_sdk-2.1.1/examples/06_jog_mode.py +87 -0
- {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/examples/07_move_to.py +43 -15
- codroid_robot_sdk-2.1.1/examples/08_move.py +167 -0
- codroid_robot_sdk-2.1.1/examples/09_move_path.py +97 -0
- {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/examples/10_control_commands.py +26 -13
- {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/examples/11_io_demo.py +24 -12
- codroid_robot_sdk-2.1.1/examples/12_register_demo.py +59 -0
- {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/examples/13_cri_realtime.py +23 -9
- codroid_robot_sdk-2.1.1/examples/14_robot_parameters.py +202 -0
- {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/examples/codroid_cri_test.py +62 -35
- {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/examples/codroid_test.py +104 -56
- {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/pyproject.toml +1 -1
- {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/src/codroid/Codroid.py +382 -259
- {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/src/codroid/__about__.py +1 -1
- {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/src/codroid/__init__.py +14 -1
- {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/src/codroid/client.py +0 -8
- codroid_robot_sdk-2.1.1/src/codroid/console_utf8.py +31 -0
- {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/src/codroid/cri_realtime_dispatcher.py +3 -5
- {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/src/codroid/define.py +303 -49
- codroid_robot_sdk-2.1.1/src/codroid/robot_motion.py +84 -0
- codroid_robot_sdk-2.1.1/src/codroid/robot_settings.py +243 -0
- {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/src/codroid/types.py +8 -0
- codroid_robot_sdk-2.1.1/update1.md +439 -0
- codroid_robot_sdk-2.0.0/PKG-INFO +0 -158
- codroid_robot_sdk-2.0.0/README.md +0 -132
- codroid_robot_sdk-2.0.0/examples/01_basic_usage.py +0 -68
- codroid_robot_sdk-2.0.0/examples/02_run_script.py +0 -45
- codroid_robot_sdk-2.0.0/examples/05_rs485.py +0 -50
- codroid_robot_sdk-2.0.0/examples/06_jog_mode.py +0 -66
- codroid_robot_sdk-2.0.0/examples/08_move.py +0 -71
- codroid_robot_sdk-2.0.0/examples/09_move_path.py +0 -73
- codroid_robot_sdk-2.0.0/examples/12_register_demo.py +0 -45
- codroid_robot_sdk-2.0.0/plan.md +0 -385
- {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/LICENSE.txt +0 -0
- {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/mkdocs.yml +0 -0
- {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/src/codroid/async_tcp_client.py +0 -0
- {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/src/codroid/console.py +0 -0
- {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/src/codroid/cri_realtime_packet_parser.py +0 -0
- {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/src/codroid/exceptions.py +0 -0
- {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/src/codroid/publish.py +0 -0
- {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/src/codroid/py.typed +0 -0
- {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/src/codroid/trajectory.py +0 -0
- {codroid_robot_sdk-2.0.0 → codroid_robot_sdk-2.1.1}/src/codroid/utils.py +0 -0
|
@@ -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
|
+
[](https://pypi.org/project/codroid-robot-sdk)
|
|
33
|
+
[](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
|
+
[](https://pypi.org/project/codroid-robot-sdk)
|
|
6
|
+
[](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
|
-
|
|
7
|
-
PYTHONPATH=src python examples/03_run_project.py --robot 192.168.8.136
|
|
5
|
+
【目的】
|
|
6
|
+
演示与示教器工程相关的 TCP 指令序列,便于集成 MES/上位机调度。
|
|
8
7
|
|
|
9
|
-
|
|
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.
|
|
47
|
+
robot.EnterRemoteModeViaAuto()
|
|
37
48
|
|
|
38
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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:]))
|