Mini_ODrive CAN协议

  • ODrive CAN Simple 协议使用标准的 11 位消息标识符(ID)。
  • CAN 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消息名称方向内容
0x000Get_VersionODrive → HostProtocol_Version
Hw_Version_Major
Hw_Version_Minor
Hw_Version_Variant
Fw_Version_Major
Fw_Version_Minor
Fw_Version_Revision
Fw_Version_Unreleased
0x001HeartbeatODrive → HostAxis_Error
Axis_State
System_Error
Traj_Down_Flags
0x002EstopHost → ODrive
0x003Get_ErrorODrive → HostAxis.Error_
0x004RxSdoHost → ODriveOpcode
Endpoint_ID
Reserved
Value
0x005TxSdoODrive → HostReserved0
Endpoint_ID
Reserved1
Value
0x006Set_Node_IDHost → ODriveNode_ID
0x007Set_Axis_StateHost → ODriveAxis_Requested_State
0x009Get_Encoder_EstimatesODrive → HostPos_Estimate
Vel_Estimate
0x00bSet_Controller_ModeHost → ODriveControl_Mode
Input_Mode
0x00cSet_Input_PosHost → ODriveInput_Pos
Vel_FF
Torque_FF
0x00dSet_Input_VelHost → ODriveInput_Vel
Input_Torque_FF
0x00eSet_Input_TorqueHost → ODriveInput_Torque
0x00fSet_LimitsHost → ODriveVelocity_Limit
Current_Limit
0x011Set_Traj_Vel_LimitHost → ODriveTraj_Vel_Limit
0x012Set_Traj_Accel_LimitsHost → ODriveTraj_Accel_Limit
Traj_Decel_Limit
0x013Set_Traj_InertiaHost → ODriveTraj_Inertia
0x014Get_IqODrive → HostIq_Setpoint
Iq_Measured
0x015Get_TemperatureODrive → HostFET_Temperature
Motor_Temperature
0x016RebootHost → ODriveAction
0x017Get_Bus_Voltage_CurrentODrive → HostBus_Voltage
Bus_Current
0x018Clear_ErrorsHost → ODriveIdentify
0x019Set_Absolute_PositionHost → ODrivePosition
0x01aSet_Pos_GainHost → ODrivePos_Gain
0x01bSet_Vel_GainsHost → ODriveVel_Gain
Vel_Integrator_Gain
0x01cGet_TorquesODrive → HostTorque_Target
Torque_Estimate
0x01dGet_PowersODrive → HostElectrical_Power
Mechanical_Power

CAN 心跳消息

可以将 ODrive 配置为在没有请求的情况下定期发送一些消息。这是通过在上位机中设置所需的发送间隔来完成的。
设置单位为 ms,设置为0则表示禁用心跳。

消息配置 (.axis.config.can.[...])默认值
Heartbeatheartbeat_msg_rate_ms100 ms
Get_Encoder_Estimatesencoder_msg_rate_ms10 ms
Get_Iqiq_msg_rate_ms关闭
Get_Errorerror_msg_rate_ms关闭
Get_Temperaturetemperature_msg_rate_ms关闭
Get_Bus_Voltage_Currentbus_voltage_msg_rate_ms关闭
Get_Torquestorques_msg_rate_ms关闭

看门狗

ODrive 的看门狗定时器可用作安全功能,在 CAN 通信中断时释放电机。
看门狗会通过每条 Set_Input_PosSet_Input_VelSet_Input_Torque消息以及通过 Set_Axis_State进入闭环模式时重置。

消息

Get_Version

  • 命令:0x00
  • 方向:ODrive → Host
  • 帧类型:远程帧
起始字节名称类型描述
0Protocol_Versionuint8恒定为1
1Hw_Version_Majoruint8硬件版本信息
2Hw_Version_Minoruint8硬件版本信息
3Hw_Version_Variantuint8硬件版本信息
4Fw_Version_Majoruint8软件版本信息
5Fw_Version_Minoruint8软件版本信息
6Fw_Version_Revisionuint8软件版本信息
7Fw_Version_Unreleaseduint8恒定为1

Heartbeat

  • 命令:0x01
  • 方向:ODrive → Host
起始字节名称类型描述
0Axis_Erroruint32Axis 错误信息
4Axis_Stateuint8系统状态
6System_Erroruint8系统错误
7Trajectory_Done_Flaguint8梯形补偿标志

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
  • 帧类型:远程帧
起始字节名称类型描述
0Axis_Errorsuint32axis的错误代码

RxSdo

  • 命令:0x04
  • 方向:Host → ODrive
起始字节名称类型描述
0Opcodeuint80: 读参数, 1: 写参数
1Endpoint_IDuint16flat_endpoints.json读取的Endpoint_ID
3Reserveduint8预留,随意
4Valueuint32转换为uint32的值

由主机发送用于对ODrive读取或写入任意参数。

TxSdo

  • 命令:0x05
  • 方向:ODrive → Host
