25 #define CMD_POSITION 1
26 #define CMD_RESPONSE 2
29 #define CMD_SET_MECH_POSITION_TO_ZERO 6
30 #define CMD_CHANGE_CAN_ID 7
31 #define CMD_RAM_READ 17
32 #define CMD_RAM_WRITE 18
33 #define CMD_GET_MOTOR_FAIL 21
35 #define ADDR_RUN_MODE 0x7005
36 #define ADDR_IQ_REF 0x7006
37 #define ADDR_SPEED_REF 0x700A
38 #define ADDR_LIMIT_TORQUE 0x700B
39 #define ADDR_CURRENT_KP 0x7010
40 #define ADDR_CURRENT_KI 0x7011
41 #define ADDR_CURRENT_FILTER_GAIN 0x7014
42 #define ADDR_LOC_REF 0x7016
43 #define ADDR_LIMIT_SPEED 0x7017
44 #define ADDR_LIMIT_CURRENT 0x7018
45 #define ADDR_MECH_POS 0x7019
46 #define ADDR_IQF 0x701A
47 #define ADDR_MECH_VEL 0x701B
48 #define ADDR_VBUS 0x701C
49 #define ADDR_ROTATION 0x701D
50 #define ADDR_LOC_KP 0x701E
51 #define ADDR_SPD_KP 0x701F
52 #define ADDR_SPD_KI 0x7020
54 #define POS_MIN -12.5f
56 #define VEL_MIN -30.0f
58 #define CUR_MIN -27.0f
60 #define TOR_MIN -12.0f
63 #define CURRENT_FILTER_GAIN_MIN 0.0f
64 #define CURRENT_FILTER_GAIN_MAX 1.0f
66 #define CUR_KP_MAX 200.0f
67 #define CUR_KP_MIN 0.0f
68 #define CUR_KI_MAX 200.0f
69 #define CUR_KI_MIN 0.0f
85 #define CURRENT_FILTER_GAIN_MIN 0.0f
86 #define CURRENT_FILTER_GAIN_MAX 1.0f
88 #define DEFAULT_CURRENT_KP 0.125f
89 #define DEFAULT_CURRENT_KI 0.0158f
90 #define DEFAULT_CURRENT_FINTER_GAIN 0.1f
91 #define DEFAULT_POSITION_KP 30.0f
92 #define DEFAULT_VELOCITY_KP 2.0f
93 #define DEFAULT_VELOCITY_KI 0.002f
94 #define DEFAULT_VELOCITY_LIMIT 2.0f
95 #define DEFAULT_CURRENT_LIMIT 27.0f
96 #define DEFAULT_TORQUE_LIMIT 12.0f
98 #define RET_CYBERGEAR_OK 0x00
99 #define RET_CYBERGEAR_MSG_NOT_AVAIL 0x01
100 #define RET_CYBERGEAR_INVALID_CAN_ID 0x02
101 #define RET_CYBERGEAR_INVALID_PACKET 0x03
161 :
EncoderBase(1), can_{can, }, motor_id_{motor_id}, master_id_{master_id} {
193 std::array<uint8_t, 8U> data = {0x00};
194 data[0] =
static_cast<uint8_t
>(index);
195 data[1] =
static_cast<uint8_t
>(index >> 8);
214 if(
static_cast<uint16_t
>(msg.
id&0xffff) ==
static_cast<uint16_t
>((motor_id_ << 8) | master_id_)){
215 uint8_t packet_type = (msg.
id & 0x3F000000) >> 24;
216 switch(packet_type) {
222 process_read_parameter_packet(msg.
data);
227 printf(
"invalid response 0x%x\r\n", packet_type);
235 send(motor_id_,
CMD_ENABLE, master_id_, std::array<uint8_t, 8U>{0x00});
240 send(motor_id_,
CMD_RESET, master_id_, std::array<uint8_t, 8U>{0x00});
246 std::array<uint8_t, 8U> data = {0x00};
259 peripheral::CANBase::Message msg;
260 msg.id_type = idtype;
267 void process_motor_packet(
const std::array<uint8_t, 8U> &data){
270 motor_status_.
raw_effort = data[5] | data[4] << 8;
282 void process_read_parameter_packet(
const std::array<uint8_t, 8U> &data){
283 uint16_t index = data[1] << 8 | data[0];
285 memcpy(&uint8_data, &data[4],
sizeof(uint8_t));
287 memcpy(&int16_data, &data[4],
sizeof(int16_t));
289 memcpy(&float_data, &data[4],
sizeof(
float));
291 for(uint8_t d : data) printf(
"%02x, ", d);
292 printf(
"data : %02x, %04x, %f / ", uint8_data, (uint16_t)int16_data, float_data);
299 printf(
"ADDR_RUN_MODE = [0x%02x]\n", uint8_data);
302 motor_param_.
iq_ref = float_data;
303 printf(
"ADDR_IQ_REF = %f\r\n", float_data);
306 motor_param_.
spd_ref = float_data;
307 printf(
"ADDR_SPEED_REF = %f\r\n", float_data);
311 printf(
"ADDR_LIMIT_TORQUE = %f\r\n", float_data);
314 motor_param_.
cur_kp = float_data;
315 printf(
"ADDR_CURRENT_KP = %f\r\n", float_data);
318 motor_param_.
cur_ki = float_data;
319 printf(
"ADDR_CURRENT_KI = %f\r\n", float_data);
323 printf(
"ADDR_CURRENT_FILTER_GAIN = %f\r\n", float_data);
326 motor_param_.
loc_ref = float_data;
327 printf(
"ADDR_LOC_REF = %f\r\n", float_data);
331 printf(
"ADDR_LIMIT_SPEED = %f\r\n", float_data);
335 printf(
"ADDR_LIMIT_CURRENT = %f\r\n", float_data);
339 printf(
"ADDR_MECH_POS = %f\r\n", float_data);
342 motor_param_.
iqf = float_data;
343 printf(
"ADDR_IQF = %f\r\n", float_data);
347 printf(
"ADDR_MECH_VEL = %f\r\n", float_data);
350 motor_param_.
vbus = float_data;
351 printf(
"ADDR_VBUS = %f\r\n", float_data);
355 printf(
"ADDR_ROTATION = %d\r\n", int16_data);
358 motor_param_.
loc_kp = float_data;
359 printf(
"ADDR_LOC_KP = %f\r\n", float_data);
362 motor_param_.
spd_kp = float_data;
363 printf(
"ADDR_SPD_KP = %f\r\n", float_data);
366 motor_param_.
spd_ki = float_data;
367 printf(
"ADDR_SPD_KI = %f\r\n", float_data);
370 printf(
"Unknown index = 0x%04x\r\n", index);
379 void send(uint8_t can_id, uint8_t cmd_id, uint16_t option,
const std::array<uint8_t, 8U> &data){
380 uint32_t
id = cmd_id << 24 | option << 8 | can_id;
385 void writeFloat(uint8_t can_id, uint16_t addr,
float value,
float min,
float max){
386 std::array<uint8_t, 8U> data = {0x00};
387 data[0] = addr & 0x00FF;
394 val.f = (max<value)? max : (min>value)? min : value;
395 data[4] = val.data[0];
396 data[5] = val.data[1];
397 data[6] = val.data[2];
398 data[7] = val.data[3];
403 int float2unit(
float x,
float x_min,
float x_max,
int bits){
404 float span = x_max - x_min;
405 float offset = x_min;
406 x = std::clamp<float>(x, x_min, x_max);
407 return (
int) ((x-offset)*((float)((1<<bits)-1))/span);
410 float uint2float(uint16_t x,
float x_min,
float x_max){
411 uint16_t type_max = 0xFFFF;
412 float span = x_max - x_min;
413 return (
float) x / type_max * span + x_min;
428 void processPacket(
const std::array<uint8_t, 8U> &data){
431 motor_status_.
raw_effort = data[5] | data[4] << 8;
443 peripheral::CAN &can_;
444 MotorStatus motor_status_;
445 MotorParameter motor_param_;
447 const uint8_t motor_id_, master_id_;
448 uint8_t receive_buffer_[64];
449 unsigned long send_count_;
450 bool stop_flag =
true;
Definition cybergear.hpp:107
void stop()
Definition cybergear.hpp:182
void readRam(uint16_t index)
Definition cybergear.hpp:190
void setCurrent(float value)
Definition cybergear.hpp:173
void process_receive_data(const peripheral::CANBase::Message &msg)
Definition cybergear.hpp:213
void enable()
Definition cybergear.hpp:233
virtual ~Cybergear()
Definition cybergear.hpp:167
bool update()
Definition cybergear.hpp:169
void setMotorMode(MotorMode mode)
Definition cybergear.hpp:243
MotorMode
Definition cybergear.hpp:109
void reset()
Definition cybergear.hpp:238
Cybergear(peripheral::CAN &can, uint8_t motor_id, uint8_t master_id)
Definition cybergear.hpp:160
Definition encoder_base.hpp:10
IDType
Definition can_base.hpp:12
bool receive(Message &msg, uint32_t timeout) override
Definition can.hpp:86
bool transmit(const Message &msg, uint32_t timeout) override
Definition can.hpp:56
#define CMD_RAM_WRITE
Definition cybergear.hpp:32
#define CMD_RESPONSE
Definition cybergear.hpp:26
#define TOR_MIN
Definition cybergear.hpp:60
#define CMD_RAM_READ
Definition cybergear.hpp:31
#define T_MIN
Definition cybergear.hpp:81
#define ADDR_CURRENT_FILTER_GAIN
Definition cybergear.hpp:41
#define ADDR_CURRENT_KP
Definition cybergear.hpp:39
#define TOR_MAX
Definition cybergear.hpp:61
#define ADDR_LIMIT_TORQUE
Definition cybergear.hpp:38
#define ADDR_LOC_REF
Definition cybergear.hpp:42
#define ADDR_MECH_VEL
Definition cybergear.hpp:47
#define POS_MAX
Definition cybergear.hpp:55
#define ADDR_VBUS
Definition cybergear.hpp:48
#define POS_MIN
Definition cybergear.hpp:54
#define ADDR_SPD_KI
Definition cybergear.hpp:52
#define ADDR_IQ_REF
Definition cybergear.hpp:36
#define ADDR_IQF
Definition cybergear.hpp:46
#define ADDR_SPEED_REF
Definition cybergear.hpp:37
#define ADDR_LOC_KP
Definition cybergear.hpp:50
#define CUR_MAX
Definition cybergear.hpp:59
#define P_MAX
Definition cybergear.hpp:72
#define ADDR_LIMIT_CURRENT
Definition cybergear.hpp:44
#define ADDR_ROTATION
Definition cybergear.hpp:49
#define VEL_MAX
Definition cybergear.hpp:57
#define ADDR_LIMIT_SPEED
Definition cybergear.hpp:43
#define ADDR_MECH_POS
Definition cybergear.hpp:45
#define CMD_ENABLE
Definition cybergear.hpp:27
#define V_MAX
Definition cybergear.hpp:74
#define ADDR_RUN_MODE
Definition cybergear.hpp:35
#define VEL_MIN
Definition cybergear.hpp:56
#define T_MAX
Definition cybergear.hpp:82
#define V_MIN
Definition cybergear.hpp:73
#define CUR_MIN
Definition cybergear.hpp:58
#define P_MIN
Definition cybergear.hpp:71
#define ADDR_SPD_KP
Definition cybergear.hpp:51
#define ADDR_CURRENT_KI
Definition cybergear.hpp:40
#define CMD_RESET
Definition cybergear.hpp:28
constexpr std::underlying_type_t< T > to_underlying(T value) noexcept
Definition utility.hpp:23
Definition cybergear.hpp:128
bool over_voltage
Definition cybergear.hpp:132
bool driver_chip
Definition cybergear.hpp:134
bool encoder_not_calibrated
Definition cybergear.hpp:129
bool over_current_phase_b
Definition cybergear.hpp:131
bool over_current_phase_a
Definition cybergear.hpp:130
bool under_voltage
Definition cybergear.hpp:133
bool motor_over_tempareture
Definition cybergear.hpp:135
Definition cybergear.hpp:138
float limit_spd
Definition cybergear.hpp:148
float vbus
Definition cybergear.hpp:153
float mech_vel
Definition cybergear.hpp:152
uint16_t run_mode
Definition cybergear.hpp:140
float spd_ki
Definition cybergear.hpp:157
float iqf
Definition cybergear.hpp:151
float limit_cur
Definition cybergear.hpp:149
unsigned long stamp_usec
Definition cybergear.hpp:139
float spd_ref
Definition cybergear.hpp:142
float cur_kp
Definition cybergear.hpp:144
float loc_ref
Definition cybergear.hpp:147
int16_t rotation
Definition cybergear.hpp:154
float spd_kp
Definition cybergear.hpp:156
float mech_pos
Definition cybergear.hpp:150
float loc_kp
Definition cybergear.hpp:155
float limit_torque
Definition cybergear.hpp:143
float cur_filt_gain
Definition cybergear.hpp:146
float cur_ki
Definition cybergear.hpp:145
float iq_ref
Definition cybergear.hpp:141
Definition cybergear.hpp:115
uint16_t raw_position
raw position (for sync data)
Definition cybergear.hpp:122
uint16_t raw_effort
raw effort (for sync data)
Definition cybergear.hpp:124
float position
encoder position (-4pi to 4pi)
Definition cybergear.hpp:118
uint8_t motor_id
motor id
Definition cybergear.hpp:117
float velocity
motor velocity (-30rad/s to 30rad/s)
Definition cybergear.hpp:119
unsigned long stamp_usec
Definition cybergear.hpp:116
uint16_t raw_velocity
raw velocity (for sync data)
Definition cybergear.hpp:123
float effort
motor effort (-12Nm - 12Nm)
Definition cybergear.hpp:120
uint16_t raw_temperature
raw temperature (for sync data)
Definition cybergear.hpp:125
float temperature
temperature
Definition cybergear.hpp:121
Definition can_base.hpp:17
uint32_t id
Definition can_base.hpp:19
std::array< uint8_t, 8 > data
Definition can_base.hpp:21