Standalone ARX-D-CAN Python SDK for Damiao motors over USB2CAN.
Project description
ARX-D-CAN Python SDK
独立的 ARX-D-CAN Python SDK,通过 USB2CAN 串口控制 Damiao 关节电机和
可选夹爪。默认机型包含 6 个机械臂关节;默认串口为 /dev/ttyACM0,波特率为 1000000,控制模式为
POS_VEL。
安装
cd Articore-SDK
python -m pip install .
安装时会自动使用 motor-drive-layer==0.5.1 作为底层电机通信 SDK。
运动学、动力学和末端控制需要 Pinocchio:
python -m pip install ".[dynamics]"
默认 URDF 已打进 wheel,不依赖开发者电脑上的绝对路径。
使用顺序
python -m arx_d_can.examples.example_01_scan_ids --port /dev/ttyACM0
python -m arx_d_can.examples.example_02_read_state --port /dev/ttyACM0
python -m arx_d_can.examples.example_03_clear_faults --port /dev/ttyACM0
python -m arx_d_can.examples.example_04_send_position \
--positions "0,-20,-20,0,0,0" \
--velocity-limits "120,120,120,90,90,90" --port /dev/ttyACM0
python -m arx_d_can.examples.example_04_send_position \
--positions "0,-20,-20,0,0,0" --mode mit \
--velocities "0,0,0,0,0,0" \
--torques "0,0,0,0,0,0" --port /dev/ttyACM0
python -m arx_d_can.examples.example_05_gripper_open_close --port /dev/ttyACM0
python -m arx_d_can.examples.example_06_benchmark_read_rate \
--port /dev/ttyACM0 --target-hz 500 --seconds 5
python -m arx_d_can.examples.example_07_send_joint_trajectory \
"0,-60,-60,0,0,0" --port /dev/ttyACM0 --return-zero
python -m arx_d_can.examples.example_08_return_zero --port /dev/ttyACM0
python -m arx_d_can.examples.example_09_diagnose_status --port /dev/ttyACM0
python -m arx_d_can.examples.example_11_record_and_replay_trajectory \
record trajectory.json --seconds 10 --hz 100 --port /dev/ttyACM0
python -m arx_d_can.examples.example_11_record_and_replay_trajectory \
replay trajectory.json --port /dev/ttyACM0
example_04_send_position.py 直接发送目标,不做插值或回零,并在发送后默认持续
刷新目标。它通过 --mode pv(默认)使用 POS_VEL 位置速度模式,也可通过
--mode mit 使用 MIT 模式;MIT 的 kp/kd 和 PV 的环路参数均读取
所选机型的硬件 YAML。MIT 还可用 --torques 传入每个关节的
前馈力矩,单位为 N·m,并用 --velocities 传入每个关节的目标速度;PV 用
--velocity-limits 覆盖配置
中的各关节最大速度。速度命令行参数单位均为 deg/s。MIT 的速度和力矩未提供时默认
为全零,PV 未提供限速时使用 YAML 中各关节的 vlim。MIT 目标速度是阻尼项输入,
不是最大速度限制;需要严格控制运动速度时应使用示例 07 生成插值轨迹。使用
Ctrl+C 会失能全部电机,停止前必须托住机械臂;
只有显式传入正数 --hold-seconds 时才会定时退出。平滑轨迹使用示例 07,直接回零
使用示例 08。
安全机制
- 任一关节发送失败、明确电机故障或连续 3 次反馈失败时,SDK 锁存故障并尝试 整臂失能。
- 使能后有 2 秒启动宽限;第一帧成功命令之后,超过 0.25 秒没有新命令,软件
看门狗读取实际关节位置并以 100 Hz 进入
SAFE_HOLD,保持手臂和夹爪当前位置。 SAFE_HOLD期间如果保持指令发送失败,会升级为硬故障并尝试整臂失能。- 故障不会自动恢复。确认硬件和空间安全后调用
recover();低层 API 也可以依次 调用clear_fault()、configure()、enable()。 close()总是停止看门狗、尝试失能所有电机并关闭总线。
看门狗参数位于 arx_d_can/config/arx_d_can_dm.yaml 的 safety。它是进程内
软件看门狗,
能处理控制线程卡住或上游停止发命令;它不能覆盖整机掉电、Python 进程被强制
杀死或 USB2CAN 硬件失效。SAFE_HOLD 也不是安全认证功能,生产设备仍需要物理
急停、电机侧通信超时,以及垂直负载场景需要的机械制动或防坠机构。
Python API
import time
from arx_d_can import ArxDCanArm
target = [0.0, -1.047, -1.047, 0.0, 0.0, 0.0]
arm = ArxDCanArm(port="/dev/ttyACM0")
try:
arm.connect()
arm.configure()
arm.enable()
while True:
arm.send_joint_positions(target)
time.sleep(0.01)
finally:
arm.close()
MIT 逐帧增益与纯力矩控制
send_joint_positions(..., torques=...) 中的 torques 是 MIT 前馈力矩。默认仍会
使用机型 YAML 中的 Kp/Kd,因此不是纯力矩控制。可通过 mit_kp、mit_kd 对当前
一帧覆盖各关节增益;不传入时继续使用 YAML 默认值:
arm.send_joint_positions(
positions,
velocities=velocities,
torques=torques,
mit_kp=[20.0, 20.0, 20.0, 5.0, 5.0, 5.0],
mit_kd=[2.0, 2.0, 2.0, 0.5, 0.5, 0.5],
mode="mit",
)
交接阶段可逐帧将 mit_kp、mit_kd 从 YAML 增益平滑降到零。进入纯力矩阶段后,
直接把两个增益设为标量 0;标量会自动应用到全部关节:
arm.send_joint_positions(
positions,
torques=torques,
mit_kp=0,
mit_kd=0,
mode="mit",
)
纯力矩模式没有位置保持能力,必须持续发送经过限幅和安全检查的力矩。命令超时后, SDK 看门狗仍会尝试读取当前位置并恢复安全保持;生产设备还必须具备物理急停和 电机侧保护。
多机型配置
SDK 不再在代码中假定机械臂必须是 6 轴。关节数量、顺序、电机 ID、反馈 ID、 电机型号、MIT/PV 参数、夹爪和 URDF 都来自一个机型 YAML;高层 SDK 与低层驱动 共用同一次解析结果,避免两层加载到不同配置。
内置机型在 arx_d_can/config/models.yaml 注册。以后增加一种随 SDK 发布的机械臂:
- 复制
arx_d_can/config/arx_d_can_dm.yaml,创建该机型自己的 YAML,并修改groups.arm.joints、groups.gripper、各电机参数和 URDF。 - 在
models.yaml的models中增加机型名: YAML文件名。 - 通过
ArxDCanArm(model="机型名")或示例参数--arm-model 机型名选择。
from arx_d_can import ArxDCanArm, available_models
print(available_models())
arm = ArxDCanArm(model="arx_d_can", port="/dev/ttyACM0")
只是本地测试新机械臂时,不必修改注册表,直接传外部 YAML:
arm = ArxDCanArm(config_path="/path/to/my_arm.yaml")
对应的示例命令为 --config-path /path/to/my_arm.yaml。--arm-model 与
--config-path 互斥;没有指定时使用 models.yaml 的 default_model。
若某个电机的正方向与机械臂坐标相反,在该关节配置中设置 direction: -1;
SDK 会同时反转位置、速度和力矩的指令及反馈,其他关节省略该字段即可。
Yunyi V1.0 双臂
Yunyi V1.0 的完整双臂模型位于
arx_d_can/models/yunyi_v1_0.urdf。SDK 另外提供左右单臂 URDF 和两个机型配置,
确保运动学模型与每个 USB2CAN 实际控制的 7 个关节一致:
| 单臂电机 | 型号 | 右臂 CAN/反馈 ID | 左臂 CAN/反馈 ID |
|---|---|---|---|
| joint1~joint2 | 8009 | 0x01~0x02 / 0x11~0x12 | 0x09~0x0A / 0x19~0x1A |
| joint3~joint4 | 4340P | 0x03~0x04 / 0x13~0x14 | 0x0B~0x0C / 0x1B~0x1C |
| joint5~joint7 | 4310 | 0x05~0x07 / 0x15~0x17 | 0x0D~0x0F / 0x1D~0x1F |
| gripper(第 8 个电机) | 4310 | 0x08 / 0x18 | 0x10 / 0x20 |
左右臂使用独立 USB2CAN。当前左臂使用 /dev/ttyACM0,右臂默认使用
/dev/ttyACM1;Linux 设备号发生变化时显式覆盖
port:
right_arm = ArxDCanArm(
model="yunyi_v1_0_right",
port="/dev/ttyACM1",
enable_gripper=True,
)
left_arm = ArxDCanArm(
model="yunyi_v1_0_left",
port="/dev/ttyACM0",
enable_gripper=True,
)
也可以通过所有编号示例单独操作一侧,例如:
python -m arx_d_can.examples.example_02_read_state \
--arm-model yunyi_v1_0_left \
--port /dev/ttyACM0
当前配置将第 8 个 4310 作为一个夹爪电机,机械联动 URDF 中的两根手指。MIT/PV
初始增益沿用现有 ARX 机型的保守参数,不视为 Yunyi 实机最终标定值;首次使能前
应托稳单臂、卸载负载,并逐关节验证方向、零点和增益。左臂 0x09~0x0F 已在
/dev/ttyACM0 实机确认,左臂第 1、4 关节已配置为反向;预留夹爪
0x10/0x20 当前未收到反馈。
维护工具
维护工具与普通示例分开。调零命令会先确认机械臂静止,再把当前位置逐关节写为 零位。每个电机写入后必须连续收到 3 帧新反馈,且状态正常、位置接近零、速度接近 零,才判定成功:
python -m arx_d_can.service_tools.zero_current_position --port /dev/ttyACM0
相同的安全调零流程也提供了编号示例:
python -m arx_d_can.examples.example_10_set_zero_current_position \
--port /dev/ttyACM0
默认只调所选机型的手臂关节;夹爪另加 --include-gripper。其他维护工具:
python -m arx_d_can.service_tools.change_damiao_id --port /dev/ttyACM0
python -m arx_d_can.service_tools.joint_load_probe \
--port /dev/ttyACM0 --joint 4 --amplitude-deg 10 --csv /tmp/joint4.csv
配置
默认机型列表位于 arx_d_can/config/models.yaml;每种机械臂的硬件 ID、反馈 ID、
控制增益、关节分组、夹爪映射和安全参数位于各自的硬件 YAML。默认机型使用
arx_d_can/config/arx_d_can_dm.yaml。VR/ROS 上层已经负责工作空间和 URDF
关节限位;SDK 安全层负责通信故障、命令超时保持和退出失能。
开发验证
源码采用根目录 arx_d_can/ 包布局。安装开发依赖后可直接运行测试和构建:
python -m pip install ".[dev]"
python -m pytest --import-mode=importlib --rootdir=tests tests
python -m pip wheel --no-deps . --wheel-dir dist
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file arx_d_can-0.2.1.tar.gz.
File metadata
- Download URL: arx_d_can-0.2.1.tar.gz
- Upload date:
- Size: 94.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.20
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
540a67253bf37f2740b4bc2d4eec4461458bdc6408805709efec345d97acf26f
|
|
| MD5 |
19217ca686add3559c63231ee250a688
|
|
| BLAKE2b-256 |
57d9f96290d127b742990230ffdca7a423982e3f8a046937ff0a4dd6d412576b
|
File details
Details for the file arx_d_can-0.2.1-py3-none-any.whl.
File metadata
- Download URL: arx_d_can-0.2.1-py3-none-any.whl
- Upload date:
- Size: 104.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.20
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
97242edcb8aa232cfc44d833c42f7e7d29b6a8c8e6e623cd9b7380228934924c
|
|
| MD5 |
d5f92aae1f051b949abef8e588891e7a
|
|
| BLAKE2b-256 |
2b5f484b9a2ce49d779a78649b8160b15c59dc84f9ab3a62e027f667660fd986
|