2月25日

Dependencies:   mbed SpeedController___2_25 ros_lib_kinetic

Committer:
yuki0701
Date:
Tue Feb 25 01:27:07 2020 +0000
Revision:
1:9d6e9312dab1
Parent:
0:c38fec6e4afd
a

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yuki0701 0:c38fec6e4afd 1 #include "mbed.h"
yuki0701 1:9d6e9312dab1 2 #include "math.h"
yuki0701 1:9d6e9312dab1 3 #include <ros.h>
yuki0701 1:9d6e9312dab1 4 #include <geometry_msgs/Point.h>
yuki0701 1:9d6e9312dab1 5 #include <geometry_msgs/Pose.h>
yuki0701 1:9d6e9312dab1 6 #include <std_msgs/String.h>
yuki0701 0:c38fec6e4afd 7 #include "EC.h" //Encoderライブラリをインクルード
yuki0701 0:c38fec6e4afd 8 #include "SpeedController.h" //SpeedControlライブラリをインクルード
yuki0701 1:9d6e9312dab1 9
yuki0701 1:9d6e9312dab1 10 ros::NodeHandle nh;
yuki0701 1:9d6e9312dab1 11 geometry_msgs::Point check_com;
yuki0701 1:9d6e9312dab1 12
yuki0701 1:9d6e9312dab1 13 ros::Publisher pub_check("/check_2",&check_com);
yuki0701 1:9d6e9312dab1 14
yuki0701 1:9d6e9312dab1 15
yuki0701 1:9d6e9312dab1 16 int i = 0;
yuki0701 1:9d6e9312dab1 17
yuki0701 1:9d6e9312dab1 18 double mt_out1,mt_out2;
yuki0701 1:9d6e9312dab1 19
yuki0701 0:c38fec6e4afd 20 #define RESOLUTION 512 //分解能
yuki0701 0:c38fec6e4afd 21 #define BASIC_SPEED 40 //動確用
yuki0701 0:c38fec6e4afd 22 //#define TEST_DUTY 0.3 //動確用
yuki0701 0:c38fec6e4afd 23
yuki0701 0:c38fec6e4afd 24
yuki0701 1:9d6e9312dab1 25 Ec4multi EC_1(p13,p14,RESOLUTION);
yuki0701 1:9d6e9312dab1 26 Ec4multi EC_2(p15,p16,RESOLUTION);
yuki0701 0:c38fec6e4afd 27 //Ec4multi EC_1(p15,p16,RESOLUTION);
yuki0701 0:c38fec6e4afd 28 //Ec4multi EC_2(p17,p18,RESOLUTION);
yuki0701 0:c38fec6e4afd 29
yuki0701 1:9d6e9312dab1 30 SpeedControl motor_1(p21,p22,50,EC_1);
yuki0701 1:9d6e9312dab1 31 SpeedControl motor_2(p24,p23,50,EC_2);
yuki0701 0:c38fec6e4afd 32 //SpeedControl motor_1(p21,p22,50,EC_1);
yuki0701 1:9d6e9312dab1 33 //SpeedControl motor_2(p24,p23,50,EC_2);
yuki0701 0:c38fec6e4afd 34
yuki0701 0:c38fec6e4afd 35 Ticker motor_tick; //角速度計算用ticker
yuki0701 1:9d6e9312dab1 36 //Serial pc(USBTX,USBRX); //このコメントを外したままROSとの通信をしようとすると、なぜか通信ができないので、コメントアウトしています。
yuki0701 0:c38fec6e4afd 37
yuki0701 0:c38fec6e4afd 38 Timer timer;
yuki0701 0:c38fec6e4afd 39
yuki0701 0:c38fec6e4afd 40
yuki0701 0:c38fec6e4afd 41 int j=0;
yuki0701 0:c38fec6e4afd 42 double rotate_1=40,rotate_2=40;
yuki0701 1:9d6e9312dab1 43 double gO_1;
yuki0701 1:9d6e9312dab1 44 double gO_2;
yuki0701 1:9d6e9312dab1 45 double MT01=0,MT02=0;
yuki0701 0:c38fec6e4afd 46 //double motor1_omega[1000]= {},motor2_omega[1000]= {},time_when[1000];
yuki0701 0:c38fec6e4afd 47 //int motor1_count[1000]= {},motor2_count[1000]= {};
yuki0701 1:9d6e9312dab1 48 double gb1, gb2;
yuki0701 1:9d6e9312dab1 49
yuki0701 1:9d6e9312dab1 50 void messageCallback(const geometry_msgs::Quaternion &mt2){
yuki0701 1:9d6e9312dab1 51 mt_out1 = (double)mt2.x/(double)4;
yuki0701 1:9d6e9312dab1 52 mt_out2 = (double)mt2.y/(double)4;
yuki0701 1:9d6e9312dab1 53 gb1 = (double)mt2.z;
yuki0701 1:9d6e9312dab1 54 gb2 = (double)mt2.w;
yuki0701 1:9d6e9312dab1 55 }
yuki0701 1:9d6e9312dab1 56
yuki0701 1:9d6e9312dab1 57 ros::Subscriber<geometry_msgs::Quaternion> sub("/mbed_mt2", &messageCallback);
yuki0701 0:c38fec6e4afd 58
yuki0701 0:c38fec6e4afd 59 void CalOmega()
yuki0701 0:c38fec6e4afd 60 {
yuki0701 1:9d6e9312dab1 61
yuki0701 1:9d6e9312dab1 62 check_com.x = mt_out1;
yuki0701 1:9d6e9312dab1 63 check_com.y = mt_out2;
yuki0701 1:9d6e9312dab1 64 check_com.z = 12;
yuki0701 1:9d6e9312dab1 65
yuki0701 1:9d6e9312dab1 66 pub_check.publish(&check_com);
yuki0701 1:9d6e9312dab1 67
yuki0701 1:9d6e9312dab1 68 //printf("check\n\r");
yuki0701 1:9d6e9312dab1 69
yuki0701 1:9d6e9312dab1 70
yuki0701 0:c38fec6e4afd 71 //motor1_count[j]=EC_1.getCount();
yuki0701 0:c38fec6e4afd 72 //motor2_count[j]=EC_2.getCount();
yuki0701 0:c38fec6e4afd 73 EC_1.calOmega();
yuki0701 0:c38fec6e4afd 74 EC_2.calOmega();
yuki0701 1:9d6e9312dab1 75 gO_1=EC_1.getOmega();
yuki0701 1:9d6e9312dab1 76 gO_2=EC_2.getOmega();
yuki0701 0:c38fec6e4afd 77 //motor1_omega[j]=EC_1.getOmega();
yuki0701 0:c38fec6e4afd 78 //motor2_omega[j]=EC_2.getOmega();
yuki0701 0:c38fec6e4afd 79 // time_when[j]=EC_1.timer_.read();
yuki0701 1:9d6e9312dab1 80 MT01=mt_out1;
yuki0701 1:9d6e9312dab1 81 MT02=mt_out2;
yuki0701 0:c38fec6e4afd 82 if(rotate_1==0) motor_1.stop();
yuki0701 1:9d6e9312dab1 83 else motor_1.Sc(MT01,3,EC_1.getOmega());
yuki0701 0:c38fec6e4afd 84 if(rotate_2==0) motor_2.stop();
yuki0701 1:9d6e9312dab1 85 else motor_2.Sc(MT02,4,EC_2.getOmega());
yuki0701 1:9d6e9312dab1 86
yuki0701 0:c38fec6e4afd 87
yuki0701 1:9d6e9312dab1 88 j++;
yuki0701 0:c38fec6e4afd 89 }
yuki0701 1:9d6e9312dab1 90
yuki0701 0:c38fec6e4afd 91 int main()
yuki0701 0:c38fec6e4afd 92 {
yuki0701 1:9d6e9312dab1 93
yuki0701 1:9d6e9312dab1 94 nh.getHardware()->setBaud(115200);
yuki0701 1:9d6e9312dab1 95 nh.initNode();
yuki0701 1:9d6e9312dab1 96 nh.advertise(pub_check);
yuki0701 1:9d6e9312dab1 97 nh.subscribe(sub);
yuki0701 1:9d6e9312dab1 98
yuki0701 0:c38fec6e4afd 99 motor_1.period_us(50);
yuki0701 0:c38fec6e4afd 100 motor_2.period_us(50);
yuki0701 1:9d6e9312dab1 101 //motor_1.setEquation(0.0429,0.05,0.0429,0.05); //求めたC,Dの値を設定
yuki0701 1:9d6e9312dab1 102 //motor_2.setEquation(0.0429,0.05,0.0429,0.05); //求めたC,Dの値を設定
yuki0701 1:9d6e9312dab1 103 motor_1.setEquation(0.0013,0.05,0.0013,0.04); //求めたC,Dの値を設定
yuki0701 1:9d6e9312dab1 104 motor_2.setEquation(0.0013,0.055,0.0013,0.047); //求めたC,Dの値を設定
yuki0701 0:c38fec6e4afd 105 motor_1.setPDparam(0,0.0); //PIDの係数を設定
yuki0701 0:c38fec6e4afd 106 motor_2.setPDparam(0,0.0); //PIDの係数を設定
yuki0701 1:9d6e9312dab1 107 //motor_1.setPDparam(0.1,0.0); //PIDの係数を設定
yuki0701 1:9d6e9312dab1 108 //motor_2.setPDparam(0.1,0.0); //PIDの係数を設定
yuki0701 1:9d6e9312dab1 109 motor_tick.attach(&CalOmega,0.01);
yuki0701 0:c38fec6e4afd 110
yuki0701 0:c38fec6e4afd 111
yuki0701 0:c38fec6e4afd 112 while(1) {
yuki0701 1:9d6e9312dab1 113 nh.spinOnce();
yuki0701 1:9d6e9312dab1 114 wait(0.01);
yuki0701 0:c38fec6e4afd 115 }
yuki0701 0:c38fec6e4afd 116 printf("finish\n\r");
yuki0701 1:9d6e9312dab1 117 }
yuki0701 1:9d6e9312dab1 118
yuki0701 1:9d6e9312dab1 119
yuki0701 1:9d6e9312dab1 120
yuki0701 1:9d6e9312dab1 121
yuki0701 1:9d6e9312dab1 122
yuki0701 1:9d6e9312dab1 123
yuki0701 1:9d6e9312dab1 124
yuki0701 1:9d6e9312dab1 125
yuki0701 1:9d6e9312dab1 126
yuki0701 1:9d6e9312dab1 127
yuki0701 1:9d6e9312dab1 128
yuki0701 1:9d6e9312dab1 129
yuki0701 1:9d6e9312dab1 130
yuki0701 1:9d6e9312dab1 131
yuki0701 1:9d6e9312dab1 132 ////CAN通信で受け取った(double)rotate‗1~rotate‗3に対し、実際に回転数制御を行う
yuki0701 1:9d6e9312dab1 133 //#include "mbed.h"
yuki0701 1:9d6e9312dab1 134 //#include "EC.h" //Encoderライブラリをインクルード
yuki0701 1:9d6e9312dab1 135 //#include "SpeedController.h" //SpeedControlライブラリをインクルード
yuki0701 1:9d6e9312dab1 136 //#include "can.h"
yuki0701 1:9d6e9312dab1 137 //#define RESOLUTION 512 //分解能
yuki0701 1:9d6e9312dab1 138 //#define BASIC_SPEED 40 //動確用
yuki0701 1:9d6e9312dab1 139 ////#define TEST_DUTY 0.3 //動確用
yuki0701 1:9d6e9312dab1 140 //
yuki0701 1:9d6e9312dab1 141 //
yuki0701 1:9d6e9312dab1 142 ////Ec4multi EC_1(p15,p16,RESOLUTION);
yuki0701 1:9d6e9312dab1 143 ////Ec4multi EC_2(p17,p18,RESOLUTION);
yuki0701 1:9d6e9312dab1 144 //Ec4multi EC_1(p15,p16,RESOLUTION);
yuki0701 1:9d6e9312dab1 145 //Ec4multi EC_2(p17,p18,RESOLUTION);
yuki0701 1:9d6e9312dab1 146 //
yuki0701 1:9d6e9312dab1 147 ////SpeedControl motor_1(p21,p22,50,EC_1);
yuki0701 1:9d6e9312dab1 148 ////SpeedControl motor_2(p23,p24,50,EC_2);
yuki0701 1:9d6e9312dab1 149 //SpeedControl motor_1(p22,p21,50,EC_1);
yuki0701 1:9d6e9312dab1 150 //SpeedControl motor_2(p23,p24,50,EC_2);
yuki0701 1:9d6e9312dab1 151 //
yuki0701 1:9d6e9312dab1 152 //Ticker motor_tick; //角速度計算用ticker
yuki0701 1:9d6e9312dab1 153 //Serial pc(USBTX,USBRX);
yuki0701 1:9d6e9312dab1 154 //
yuki0701 1:9d6e9312dab1 155 //Timer timer;
yuki0701 1:9d6e9312dab1 156 //
yuki0701 1:9d6e9312dab1 157 //
yuki0701 1:9d6e9312dab1 158 //int j=0;
yuki0701 1:9d6e9312dab1 159 //double rotate_1=40,rotate_2=40;
yuki0701 1:9d6e9312dab1 160 ////double motor1_omega[1000]= {},motor2_omega[1000]= {},time_when[1000];
yuki0701 1:9d6e9312dab1 161 ////int motor1_count[1000]= {},motor2_count[1000]= {};
yuki0701 1:9d6e9312dab1 162 //
yuki0701 1:9d6e9312dab1 163 //void CalOmega()
yuki0701 1:9d6e9312dab1 164 //{
yuki0701 1:9d6e9312dab1 165 // //motor1_count[j]=EC_1.getCount();
yuki0701 1:9d6e9312dab1 166 // //motor2_count[j]=EC_2.getCount();
yuki0701 1:9d6e9312dab1 167 // EC_1.calOmega();
yuki0701 1:9d6e9312dab1 168 // EC_2.calOmega();
yuki0701 1:9d6e9312dab1 169 // //motor1_omega[j]=EC_1.getOmega();
yuki0701 1:9d6e9312dab1 170 // //motor2_omega[j]=EC_2.getOmega();
yuki0701 1:9d6e9312dab1 171 //// time_when[j]=EC_1.timer_.read();
yuki0701 1:9d6e9312dab1 172 // if(rotate_1==0) motor_1.stop();
yuki0701 1:9d6e9312dab1 173 // else motor_1.Sc(mt_out1);
yuki0701 1:9d6e9312dab1 174 // if(rotate_2==0) motor_2.stop();
yuki0701 1:9d6e9312dab1 175 // else motor_2.Sc(mt_out2);
yuki0701 1:9d6e9312dab1 176 //
yuki0701 1:9d6e9312dab1 177 // j++;
yuki0701 1:9d6e9312dab1 178 //}
yuki0701 1:9d6e9312dab1 179 //int main()
yuki0701 1:9d6e9312dab1 180 //{
yuki0701 1:9d6e9312dab1 181 // UserLoopSetting_can();
yuki0701 1:9d6e9312dab1 182 // motor_1.period_us(50);
yuki0701 1:9d6e9312dab1 183 // motor_2.period_us(50);
yuki0701 1:9d6e9312dab1 184 // motor_1.setEquation(0.0429,0.05,0.0429,0.05); //求めたC,Dの値を設定
yuki0701 1:9d6e9312dab1 185 // motor_2.setEquation(0.0429,0.05,0.0429,0.05); //求めたC,Dの値を設定
yuki0701 1:9d6e9312dab1 186 // motor_1.setPDparam(0,0.0); //PIDの係数を設定
yuki0701 1:9d6e9312dab1 187 // motor_2.setPDparam(0,0.0); //PIDの係数を設定
yuki0701 1:9d6e9312dab1 188 // motor_tick.attach(&CalOmega,0.05);
yuki0701 1:9d6e9312dab1 189 //
yuki0701 1:9d6e9312dab1 190 // int k = 0;
yuki0701 1:9d6e9312dab1 191 //
yuki0701 1:9d6e9312dab1 192 // while(1) {
yuki0701 1:9d6e9312dab1 193 // // rotate_1 = mt_out1;
yuki0701 1:9d6e9312dab1 194 //// rotate_2 = mt_out2;
yuki0701 1:9d6e9312dab1 195 //
yuki0701 1:9d6e9312dab1 196 // if(k>100){
yuki0701 1:9d6e9312dab1 197 // printf("\nloop\n\n\r");
yuki0701 1:9d6e9312dab1 198 // k=0;
yuki0701 1:9d6e9312dab1 199 // }
yuki0701 1:9d6e9312dab1 200 // k++;
yuki0701 1:9d6e9312dab1 201 // }
yuki0701 1:9d6e9312dab1 202 // printf("finish\n\r");
yuki0701 1:9d6e9312dab1 203 //}