教程 07:完整接口总指南
模块概览
导入主要组件
导入错误类
Controller 控制器类
控制器是整个 SDK 的入口点,负责管理 CAN 通信和电机注册。构造函数
Controller(channel="can0")
标准 SocketCAN 传输,适用于大多数场景。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
channel | str | "can0" | CAN 接口名称 |
| 异常 | 说明 |
|---|---|
AbiLoadError | 无法加载底层库 |
CallError | 无法打开 CAN 接口 |
Controller.from_socketcanfd(channel="can0")
CAN-FD 传输,Hexfellow 电机必须使用此方法。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
channel | str | "can0" | CAN-FD 接口名称 |
Controller.from_dm_serial(serial_port="/dev/ttyACM0", baud=921600)
达妙串口桥传输,仅适用于达妙电机。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
serial_port | str | "/dev/ttyACM0" | 串口设备路径 |
baud | int | 921600 | 波特率(达妙固定 921600) |
电机注册方法
add_damiao_motor(motor_id, feedback_id, model)
注册达妙电机。
| 参数 | 类型 | 说明 | 范围 |
|---|---|---|---|
motor_id | int | 命令帧 CAN ID | 0x01 - 0x20 |
feedback_id | int | 反馈帧 CAN ID | 通常 motor_id + 0x10 |
model | str | 电机型号 | 见型号表 |
| 型号字符串 | 电机型号 |
|---|---|
"4310" | DM4310 |
"4340P" | DM4340P |
"6001" | DM6001 |
"6006" | DM6006 |
"8006" | DM8006 |
"8009" | DM8009 |
add_robstride_motor(motor_id, feedback_id, model)
注册 RobStride 电机。
| 参数 | 类型 | 说明 | 范围 |
|---|---|---|---|
motor_id | int | 设备 ID | 1 - 127 |
feedback_id | int | 响应者 ID | 0xFE 或 0xFF |
model | str | 电机型号 | ”rs-00”, “rs-01” 等 |
add_myactuator_motor(motor_id, feedback_id, model)
注册 MyActuator 电机。
add_hightorque_motor(motor_id, feedback_id, model)
注册 HighTorque 电机。
add_hexfellow_motor(motor_id, feedback_id, model)
注册 Hexfellow 电机,必须使用 CAN-FD。
全局操作方法
enable_all()
使能该控制器下的所有电机。
disable_all()
禁用该控制器下的所有电机。
poll_feedback_once()
手动轮询一次反馈(v0.1.6 及更早需要)。
生命周期方法
shutdown()
优雅关闭所有电机。
close_bus()
关闭 CAN 总线连接。
close()
释放所有资源。
Motor 电机类
电机类提供单个电机的所有控制方法。生命周期方法
enable()
使能单个电机。
disable()
禁用单个电机。
clear_error()
清除电机错误状态。
set_zero_position()
将当前位置设置为零点。
close()
释放电机句柄。
模式控制方法
ensure_mode(mode, timeout_ms=1000)
确保电机处于指定模式,如果不是则切换。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
mode | Mode | 必填 | 目标控制模式 |
timeout_ms | int | 1000 | 超时时间(毫秒) |
控制命令方法
send_mit(pos, vel, kp, kd, tau)
MIT 模式控制命令,最灵活的控制方式。
| 参数 | 类型 | 单位 | 说明 | 典型范围 |
|---|---|---|---|---|
pos | float | rad | 目标位置 | -12.566 ~ +12.566 |
vel | float | rad/s | 目标速度 | -30.0 ~ +30.0 |
kp | float | Nm/rad | 位置刚度 | 0.1 ~ 100.0 |
kd | float | Nm·s/rad | 速度阻尼 | 0.01 ~ 10.0 |
tau | float | Nm | 前馈力矩 | -10.0 ~ +10.0 |
send_pos_vel(pos, vlim)
位置-速度模式控制命令。
| 参数 | 类型 | 单位 | 说明 |
|---|---|---|---|
pos | float | rad | 目标位置 |
vlim | float | rad/s | 最大速度限制 |
send_vel(vel)
速度模式控制命令。
| 参数 | 类型 | 单位 | 说明 |
|---|---|---|---|
vel | float | rad/s | 目标速度 |
send_force_pos(pos, vlim, ratio)
力位置模式控制命令,适合夹爪等需要力控制的应用。
| 参数 | 类型 | 单位 | 说明 |
|---|---|---|---|
pos | float | rad | 目标位置 |
vlim | float | rad/s | 最大速度限制 |
ratio | float | - | 力比例(0.0 = 无力,1.0 = 全力) |
反馈方法
request_feedback()
请求电机发送反馈帧。
get_state()
获取缓存的状态,返回 MotorState 或 None。
寄存器访问方法
write_register_u32(rid, value)
写入 32 位无符号整数寄存器。
| 参数 | 类型 | 说明 |
|---|---|---|
rid | int | 寄存器 ID |
value | int | 要写入的值(0 ~ 4294967295) |
get_register_u32(rid, timeout_ms=1000)
读取 32 位无符号整数寄存器。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
rid | int | 必填 | 寄存器 ID |
timeout_ms | int | 1000 | 超时时间(毫秒) |
write_register_f32(rid, value)
写入 32 位浮点数寄存器。
| 参数 | 类型 | 说明 |
|---|---|---|
rid | int | 寄存器 ID |
value | float | 要写入的值 |
get_register_f32(rid, timeout_ms=1000)
读取 32 位浮点数寄存器。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
rid | int | 必填 | 寄存器 ID |
timeout_ms | int | 1000 | 超时时间(毫秒) |
store_parameters()
将当前参数保存到闪存(永久保存)。
set_can_timeout_ms(timeout_ms)
设置 CAN 通信超时时间。
RobStride 专用方法
robstride_ping()
Ping RobStride 电机,获取设备信息。
(device_id: int, responder_id: int)
robstride_set_device_id(new_device_id)
设置 RobStride 电机的设备 ID。
RobStride 参数写入方法
| 参数 | 类型 | 说明 |
|---|---|---|
param_id | int | 参数 ID(如 0x7019) |
value | 根据类型 | 要写入的值 |
RobStride 参数读取方法
Mode 模式枚举
使用示例
模式常量
除了Mode 枚举,还可以使用模块级常量:
MotorState 状态数据类
字段详解
| 字段 | 类型 | 单位 | 说明 | 范围 |
|---|---|---|---|---|
can_id | int | - | 电机 CAN ID | 0x01 - 0x7F |
arbitration_id | int | - | CAN 仲裁 ID | - |
status_code | int | - | 状态码(0=正常) | 0-255 |
pos | float | rad | 电机位置 | -12.566 ~ +12.566 |
vel | float | rad/s | 电机速度 | -30.0 ~ +30.0 |
torq | float | Nm | 电机力矩 | -10.0 ~ +10.0 |
t_mos | float | °C | MOSFET 温度 | 20.0 ~ 100.0 |
t_rotor | float | °C | 转子温度 | 20.0 ~ 100.0 |
使用示例
状态码含义
| 代码 | 含义 | 处理方法 |
|---|---|---|
| 0 | 正常 | 无需处理 |
| 1 | 过压 | 检查电源电压 |
| 2 | 欠压 | 检查电源电压 |
| 3 | 过流 | 减小负载 |
| 4 | MOSFET 过温 | 停止运行,等待冷却 |
| 5 | 转子过温 | 停止运行,等待冷却 |
| 6 | 通信超时 | 检查 CAN 连接 |
Error 错误类
类层次结构
MotorBridgeError
基础异常类,所有 motorbridge 异常的基类。AbiLoadError
底层库加载失败时抛出。CallError
API 调用返回非零状态时抛出。错误处理最佳实践
RegisterSpec 寄存器规格类
使用示例
寄存器常量
寄存器 ID 常量
寄存器表
| RID | 常量名 | 变量名 | 类型 | 说明 | 范围 |
|---|---|---|---|---|---|
| 0 | - | UV_Value | f32 | 欠压保护值 | (10.0, 3.4E38] |
| 2 | - | OT_Value | f32 | 过温保护值 | [80.0, 200) |
| 3 | - | OC_Value | f32 | 过流保护值 | (0.0, 1.0) |
| 7 | RID_MST_ID | MST_ID | u32 | 反馈 ID | [0, 0x7FF] |
| 8 | RID_ESC_ID | ESC_ID | u32 | 电机 ID | [0, 0x7FF] |
| 9 | RID_TIMEOUT | TIMEOUT | u32 | 通信超时(ms) | [0, 2^32-1] |
| 10 | RID_CTRL_MODE | CTRL_MODE | u32 | 控制模式 | [1, 4] |
| 21 | RID_PMAX | PMAX | f32 | 位置映射范围 | (0.0, 3.4E38] |
| 22 | RID_VMAX | VMAX | f32 | 速度映射范围 | (0.0, 3.4E38] |
| 23 | RID_TMAX | TMAX | f32 | 力矩映射范围 | (0.0, 3.4E38] |
| 25 | RID_KP_ASR | KP_ASR | f32 | 速度环 Kp | [0.0, 3.4E38] |
| 26 | RID_KI_ASR | KI_ASR | f32 | 速度环 Ki | [0.0, 3.4E38] |
| 27 | RID_KP_APR | KP_APR | f32 | 位置环 Kp | [0.0, 3.4E38] |
| 28 | RID_KI_APR | KI_APR | f32 | 位置环 Ki | [0.0, 3.4E38] |
完整模板
这是一个包含所有功能的完整模板:厂商规则速查
| 规则 | 说明 |
|---|---|
| 同厂商 → 同控制器 | 同一厂商的电机共享一个 Controller 实例 |
| 不同厂商 → 分开控制器 | 每个厂商需要独立的 Controller |
| Hexfellow 必须用 CAN-FD | 使用 from_socketcanfd() |
| DM 串口仅支持达妙 | from_dm_serial() 只能用于达妙电机 |
版本兼容性
| 版本 | 说明 |
|---|---|
| v0.1.6 及更早 | 需要手动调用 poll_feedback_once() |
| v0.1.7+ | 后台轮询默认启用 |
参见
- Controller API - 控制器详细参考
- Motor API - 电机详细参考
- CLI 参考 - 命令行工具
- 最佳实践 - 生产级模式
- 故障排除 - 常见问题