codroid-robot-sdk 2.1.1__tar.gz → 2.1.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- codroid_robot_sdk-2.1.2/.claude/settings.local.json +11 -0
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/.gitignore +2 -3
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/CHANGELOG.md +14 -1
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/PKG-INFO +29 -1
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/README.md +28 -0
- codroid_robot_sdk-2.1.2/docs/01-quick-start.md +160 -0
- codroid_robot_sdk-2.1.2/docs/02-concepts.md +167 -0
- codroid_robot_sdk-2.1.2/docs/03-api-reference-codroidclient.md +945 -0
- codroid_robot_sdk-2.1.2/docs/04-api-reference-motion.md +324 -0
- codroid_robot_sdk-2.1.2/docs/05-api-reference-types.md +397 -0
- codroid_robot_sdk-2.1.2/docs/06-api-reference-cri.md +321 -0
- codroid_robot_sdk-2.1.2/docs/07-api-reference-io-register.md +247 -0
- codroid_robot_sdk-2.1.2/docs/08-api-reference-utilities.md +321 -0
- codroid_robot_sdk-2.1.2/docs/CodroidPython-SDK-Manual-v2.1.2-en.md +2939 -0
- codroid_robot_sdk-2.1.2/docs/CodroidPython-SDK-Manual-v2.1.2-en.pdf +0 -0
- codroid_robot_sdk-2.1.2/docs/CodroidPython-SDK-Manual-v2.1.2-zh.md +2938 -0
- codroid_robot_sdk-2.1.2/docs/CodroidPython-SDK-Manual-v2.1.2-zh.pdf +0 -0
- codroid_robot_sdk-2.1.2/docs/README.md +74 -0
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/examples/02_run_script.py +29 -1
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/examples/07_move_to.py +16 -1
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/examples/08_move.py +22 -3
- codroid_robot_sdk-2.1.2/examples/15_sync_motion.py +138 -0
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/pyproject.toml +0 -15
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/src/codroid/Codroid.py +341 -8
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/src/codroid/__about__.py +1 -1
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/src/codroid/__init__.py +1 -0
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/src/codroid/define.py +28 -0
- codroid_robot_sdk-2.1.1/mkdocs.yml +0 -34
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/LICENSE.txt +0 -0
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/examples/01_basic_usage.py +0 -0
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/examples/03_run_project.py +0 -0
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/examples/04_global_value.py +0 -0
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/examples/05_rs485.py +0 -0
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/examples/06_jog_mode.py +0 -0
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/examples/09_move_path.py +0 -0
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/examples/10_control_commands.py +0 -0
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/examples/11_io_demo.py +0 -0
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/examples/12_register_demo.py +0 -0
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/examples/13_cri_realtime.py +0 -0
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/examples/14_robot_parameters.py +0 -0
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/examples/codroid_cri_test.py +0 -0
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/examples/codroid_test.py +0 -0
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/src/codroid/async_tcp_client.py +0 -0
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/src/codroid/client.py +0 -0
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/src/codroid/console.py +0 -0
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/src/codroid/console_utf8.py +0 -0
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/src/codroid/cri_realtime_dispatcher.py +0 -0
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/src/codroid/cri_realtime_packet_parser.py +0 -0
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/src/codroid/exceptions.py +0 -0
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/src/codroid/publish.py +0 -0
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/src/codroid/py.typed +0 -0
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/src/codroid/robot_motion.py +0 -0
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/src/codroid/robot_settings.py +0 -0
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/src/codroid/trajectory.py +0 -0
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/src/codroid/types.py +0 -0
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/src/codroid/utils.py +0 -0
- {codroid_robot_sdk-2.1.1 → codroid_robot_sdk-2.1.2}/update1.md +0 -0
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# Changelog
|
|
2
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
|
+
|
|
3
16
|
## 2.1.1 — 机器人设置 API(协议 19.x)
|
|
4
17
|
|
|
5
18
|
### Added
|
|
@@ -9,7 +22,7 @@
|
|
|
9
22
|
- 仅改默认编号:`SetDefaultPayloadId`、`SetDefaultToolId`、`SetDefaultUserCoordinateId`
|
|
10
23
|
- 先读后改:`SetToolFrame`、`SetPayloadFrame`、`SetUserCoordinateFrame`
|
|
11
24
|
- 整表下发:`SaveToolFrames`、`SavePayloadFrames`、`SaveUserCoordinateFrames`
|
|
12
|
-
- 示例:`examples/14_robot_parameters.py`;`codroid_test.py robotparam`
|
|
25
|
+
- 示例:`examples/14_robot_parameters.py`;`codroid_test.py robotparam`;`examples/08_move.py` 四组合 + MovC
|
|
13
26
|
|
|
14
27
|
### Changed / Breaking
|
|
15
28
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: codroid-robot-sdk
|
|
3
|
-
Version: 2.1.
|
|
3
|
+
Version: 2.1.2
|
|
4
4
|
Summary: Codroid robot controller Python SDK (TCP/CRI, typed motion API)
|
|
5
5
|
Project-URL: Documentation, https://guybod.github.io/CodroidSDK/
|
|
6
6
|
Project-URL: Issues, https://github.com/guybod/CodroidSDK/issues
|
|
@@ -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,6 +131,29 @@ robot.Move(path)
|
|
|
127
131
|
|
|
128
132
|
打包规则:`jp` 优先;仅 `cp` 时若未提供 `rj`,JSON 中带默认 `[20,20,20,20,20,20]`(度)。
|
|
129
133
|
|
|
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
|
+
|
|
130
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
|
|
@@ -159,6 +186,7 @@ with CodroidClient(host="192.168.1.136") as robot:
|
|
|
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
|
|
162
190
|
PYTHONPATH=src python examples/14_robot_parameters.py --robot 192.168.8.136
|
|
163
191
|
PYTHONPATH=src python examples/codroid_test.py motion
|
|
164
192
|
PYTHONPATH=src python examples/codroid_test.py s20
|
|
@@ -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,6 +104,29 @@ robot.Move(path)
|
|
|
100
104
|
|
|
101
105
|
打包规则:`jp` 优先;仅 `cp` 时若未提供 `rj`,JSON 中带默认 `[20,20,20,20,20,20]`(度)。
|
|
102
106
|
|
|
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
|
+
|
|
103
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
|
|
@@ -132,6 +159,7 @@ with CodroidClient(host="192.168.1.136") as robot:
|
|
|
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
|
|
135
163
|
PYTHONPATH=src python examples/14_robot_parameters.py --robot 192.168.8.136
|
|
136
164
|
PYTHONPATH=src python examples/codroid_test.py motion
|
|
137
165
|
PYTHONPATH=src python examples/codroid_test.py s20
|
|
@@ -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` — 错误
|