起始字节名称类型描述
0Reserved0uint8预留
1Endpoint_IDuint16flat_endpoints.json读取的Endpoint_ID
3Reserved1uint8硬件版本信息
4Valueuint32读取到的值

由 ODrive 发送,以响应 Opcode=READ 的 RxSdo。

Set_Node_ID

  • 命令:0x06
  • 方向:Host → ODrive
起始字节名称类型描述
0CAN_IDuint32设置CAN节点ID

Set_Axis_State

  • 命令:0x07
  • 方向:Host → ODrive
起始字节名称类型描述
0Axis_Requested_Stateuint32设置闭环状态

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
  • 帧类型:远程帧
起始字节名称类型单位描述
0Pos_Estimatefloat32电机当前位置
1Vel_Estimatefloat32转/s电机当前速度

此消息默认直接从CAN心跳发送

Set_Controller_Mode

  • 命令:0x0b
  • 方向:Host → ODrive
起始字节名称类型描述
0Control_Modeuint32控制模式
4Input_Modeuint32输入模式

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
起始字节名称类型单位描述
0Input_Posfloat32目标位置
4Vel_FFuint160.001 转/s速度前馈,默认为0
6Torque_FFuint160.001 Nm力矩前馈,默认为0

注意:前馈不等于速度、力矩限制,两个概念,不懂前馈就别管!!!

Set_Input_Vel

  • 命令:0x0d
  • 方向:Host → ODrive
起始字节名称类型单位描述
0Input_Velfloat32转/s目标速度
4Input_Torque_FFfloat32Nm力矩前馈

Set_Input_Torque

  • 命令:0x0e
  • 方向:Host → ODrive
起始字节名称类型单位描述
0Input_Torquefloat32Nm目标力矩

Set_Limits

  • 命令:0x0f
  • 方向:Host → ODrive
起始字节名称类型单位描述
0Velocity_Limitfloat32转/s速度限制
4Current_Limitfloat32A电流限制

Set_Traj_Vel_Limit

  • 命令:0x11
  • 方向:Host → ODrive
起始字节名称类型单位描述
0Traj_Vel_Limitfloat32转/s梯形位置下的恒定速度

Set_Traj_Accel_Limits

  • 命令:0x12
  • 方向:Host → ODrive
起始字节名称类型单位描述
0Traj_Accel_Limitfloat32转/s^2梯形位置下的加速度
4Traj_Decel_Limitfloat32转/s^2梯形位置下的减速度

Set_Traj_Inertia

  • 命令:0x13
  • 方向:Host → ODrive
起始字节名称类型单位描述
0Traj_Inertiafloat32Nm/(转/s^2)前馈系数

Get_Iq

  • 命令:0x14
  • 方向:ODrive → Host
  • 帧类型:远程帧
起始字节名称类型单位描述
0Iq_Setpointfloat32A目标Iq电流
4Iq_Measuredfloat32A实际Iq电流

Get_Temperature

  • 命令:0x15
  • 方向:ODrive → Host
  • 帧类型:远程帧
起始字节名称类型单位描述
0FET_Temperaturefloat32摄氏度PCB温度
4Motor_Temperaturefloat32摄氏度电机温度

Reboot

  • 命令:0x16
  • 方向:ODrive → Host
  • 帧类型:远程帧
起始字节名称类型描述
0Actionuint80:正常重启
1: 保存配置
2: 恢复出厂设置
3: 进入DFU模式

Get_Bus_Voltage_Current

  • 命令:0x17
  • 方向:ODrive → Host
  • 帧类型:远程帧
起始字节名称类型单位描述
0Bus_Voltagefloat32V母线电压
4Bus_Currentfloat32A母线电流

Clear_Errors

  • 命令:0x18
  • 方向:Host → ODrive
起始字节名称类型描述
0

Set_Absolute_Position

  • 命令:0x19
  • 方向:Host → ODrive
起始字节名称类型单位描述
0Positionfloat32要设置的绝对目标位置

Set_Pos_Gain

  • 命令:0x1a
  • 方向:Host → ODrive
起始字节名称类型描述
0Pos_Gainfloat32位置环增益P

Set_Vel_Gains

  • 命令:0x1b
  • 方向:Host → ODrive
起始字节名称类型描述
0Vel_Gainfloat32速度环增益P
4Vel_Integrator_Gainfloat32速度环积分I

Get_Torque

  • 命令:0x1c
  • 方向:ODrive → Host
  • 帧类型:远程帧
起始字节名称类型Unit描述
0Torque_Targetfloat32Nm力矩目标值
4Torque_Estimatefloat32Nm力矩估计值

Get_Powers

  • 命令:0x1d
  • 方向:ODrive → Host
  • 帧类型:远程帧
起始字节名称类型单位描述
0Electrical_Powerfloat32W电机机械功率(扭矩*转速)
4Mechanical_Powerfloat32W电机电功率(调制 电压 电流)
最后修改:2024 年 12 月 06 日
如果觉得我的文章对你有用,请随意赞赏