廃炉ロボコン2018用プログラム ROS→stm32(ROSからのシリアルをCANに変換する)→MD
Dependencies: ros_lib_kinetic
main.cpp
- Committer:
- tknara
- Date:
- 2018-12-04
- Revision:
- 1:e15fbee169e7
- Parent:
- 0:e5287b509fe9
File content as of revision 1:e15fbee169e7:
#include "mbed.h" #include "algorithm" #include <ros.h> #include <sensor_msgs/Joy.h> #include <std_msgs/String.h> #define TIMEOUT 0.4 DigitalOut led(LED1); CAN can(PA_11,PA_12); DigitalOut led2(PA_0); Timeout timeout; int modeflag=0; double wheelSpeed[4]={0}; double joyaxes[8]; double joybuttons[11]; double waterPower[4]={0}; double armPower[4]={0}; CANMessage msg; std_msgs::String debug_msg; void reset(){ //NVIC_SystemReset(); } int Button(int a,int b){ if((a==1)&&(b==0)) return 1; else if((a==0)&&(b==1)) return -1; else return 0; } void joy_callback(const sensor_msgs::Joy &joy) { int i; led = !led; for(i=0;i<8;i++) { joyaxes[i]=joy.axes[i]; /* 0 Left/Right Axis stick left 1 Up/Down Axis stick left 2 LT 3 Left/Right Axis stick right 4 Up/Down Axis stick right 5 RT 6 cross key left/right 7 cross key up/down */ } for(i=0;i<11;i++) { joybuttons[i]=joy.buttons[i]; /* 0 A 1 B 2 X 3 Y 4 LB 5 RB 6 back 7 start 8 power 9 Button stick left 10 Button stick right */ } } double cropped_speed(double speed) { return std::min(1.0,std::max(-1.0,speed)); } void setWheelSpeed() { static int mode=0,toggle=0; if((joybuttons[7]==1)&&(toggle==0)&&(mode==0)) { toggle=1; mode=1; }else if((joybuttons[7]==1)&&(toggle==0)&&(mode==1)){ toggle=1; mode=0; }else{ toggle=0; } /*normal mode*/ if(mode==0) { wheelSpeed[0]=joyaxes[1]*-1; wheelSpeed[1]=joyaxes[4]; wheelSpeed[2]=joyaxes[1]*-1; wheelSpeed[3]=joyaxes[4]; }else{ wheelSpeed[0]=joyaxes[1]*-1; wheelSpeed[1]=joyaxes[1]; wheelSpeed[2]=joyaxes[3]*0.3; wheelSpeed[3]=joyaxes[3]*0.3; } msg.id = 1; msg.len = 4; for(int i=0;i<4;i++) { msg.data[i] = ((cropped_speed(wheelSpeed[i])+1.0)/2.0)*253; } can.write(msg); } void setWaterSpeed() { waterPower[0] = Button(joybuttons[0],joybuttons[1]); waterPower[1] = Button(joybuttons[2],joybuttons[3]); waterPower[2] = Button(joybuttons[4],joybuttons[5]); msg.id = 2; msg.len = 4; for(int i=0;i<4;i++) { msg.data[i] = ((cropped_speed(waterPower[i])+1.0)/2.0)*253; } can.write(msg); } void setArmSpeed() { armPower[0]=joyaxes[6]; armPower[1]=joyaxes[7]; msg.id = 3; msg.len = 4; for(int i=0;i<4;i++) { msg.data[i] = ((cropped_speed(armPower[i])+1.0)/2.0)*253; } can.write(msg); } int main(){ bool flag=false; ros::NodeHandle nh; ros::Subscriber<sensor_msgs::Joy> sub("joy", &joy_callback); ros::Publisher pub("chatter", &debug_msg); nh.getHardware()->setBaud(921600); nh.initNode(); nh.subscribe(sub); nh.advertise(pub); can.frequency(125000); while(1) { nh.spinOnce(); setWheelSpeed(); setWaterSpeed(); setArmSpeed(); if(can.tderror()) { led2 = !led2; if(!flag){ flag=true; timeout.attach(&reset,TIMEOUT); } }else{ flag=false; timeout.detach(); } wait(0.01); } }