Mini_ODrive CAN协议
- ODrive CAN Simple 协议使用标准的 11 位消息标识符(ID)。
- node_id: 用户为ODrive设置的节点 ID。
- cmd_id: 命令 ID,用于标识消息类型。所有可用命令都列在下文中。
node_id = 0 # 必须与上位机设置的CAN_ID相同
cmd_id = 0x01 # 命令ID,下文中有
message_id = (node_id << 5 | cmd_id) //最终需要发送的ID
- 前缀为
Set_
的消息 是主机可以发送到 ODrive 的消息。 - 前缀为
Get_
的消息是 ODrive 可以发送到主机的消息。这些消息可以作为can心跳 启用,也可以由 master 主动请求。如用户需要主动请求消息,主设备发送消息时需要设置 RTR 位的消息(远程帧),ODrive 使用相同的 ID 和相应的有效负载进行响应。 - 所有值都以 little endian (又名 Intel 格式,又名最低有效字节在前) 编码,小端序模式。
- 浮点数使用标准 IEEE 754 浮点格式进行编码。
CAN报文
CMD ID | 消息名称 | 方向 | 内容 |
---|---|---|---|
0x000 | Get_Version | ODrive → Host | Protocol_Version Hw_Version_Major Hw_Version_Minor Hw_Version_Variant Fw_Version_Major Fw_Version_Minor Fw_Version_Revision Fw_Version_Unreleased |
0x001 | Heartbeat | ODrive → Host | Axis_Error Axis_State System_Error Traj_Down_Flags |
0x002 | Estop | Host → ODrive | |
0x003 | Get_Error | ODrive → Host | Axis.Error_ |
0x004 | RxSdo | Host → ODrive | Opcode Endpoint_ID Reserved Value |
0x005 | TxSdo | ODrive → Host | Reserved0 Endpoint_ID Reserved1 Value |
0x006 | Set_Node_ID | Host → ODrive | Node_ID |
0x007 | Set_Axis_State | Host → ODrive | Axis_Requested_State |
0x009 | Get_Encoder_Estimates | ODrive → Host | Pos_Estimate Vel_Estimate |
0x00b | Set_Controller_Mode | Host → ODrive | Control_Mode Input_Mode |
0x00c | Set_Input_Pos | Host → ODrive | Input_Pos Vel_FF Torque_FF |
0x00d | Set_Input_Vel | Host → ODrive | Input_Vel Input_Torque_FF |
0x00e | Set_Input_Torque | Host → ODrive | Input_Torque |
0x00f | Set_Limits | Host → ODrive | Velocity_Limit Current_Limit |
0x011 | Set_Traj_Vel_Limit | Host → ODrive | Traj_Vel_Limit |
0x012 | Set_Traj_Accel_Limits | Host → ODrive | Traj_Accel_Limit Traj_Decel_Limit |
0x013 | Set_Traj_Inertia | Host → ODrive | Traj_Inertia |
0x014 | Get_Iq | ODrive → Host | Iq_Setpoint Iq_Measured |
0x015 | Get_Temperature | ODrive → Host | FET_Temperature Motor_Temperature |
0x016 | Reboot | Host → ODrive | Action |
0x017 | Get_Bus_Voltage_Current | ODrive → Host | Bus_Voltage Bus_Current |
0x018 | Clear_Errors | Host → ODrive | Identify |
0x019 | Set_Absolute_Position | Host → ODrive | Position |
0x01a | Set_Pos_Gain | Host → ODrive | Pos_Gain |
0x01b | Set_Vel_Gains | Host → ODrive | Vel_Gain Vel_Integrator_Gain |
0x01c | Get_Torques | ODrive → Host | Torque_Target Torque_Estimate |
0x01d | Get_Powers | ODrive → Host | Electrical_Power Mechanical_Power |
CAN 心跳消息
可以将 ODrive 配置为在没有请求的情况下定期发送一些消息。这是通过在上位机中设置所需的发送间隔来完成的。
设置单位为 ms
,设置为0则表示禁用心跳。
消息 | 配置 (.axis.config.can.[...]) | 默认值 |
---|---|---|
Heartbeat | heartbeat_msg_rate_ms | 100 ms |
Get_Encoder_Estimates | encoder_msg_rate_ms | 10 ms |
Get_Iq | iq_msg_rate_ms | 关闭 |
Get_Error | error_msg_rate_ms | 关闭 |
Get_Temperature | temperature_msg_rate_ms | 关闭 |
Get_Bus_Voltage_Current | bus_voltage_msg_rate_ms | 关闭 |
Get_Torques | torques_msg_rate_ms | 关闭 |
看门狗
ODrive 的看门狗定时器可用作安全功能,在 CAN 通信中断时释放电机。
看门狗会通过每条 Set_Input_Pos
、Set_Input_Vel
和 Set_Input_Torque
消息以及通过 Set_Axis_State
进入闭环模式时重置。
消息
Get_Version
- 命令:0x00
- 方向:ODrive → Host
- 帧类型:远程帧
起始字节 | 名称 | 类型 | 描述 |
---|---|---|---|
0 | Protocol_Version | uint8 | 恒定为1 |
1 | Hw_Version_Major | uint8 | 硬件版本信息 |
2 | Hw_Version_Minor | uint8 | 硬件版本信息 |
3 | Hw_Version_Variant | uint8 | 硬件版本信息 |
4 | Fw_Version_Major | uint8 | 软件版本信息 |
5 | Fw_Version_Minor | uint8 | 软件版本信息 |
6 | Fw_Version_Revision | uint8 | 软件版本信息 |
7 | Fw_Version_Unreleased | uint8 | 恒定为1 |
Heartbeat
- 命令:0x01
- 方向:ODrive → Host
起始字节 | 名称 | 类型 | 描述 |
---|---|---|---|
0 | Axis_Error | uint32 | Axis 错误信息 |
4 | Axis_State | uint8 | 系统状态 |
6 | System_Error | uint8 | 系统错误 |
7 | Trajectory_Done_Flag | uint8 | 梯形补偿标志 |
Axis_State 枚举如下:
enum AxisState {
AXIS_STATE_UNDEFINED = 0,
AXIS_STATE_IDLE = 1, //释放电机
AXIS_STATE_STARTUP_SEQUENCE = 2,
AXIS_STATE_FULL_CALIBRATION_SEQUENCE = 3, //完整参数校准
AXIS_STATE_MOTOR_CALIBRATION = 4, //电机校准
AXIS_STATE_ENCODER_INDEX_SEARCH = 6,
AXIS_STATE_ENCODER_OFFSET_CALIBRATION = 7, //编码器校准
AXIS_STATE_CLOSED_LOOP_CONTROL = 8, //闭环模式
AXIS_STATE_LOCKIN_SPIN = 9,
AXIS_STATE_ENCODER_DIR_FIND = 10,
AXIS_STATE_MOTOR_CALIBRATION_FLUX = 11,
};
Estop
- 命令:0x02
- 方向:ODrive → Host
- 载荷部分为空
- 发送后直接停机
Get_Error
- 命令:0x03
- 方向:ODrive → Host
- 帧类型:远程帧
起始字节 | 名称 | 类型 | 描述 |
---|---|---|---|
0 | Axis_Errors | uint32 | axis的错误代码 |
RxSdo
- 命令:0x04
- 方向:Host → ODrive
起始字节 | 名称 | 类型 | 描述 |
---|---|---|---|
0 | Opcode | uint8 | 0: 读参数, 1: 写参数 |
1 | Endpoint_ID | uint16 | 从 flat_endpoints.json 读取的Endpoint_ID |
3 | Reserved | uint8 | 预留,随意 |
4 | Value | uint32 | 转换为uint32的值 |
由主机发送用于对ODrive读取或写入任意参数。
TxSdo
- 命令:0x05
- 方向:ODrive → Host
起始字节 | 名称 | 类型 | 描述 |
---|---|---|---|
0 | Reserved0 | uint8 | 预留 |
1 | Endpoint_ID | uint16 | 从 flat_endpoints.json 读取的Endpoint_ID |
3 | Reserved1 | uint8 | 硬件版本信息 |
4 | Value | uint32 | 读取到的值 |
由 ODrive 发送,以响应 Opcode=READ 的 RxSdo。
Set_Node_ID
- 命令:0x06
- 方向:Host → ODrive
起始字节 | 名称 | 类型 | 描述 |
---|---|---|---|
0 | CAN_ID | uint32 | 设置CAN节点ID |
Set_Axis_State
- 命令:0x07
- 方向:Host → ODrive
起始字节 | 名称 | 类型 | 描述 |
---|---|---|---|
0 | Axis_Requested_State | uint32 | 设置闭环状态 |
Axis_State枚举如下:
enum AxisState {
AXIS_STATE_UNDEFINED = 0,
AXIS_STATE_IDLE = 1, //释放电机
AXIS_STATE_STARTUP_SEQUENCE = 2,
AXIS_STATE_FULL_CALIBRATION_SEQUENCE = 3, //完整参数校准
AXIS_STATE_MOTOR_CALIBRATION = 4, //电机校准
AXIS_STATE_ENCODER_INDEX_SEARCH = 6,
AXIS_STATE_ENCODER_OFFSET_CALIBRATION = 7, //编码器校准
AXIS_STATE_CLOSED_LOOP_CONTROL = 8, //闭环模式
AXIS_STATE_LOCKIN_SPIN = 9,
AXIS_STATE_ENCODER_DIR_FIND = 10,
AXIS_STATE_MOTOR_CALIBRATION_FLUX = 11,
};
Get_Encoder_Estimates
- 命令:0x09
- 方向:ODrive → Host
- 帧类型:远程帧
起始字节 | 名称 | 类型 | 单位 | 描述 |
---|---|---|---|---|
0 | Pos_Estimate | float32 | 转 | 电机当前位置 |
1 | Vel_Estimate | float32 | 转/s | 电机当前速度 |
此消息默认直接从CAN心跳发送
Set_Controller_Mode
- 命令:0x0b
- 方向:Host → ODrive
起始字节 | 名称 | 类型 | 描述 |
---|---|---|---|
0 | Control_Mode | uint32 | 控制模式 |
4 | Input_Mode | uint32 | 输入模式 |
Control_Mode枚举如下:
enum ControlMode {
CONTROL_MODE_VOLTAG00E_CONTROL = 0,
CONTROL_MODE_TORQUE_CONTROL = 1, //力矩控制
CONTROL_MODE_VELOCITY_CONTROL = 2, //速度控制
CONTROL_MODE_POSITION_CONTROL = 3, //位置控制
};
Input_Mode枚举如下:
enum InputMode {
INPUT_MODE_INACTIVE = 0,
INPUT_MODE_PASSTHROUGH = 1, //直接输入
INPUT_MODE_VEL_RAMP = 2, //速度斜率
INPUT_MODE_POS_FILTER = 3, //位置滤波
INPUT_MODE_TRAP_TRAJ = 5, //梯形位置
INPUT_MODE_TORQUE_RAMP = 6, //力矩斜率
INPUT_MODE_TUNING = 7,
};
Set_Input_Pos
- 命令:0x0c
- 方向:Host → ODrive
起始字节 | 名称 | 类型 | 单位 | 描述 |
---|---|---|---|---|
0 | Input_Pos | float32 | 转 | 目标位置 |
4 | Vel_FF | uint16 | 0.001 转/s | 速度前馈,默认为0 |
6 | Torque_FF | uint16 | 0.001 Nm | 力矩前馈,默认为0 |
注意:前馈不等于速度、力矩限制,两个概念,不懂前馈就别管!!!
Set_Input_Vel
- 命令:0x0d
- 方向:Host → ODrive
起始字节 | 名称 | 类型 | 单位 | 描述 |
---|---|---|---|---|
0 | Input_Vel | float32 | 转/s | 目标速度 |
4 | Input_Torque_FF | float32 | Nm | 力矩前馈 |
Set_Input_Torque
- 命令:0x0e
- 方向:Host → ODrive
起始字节 | 名称 | 类型 | 单位 | 描述 |
---|---|---|---|---|
0 | Input_Torque | float32 | Nm | 目标力矩 |
Set_Limits
- 命令:0x0f
- 方向:Host → ODrive
起始字节 | 名称 | 类型 | 单位 | 描述 |
---|---|---|---|---|
0 | Velocity_Limit | float32 | 转/s | 速度限制 |
4 | Current_Limit | float32 | A | 电流限制 |
Set_Traj_Vel_Limit
- 命令:0x11
- 方向:Host → ODrive
起始字节 | 名称 | 类型 | 单位 | 描述 |
---|---|---|---|---|
0 | Traj_Vel_Limit | float32 | 转/s | 梯形位置下的恒定速度 |
Set_Traj_Accel_Limits
- 命令:0x12
- 方向:Host → ODrive
起始字节 | 名称 | 类型 | 单位 | 描述 |
---|---|---|---|---|
0 | Traj_Accel_Limit | float32 | 转/s^2 | 梯形位置下的加速度 |
4 | Traj_Decel_Limit | float32 | 转/s^2 | 梯形位置下的减速度 |
Set_Traj_Inertia
- 命令:0x13
- 方向:Host → ODrive
起始字节 | 名称 | 类型 | 单位 | 描述 |
---|---|---|---|---|
0 | Traj_Inertia | float32 | Nm/(转/s^2) | 前馈系数 |
Get_Iq
- 命令:0x14
- 方向:ODrive → Host
- 帧类型:远程帧
起始字节 | 名称 | 类型 | 单位 | 描述 |
---|---|---|---|---|
0 | Iq_Setpoint | float32 | A | 目标Iq电流 |
4 | Iq_Measured | float32 | A | 实际Iq电流 |
Get_Temperature
- 命令:0x15
- 方向:ODrive → Host
- 帧类型:远程帧
起始字节 | 名称 | 类型 | 单位 | 描述 |
---|---|---|---|---|
0 | FET_Temperature | float32 | 摄氏度 | PCB温度 |
4 | Motor_Temperature | float32 | 摄氏度 | 电机温度 |
Reboot
- 命令:0x16
- 方向:ODrive → Host
- 帧类型:远程帧
起始字节 | 名称 | 类型 | 描述 |
---|---|---|---|
0 | Action | uint8 | 0:正常重启 1: 保存配置 2: 恢复出厂设置 3: 进入DFU模式 |
Get_Bus_Voltage_Current
- 命令:0x17
- 方向:ODrive → Host
- 帧类型:远程帧
起始字节 | 名称 | 类型 | 单位 | 描述 |
---|---|---|---|---|
0 | Bus_Voltage | float32 | V | 母线电压 |
4 | Bus_Current | float32 | A | 母线电流 |
Clear_Errors
- 命令:0x18
- 方向:Host → ODrive
起始字节 | 名称 | 类型 | 描述 |
---|---|---|---|
0 | 空 | 空 | 空 |
Set_Absolute_Position
- 命令:0x19
- 方向:Host → ODrive
起始字节 | 名称 | 类型 | 单位 | 描述 |
---|---|---|---|---|
0 | Position | float32 | 转 | 要设置的绝对目标位置 |
Set_Pos_Gain
- 命令:0x1a
- 方向:Host → ODrive
起始字节 | 名称 | 类型 | 描述 |
---|---|---|---|
0 | Pos_Gain | float32 | 位置环增益P |
Set_Vel_Gains
- 命令:0x1b
- 方向:Host → ODrive
起始字节 | 名称 | 类型 | 描述 |
---|---|---|---|
0 | Vel_Gain | float32 | 速度环增益P |
4 | Vel_Integrator_Gain | float32 | 速度环积分I |
Get_Torque
- 命令:0x1c
- 方向:ODrive → Host
- 帧类型:远程帧
起始字节 | 名称 | 类型 | Unit | 描述 |
---|---|---|---|---|
0 | Torque_Target | float32 | Nm | 力矩目标值 |
4 | Torque_Estimate | float32 | Nm | 力矩估计值 |
Get_Powers
- 命令:0x1d
- 方向:ODrive → Host
- 帧类型:远程帧
起始字节 | 名称 | 类型 | 单位 | 描述 |
---|---|---|---|---|
0 | Electrical_Power | float32 | W | 电机机械功率(扭矩*转速) |
4 | Mechanical_Power | float32 | W | 电机电功率(调制 电压 电流) |
1 条评论
可恶的图灵哥 怎么不写枚举 我看不懂啊