kenshiro program
Dependencies: mbed QEI ros_lib_kinetic USBDevice
Diff: main.cpp
- Revision:
- 4:c79b95a92466
- Parent:
- 3:e5463b529172
--- a/main.cpp Tue Sep 03 13:42:08 2019 +0000 +++ b/main.cpp Sun Feb 09 09:38:02 2020 +0000 @@ -62,7 +62,7 @@ Timer t; int main(){ - + t.start(); long vel_timer = 0; nh.getHardware()->setBaud(115200); @@ -72,9 +72,9 @@ nh.advertise(pub_encleft); nh.advertise(pub_encright); nh.advertise(pub_emangencysw); - + CANMessage msg; // CANメッセージを格納する変数 - + while (1){ // エンコーダー値読み取り if (can1.read(msg)) { //メッセージがあったら即実行 read関数はメッセージがあった場合戻り値が1 @@ -84,7 +84,7 @@ encleft_msg.data *= -1; } } - + // 割り込みで代用? if (t.read_ms() > vel_timer){ pub_encleft.publish(&encleft_msg);//実際にパブリッシュ @@ -95,7 +95,7 @@ vel_timer = t.read_ms() + 500; // 500ms毎に実行 } nh.spinOnce(); // 呼び出し待ちのコールバックをここで呼び出す - + wait_ms(1); // 連続で呼び出ししないようにウェイトを置く } } @@ -110,17 +110,17 @@ void messageCb(const geometry_msgs::Twist& msg){ double tmp_rpm_left = 0; double tmp_rpm_right = 0; - + tmp_rpm_left = 1 / WEEL * (msg.linear.x - TREAD / 2 * msg.angular.z) * 30 / PI * DIFF_GEAR; tmp_rpm_right = 1 / WEEL * (msg.linear.x + TREAD / 2 * msg.angular.z) * 30 / PI * DIFF_GEAR; motor( tmp_rpm_left, tmp_rpm_right ); } -/* CANIDプロトコル -/ CANID:xxyyyyzzzzzの11bit中 +/* CANIDプロトコル +/ CANID:xxyyyyzzzzzの11bit中 / 上位2bit:優先度 :小さいものが高優先 [00]:ブロードキャスト用?? [01]:M-bedから書き込みに使える [10]:MDからくるレポート [11]:不明 メッセージの衝突回避用 / 次の4bit:プロトコルID :[0]高優先度プロトコル [1]制御プロトコル [2-3]書き込みプロトコル [8]高優先度通知プロトコル [9]イベント通知プロトコル [10-12]ステータスレポートプロトコル / 下位5bit:デバイスID :デバイスIDとデバイスの各メールボックス -/ +/ / CANデータフィールド1Byte目:上位4bit:1つ目のデータはレジスタ何個分か 下位4bit:2つ目のデータはレジスタ何個分か RPMCMD1 =2Byte RPMCMD2 =2Byte / CANデータフィールド2Byte目:書き込む先のアドレス1 レジスタのアドレス 例)RPMCMD1 =0x40 (64番目 / CANデータフィールド3Byte目:例)回転数1000の上位2bit @@ -139,7 +139,7 @@ //MT1=0rpm MT2=0rpm char txdata[8]; int CANID; - + txdata[0] = 0x11; txdata[1] = 0x40; //rpmcmd1 txdata[2] = 0x00; //MT1=-2000rpm @@ -149,22 +149,22 @@ txdata[6] = 0x00; CANID=0x200 | ((MDwrite)&0xf)<<5 | 0x0a ; // 上位2ビット:優先度:01 次の4bit:プロトコルID:受信(MD側) 下位5bit:デバイスID:01番 - can1.write(CANMessage(CANID,&txdata[0],7)); + can1.write(CANMessage(CANID,&txdata[0],7)); } void motor( int rpm1, int rpm2 ){ // 全モータ前進 //MT1=0rpm MT2=0rpm char txdata[8]; int CANID; - + int motor1_rpm = -rpm1; int motor2_rpm = rpm2; - + char motor1_data1 = (motor1_rpm & 0xff00) >> 8; char motor1_data2 = motor1_rpm & 0x00ff; char motor2_data1 = (motor2_rpm & 0xff00) >> 8; char motor2_data2 = motor2_rpm & 0x00ff; - + txdata[0] = 0x11; txdata[1] = 0x40; //rpmcmd1 txdata[2] = motor1_data1; @@ -174,24 +174,24 @@ txdata[6] = motor2_data2; CANID=0x200 | ((MDwrite)&0xf)<<5 | 0x0a ; // 上位2ビット:優先度:01 次の4bit:プロトコルID:受信(MD側) 下位5bit:デバイスID:01番 - can1.write(CANMessage(CANID,&txdata[0],7)); + can1.write(CANMessage(CANID,&txdata[0],7)); } void motor1_drive( int rpm ){ // モータ1正転 //MT1=2000rpm char txdata[8]; int CANID; - + int motor1_rpm; if(rpm >= 0){ motor1_rpm = -rpm; } else { motor1_rpm = rpm; } - + char motor1_data1 = (motor1_rpm & 0xff00) >> 8; char motor1_data2 = motor1_rpm & 0x00ff; - + txdata[0] = 0x10; txdata[1] = 0x40; //rpmcmd1 txdata[2] = motor1_data1; @@ -219,7 +219,7 @@ void MD_mode_change(int mode){ // モータドライバのモード変更関数 char txdata[8]; int CANID; - + txdata[0] = 0x05; txdata[1] = mode; txdata[2] = 0x00; @@ -228,8 +228,7 @@ txdata[5] = 0x00; txdata[6] = 0x00; txdata[7] = 0x00; - + CANID=0x200 | ((MDcontroll)&0xf)<<5 | 0xa ; // 上位2ビット:優先度:01 次の4bit:プロトコルID:制御モード 下位5bit:デバイスID:10番 - can1.write(CANMessage(CANID,&txdata[0],8)); - + can1.write(CANMessage(CANID,&txdata[0],8)); } \ No newline at end of file