feat(proto): add EtherCAT CiA402 motor schema

This commit is contained in:
lgv 2026-07-09 14:18:59 +08:00
parent 94ee690796
commit 5c8847d334
5 changed files with 105 additions and 79 deletions

View File

@ -10,6 +10,8 @@ message MotorConfigItem {
double limit_q_ub = 4; double limit_q_ub = 4;
double limit_qd = 5; double limit_qd = 5;
double limit_qdd = 6; double limit_qdd = 6;
double encoder_counts_per_rev = 7;
double gear_ratio = 8;
} }
message MotorList { message MotorList {
@ -18,9 +20,16 @@ message MotorList {
message EthercatSlaveConfig { message EthercatSlaveConfig {
int32 motor_id = 1; int32 motor_id = 1;
int32 slave_index = 2; uint32 alias = 2;
uint32 vendor_id = 3; uint32 position = 3;
uint32 product_code = 4; }
message Cia402ProtocolConfig {
uint32 profile_position_trigger_delay_ms = 1;
uint32 state_transition_timeout_ms = 2;
uint32 velocity_stop_timeout_ms = 3;
uint32 status_poll_period_ms = 4;
double stopped_velocity_tolerance_rad_s = 5;
} }
message SocketCanConfig { message SocketCanConfig {
@ -29,8 +38,9 @@ message SocketCanConfig {
} }
message EtherCATConfig { message EtherCATConfig {
string master_id = 1; uint32 master_index = 1;
int32 cycle_us = 2; int32 cycle_us = 2;
Cia402ProtocolConfig cia402 = 3;
repeated EthercatSlaveConfig slaves = 10; repeated EthercatSlaveConfig slaves = 10;
} }
@ -49,6 +59,7 @@ enum MotorVendor {
MOTOR_VENDOR_UNKNOWN = 0; MOTOR_VENDOR_UNKNOWN = 0;
MOTOR_VENDOR_TI5 = 1; MOTOR_VENDOR_TI5 = 1;
MOTOR_VENDOR_MUJOCO = 2; MOTOR_VENDOR_MUJOCO = 2;
MOTOR_VENDOR_EYOU = 3;
} }
enum MotorProtocol { enum MotorProtocol {
@ -63,7 +74,6 @@ message MotorGroupConfig {
MotorBusType bus_type = 2; MotorBusType bus_type = 2;
MotorVendor vendor = 3; MotorVendor vendor = 3;
MotorProtocol protocol = 4; MotorProtocol protocol = 4;
string tool_frame = 5;
oneof bus_config { oneof bus_config {
SocketCanConfig can = 10; SocketCanConfig can = 10;

View File

@ -5,8 +5,8 @@ package cmvr.msgs;
message SdoFrame { message SdoFrame {
uint32 node_id = 1; // ID uint32 node_id = 1; // ID
CommandSpecifier cs = 2; // SDO命令字 CommandSpecifier cs = 2; // SDO命令字
ObIndex index = 3; // uint32 index = 3; //
ObSubIndex sub_index = 4; // uint32 sub_index = 4; //
uint32 data = 5; // uint32 data = 5; //
} }
@ -110,81 +110,38 @@ enum NmtCommand {
} }
// // CANopen communication object dictionary indexes.
enum ObIndex { // CiA402 drive-profile objects are defined in cia402.proto.
INDEX_ZERO = 0; enum CanopenObjectIndex {
USER_SAVE_PARA_2000 = 0x2000; // 1 CANOPEN_OBJECT_INDEX_ZERO = 0;
POSITION_OFFSET_2008 = 0x2008; // 0x00
// Error Codes
ERROR_CODE_6007 = 0x6007;
ERROR_CODE_603F = 0x603F;
// Control and Status CANOPEN_PRODUCER_HEARTBEAT_TIME_1017 = 0x1017;
CONTROL_WORD_6040 = 0x6040;
STATUS_WORD_6041 = 0x6041;
// Operation Modes
OPERATION_MODE_6060 = 0x6060;
MODE_DISPLAY_6061 = 0x6061;
// Actual Values
ACTUAL_POSITION_6064 = 0x6064;
ACTUAL_SPEED_606C = 0x606C;
ACTUAL_CURRENT_6078 = 0x6078;
// Torque-related
TARGET_TORQUE_6071 = 0x6071;
MAX_TORQUE_6072 = 0x6072;
DEMAND_TORQUE_6074 = 0x6074;
// Position-related
TARGET_POSITION_607A = 0x607A;
SOFTWARE_POSITION_LIMIT_607D = 0x607D; // Sub-indexes: 1, 2
// Speed-related
MAX_SPEED_607F = 0x607F;
PROFILE_SPEED_6081 = 0x6081;
PROFILE_ACCELERATION_6083 = 0x6083;
PROFILE_DECELERATION_6084 = 0x6084;
// Same as DEMAND_TORQUE? Verify correctness.
// TORQUE_SLOPE_6074 = 0x6074;
// PID Control
CURRENT_LOOP_PID_60F6 = 0x60F6; // Sub-indexes: 1, 2
SPEED_LOOP_PID_60F9 = 0x60F9; // Sub-indexes: 1, 2
POSITION_LOOP_PID_60FB = 0x60FB; // Sub-indexes: 1, 2, 3
// Target Speed
TARGET_SPEED_60FF = 0x60FF;
QUICK_STOP_OPTION_605A = 0x605A;
QUICK_STOP_DECEL_6085 = 0x6085;
// -------------------------
// PDO Communication Object // PDO Communication Object
RPDO1_COMM_1400 = 0x1400; CANOPEN_RPDO1_COMM_1400 = 0x1400;
RPDO2_COMM_1401 = 0x1401; CANOPEN_RPDO2_COMM_1401 = 0x1401;
RPDO3_COMM_1402 = 0x1402; CANOPEN_RPDO3_COMM_1402 = 0x1402;
RPDO4_COMM_1403 = 0x1403; CANOPEN_RPDO4_COMM_1403 = 0x1403;
TPDO1_COMM_1800 = 0x1800; CANOPEN_TPDO1_COMM_1800 = 0x1800;
TPDO2_COMM_1801 = 0x1801; CANOPEN_TPDO2_COMM_1801 = 0x1801;
TPDO3_COMM_1802 = 0x1802; CANOPEN_TPDO3_COMM_1802 = 0x1802;
TPDO4_COMM_1803 = 0x1803; CANOPEN_TPDO4_COMM_1803 = 0x1803;
// PDO Mapping Object // PDO Mapping Object
RPDO1_MAP_1600 = 0x1600; CANOPEN_RPDO1_MAP_1600 = 0x1600;
RPDO2_MAP_1601 = 0x1601; CANOPEN_RPDO2_MAP_1601 = 0x1601;
RPDO3_MAP_1602 = 0x1602; CANOPEN_RPDO3_MAP_1602 = 0x1602;
RPDO4_MAP_1603 = 0x1603; CANOPEN_RPDO4_MAP_1603 = 0x1603;
TPDO1_MAP_1A00 = 0x1A00; CANOPEN_TPDO1_MAP_1A00 = 0x1A00;
TPDO2_MAP_1A01 = 0x1A01; CANOPEN_TPDO2_MAP_1A01 = 0x1A01;
TPDO3_MAP_1A02 = 0x1A02; CANOPEN_TPDO3_MAP_1A02 = 0x1A02;
TPDO4_MAP_1A03 = 0x1A03; CANOPEN_TPDO4_MAP_1A03 = 0x1A03;
PRODUCER_HEARTBEAT_TIME = 0x1017; // Ti5 vendor-specific objects used through CANopen SDO.
CANOPEN_USER_SAVE_PARA_2000 = 0x2000;
CANOPEN_POSITION_OFFSET_2008 = 0x2008;
} }
// //
@ -198,5 +155,3 @@ enum ObSubIndex {
SUB_INDEX_6 = 6; SUB_INDEX_6 = 6;
SUB_INDEX_7 = 7; SUB_INDEX_7 = 7;
} }

View File

@ -0,0 +1,64 @@
syntax = "proto3";
package cmvr.msgs;
// CiA402 object dictionary indexes shared by CANopen and EtherCAT CoE drives.
enum Cia402ObjectIndex {
CIA402_OBJECT_INDEX_ZERO = 0;
CIA402_ERROR_CODE_603F = 0x603F;
CIA402_CONTROL_WORD_6040 = 0x6040;
CIA402_STATUS_WORD_6041 = 0x6041;
CIA402_QUICK_STOP_OPTION_605A = 0x605A;
CIA402_SHUTDOWN_OPTION_605B = 0x605B;
CIA402_DISABLE_OPERATION_OPTION_605C = 0x605C;
CIA402_HALT_OPTION_605D = 0x605D;
CIA402_FAULT_REACTION_OPTION_605E = 0x605E;
CIA402_OPERATION_MODE_6060 = 0x6060;
CIA402_MODE_DISPLAY_6061 = 0x6061;
CIA402_POSITION_DEMAND_VALUE_6062 = 0x6062;
CIA402_ACTUAL_POSITION_6064 = 0x6064;
CIA402_MAX_FOLLOWING_ERROR_6065 = 0x6065;
CIA402_POSITION_WINDOW_6067 = 0x6067;
CIA402_POSITION_WINDOW_TIME_6068 = 0x6068;
CIA402_VELOCITY_DEMAND_VALUE_606B = 0x606B;
CIA402_ACTUAL_VELOCITY_606C = 0x606C;
CIA402_VELOCITY_WINDOW_606D = 0x606D;
CIA402_VELOCITY_WINDOW_TIME_606E = 0x606E;
CIA402_VELOCITY_THRESHOLD_606F = 0x606F;
CIA402_VELOCITY_THRESHOLD_TIME_6070 = 0x6070;
CIA402_TARGET_TORQUE_6071 = 0x6071;
CIA402_MAX_TORQUE_6072 = 0x6072;
CIA402_TORQUE_DEMAND_VALUE_6074 = 0x6074;
CIA402_MOTOR_RATED_TORQUE_6076 = 0x6076;
CIA402_ACTUAL_TORQUE_6077 = 0x6077;
CIA402_ACTUAL_CURRENT_6078 = 0x6078;
CIA402_DC_LINK_VOLTAGE_6079 = 0x6079;
CIA402_TARGET_POSITION_607A = 0x607A;
CIA402_HOME_OFFSET_607C = 0x607C;
CIA402_SOFTWARE_POSITION_LIMIT_607D = 0x607D;
CIA402_MAX_PROFILE_VELOCITY_607F = 0x607F;
CIA402_PROFILE_VELOCITY_6081 = 0x6081;
CIA402_PROFILE_ACCELERATION_6083 = 0x6083;
CIA402_PROFILE_DECELERATION_6084 = 0x6084;
CIA402_QUICK_STOP_DECELERATION_6085 = 0x6085;
CIA402_TORQUE_SLOPE_6087 = 0x6087;
CIA402_GEAR_RATIO_6091 = 0x6091;
CIA402_VELOCITY_OFFSET_60B1 = 0x60B1;
CIA402_TORQUE_OFFSET_60B2 = 0x60B2;
CIA402_INTERPOLATION_DATA_RECORD_60C1 = 0x60C1;
CIA402_INTERPOLATION_TIME_PERIOD_60C2 = 0x60C2;
CIA402_FOLLOWING_ERROR_ACTUAL_VALUE_60F4 = 0x60F4;
CIA402_TARGET_VELOCITY_60FF = 0x60FF;
CIA402_SUPPORTED_DRIVE_MODES_6502 = 0x6502;
}

View File

@ -114,5 +114,3 @@ message MotorStatus {
uint32 status_word = 44; uint32 status_word = 44;
} }

View File

@ -1,6 +1,5 @@
syntax = "proto3"; syntax = "proto3";
import "cmvr/msgs/canopen.proto";
import "cmvr/msgs/motor.proto"; import "cmvr/msgs/motor.proto";
package cmvr.msgs; package cmvr.msgs;