00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "canio.h"
00023 #include "canio_kvaser.h"
00024
00025
00026 #define RMP_CAN_ID_SHUTDOWN 0x0412
00027 #define RMP_CAN_ID_COMMAND 0x0413
00028 #define RMP_CAN_ID_MSG1 0x0400
00029 #define RMP_CAN_ID_MSG2 0x0401
00030 #define RMP_CAN_ID_MSG3 0x0402
00031 #define RMP_CAN_ID_MSG4 0x0403
00032 #define RMP_CAN_ID_MSG5 0x0404
00033
00034 #define RMP_CAN_CMD_NONE 0
00035 #define RMP_CAN_CMD_MAX_VEL 10
00036 #define RMP_CAN_CMD_MAX_ACCL 11
00037 #define RMP_CAN_CMD_MAX_TURN 12
00038 #define RMP_CAN_CMD_GAIN_SCHED 13
00039 #define RMP_CAN_CMD_CURR_LIMIT 14
00040 #define RMP_CAN_CMD_RST_INT 50
00041
00042 #define RMP_CAN_RST_RIGHT 0x01
00043 #define RMP_CAN_RST_LEFT 0x02
00044 #define RMP_CAN_RST_YAW 0x04
00045 #define RMP_CAN_RST_FOREAFT 0x08
00046 #define RMP_CAN_RST_ALL (RMP_CAN_RST_RIGHT | \
00047 RMP_CAN_RST_LEFT | \
00048 RMP_CAN_RST_YAW | \
00049 RMP_CAN_RST_FOREAFT)
00050
00051 #define RMP_COUNT_PER_M 33215
00052 #define RMP_COUNT_PER_DEG 7.8
00053 #define RMP_COUNT_PER_M_PER_S 332
00054 #define RMP_COUNT_PER_DEG_PER_S 7.8
00055 #define RMP_COUNT_PER_MM_PER_S 0.32882963
00056 #define RMP_COUNT_PER_DEG_PER_SS 7.8
00057 #define RMP_COUNT_PER_REV 112644
00058
00059 #define RMP_MAX_TRANS_VEL_MM_S 3576
00060 #define RMP_MAX_ROT_VEL_DEG_S 18 // from rmi_demo: 1300*0.013805056
00061 #define RMP_MAX_TRANS_VEL_COUNT 1176
00062 #define RMP_MAX_ROT_VEL_COUNT 1024
00063
00064 #define RMP_GEOM_WHEEL_SEP 0.54
00065
00066
00067 class rmp_frame_t
00068 {
00069 public:
00070 int16_t pitch;
00071 int16_t pitch_dot;
00072 int16_t roll;
00073 int16_t roll_dot;
00074 uint32_t yaw;
00075 int16_t yaw_dot;
00076 uint32_t left;
00077 int16_t left_dot;
00078 uint32_t right;
00079 int16_t right_dot;
00080 uint32_t foreaft;
00081
00082 uint16_t frames;
00083 uint16_t battery;
00084 uint8_t ready;
00085
00086 rmp_frame_t() : ready(0) {}
00087
00088
00089 void AddPacket(const CanPacket &pkt);
00090
00091
00092 bool IsReady() { return ready == 0x1F; }
00093
00094 };
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106 inline void
00107 rmp_frame_t::AddPacket(const CanPacket &pkt)
00108 {
00109 bool known = true;
00110
00111 switch(pkt.id)
00112 {
00113 case RMP_CAN_ID_MSG1:
00114 battery = pkt.GetSlot(2);
00115 break;
00116
00117 case RMP_CAN_ID_MSG2:
00118 pitch = pkt.GetSlot(0);
00119 pitch_dot = pkt.GetSlot(1);
00120 roll = pkt.GetSlot(2);
00121 roll_dot = pkt.GetSlot(3);
00122 break;
00123
00124 case RMP_CAN_ID_MSG3:
00125 left_dot = (int16_t) pkt.GetSlot(0);
00126 right_dot = (int16_t) pkt.GetSlot(1);
00127 yaw_dot = (int16_t) pkt.GetSlot(2);
00128 frames = pkt.GetSlot(3);
00129 break;
00130
00131 case RMP_CAN_ID_MSG4:
00132 left = (uint32_t)(((uint32_t)pkt.GetSlot(1) << 16) |
00133 (uint32_t)pkt.GetSlot(0));
00134 right = (uint32_t)(((uint32_t)pkt.GetSlot(3) << 16) |
00135 (uint32_t)pkt.GetSlot(2));
00136 break;
00137
00138 case RMP_CAN_ID_MSG5:
00139 foreaft = (uint32_t)(((uint32_t)pkt.GetSlot(1) << 16) |
00140 (uint32_t)pkt.GetSlot(0));
00141 yaw = (uint32_t)(((uint32_t)pkt.GetSlot(3) << 16) |
00142 (uint32_t)pkt.GetSlot(2));
00143 break;
00144 default:
00145 known = false;
00146 break;
00147 }
00148
00149
00150 if(known)
00151 ready |= (1 << (pkt.id & 0xF));
00152 }