Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: DriveConroller IMU MDD Mycan Odometer PID RotaryEncoder UART USS mbed
Fork of AR_MastarNode by
Diff: main.cpp
- Revision:
- 0:6db16ad02a1b
- Child:
- 1:d7ceb38da3d8
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sat Aug 04 13:07:23 2018 +0000 @@ -0,0 +1,266 @@ +#include "mbed.h" +#include "DriveController.h" +#include "IMU.h" +#include "MDD.h" +#include "MDD2.h" +#include "Mycan.h" +#include "Odometer.h" +#include "PID.h" +#include "RotaryEncoder.h" +#include "CSV.h" +#include "SBUS.h" +#include "USS.h" +#include "hardwareConfig.h" + +//(X, Y, θ, speed, angle, injection, 補給昇降) +float position[10][7] = {{0.0, 0.0, 0.0, 0, 90, 0, 0.0},//x移動, 角度変化 + {-0.3, 0.0, 0.0, 0, 90, 0, 0.0},//y移動 + {-0.3, 5.0, 0.0, 0, 90, 0, 0.0},//発射 + {-0.3, 0.0, 0.0, 0, 90, 0, 0.0},//y移動,角度戻す, P上昇 + + {-0.6, 0.0, 0.0, 0, 90, 0, 0.0},//x移動, 角度変化, 下降&バットマン駆動 + {-0.6, 5.0, 0.0, 0, 90, 0, 0.0},//y移動 + {-0.6, 0.0, 0.0, 0, 90, 0, 0.0},//発射 + //{6.0, 0.0, 0.0, 20, 90, 0, 6.8},//y移動,角度戻す, P上昇 + + {-0.9, 0.0, 0.0, 20, 90, 0, 0.0},//x移動, 角度変化, 下降&バットマン駆動 + {-0.9, 5.0, 0.0, 20, 90, 0, 0.0},//y移動 + {-0.9, 0.0, 0.0, 20, 90, 0, 0.0},//発射 + //{7.0, 0.0, 0.0, 20, 90, 0, 6.8},//y移動,角度戻す, P上昇 + /* + {3.0, 0.0, 0.0, 20, 80, 0, 0.0},//x移動, 角度変化, 下降&バットマン駆動 + {3.0, 2.5, 0.0, 20, 80, 0, 0.0},//y移動 + {3.0, 2.5, 0.0, 20, 80, 1, 0.0},//下段に発射 + {3.0, 2.5, 0.0, 20, 90, 0, 6.8},//角度戻す, P上昇 + {3.0, 2.5, 0.0, 20, 80, 0, 0.0},//角度変化, 下降&バットマン駆動 + {3.0, 2.5, 0.0, 20, 80, 1, 0.0},//上段に発射 + {0.0, 0.0, 0.0, 20, 90, 0, 6.8} //x・y移動,スタートゾーンに戻る + */ + }; + +controller getPropoData(); +//bool isConvergence(int num); + +//x軸補正用 PID +PID pidRobotX(2, 0, 0, 0.01, 0.3); +float target_x = 0; + +//y軸補正用 PID +PID pidRobotY(2, 0, 0, 0.01, 0.3); +float target_y = 0; + +//USS用 +PID pidUss(0.02, 0, 0, 0.01, 0.3); +float target_uss = 25.0; + +int main() +{ + //タイマー3の優先度を最低にする + NVIC_SetPriority(TIMER3_IRQn, 100); + + //IMUのキャリブレーション + imu.performCalibration(); + imu.startAngleComputing(); + + //yow角補正用 (Pgain, Igain, Dgain, 制御ループ時間[s], 計算出力100%定義) + PID pidRobotYow(0.05, 0, 0, 0.01, 0.95); + float target = 0; + mecanum.imu_yow = &imu.angle[2]; + pidRobotYow.sensor = &imu.angle[2]; + pidRobotYow.target = ⌖ + pidRobotYow.start(); + + for(int i; i < 3; i++) + enc[i].changeDirection(); + + //オドメーターの定義 + float matrix[3][3] = {{1, 0, 0}, + {0, 1, 0}, + {0, 0, 0} + }; + Odometer odm(matrix, 0.048); + float tmp = 0; + float *encoders[3] = {&enc[0].rotations, &enc[1].rotations, &tmp}; + odm.setupOdometerSensors(encoders, &imu.angle[2]); + odm.startComputingOdometry(0.005, 0, 0, 0); + + //オドメーターX + pidRobotX.sensor = &odm.x; + pidRobotX.target = &target_x; + pidRobotX.start(); + + //オドメーターY + pidRobotY.sensor = &odm.y; + pidRobotY.target = &target_y; + pidRobotY.start(); + + //USS pid設定 + uss.startTriger(); + pidUss.sensor = &uss.distance; + pidUss.target = &target_uss; + pidUss.start(); + + while(1) + { + controller cmd = getPropoData(); //getPropoData & getCanData + + static int posi_num = 0; + static int reset_swich = 0; + if(cmd.H == 2 && reset_swich == 0) + { + posi_num += 1; + if(posi_num > 9) + posi_num = 0; + reset_swich = 1; + } + else if(cmd.H == 0 && reset_swich == 1) + reset_swich = 0; + + if(position[posi_num][5] == 1) + can.set(1, 1, position[posi_num][3]); + else + can.set(1, 1, 0); + can.set(1, 2, position[posi_num][4]); + can.set(2, 1, position[posi_num][6]); + can.send(); + + //ロボットの移動速度(LX, LY, RX) + float robot_velocity[3]; + + //yow角調整処理 + *pidRobotYow.target = position[posi_num][2]; + robot_velocity[2] = pidRobotYow.output; + + //x軸調整処理 + *pidRobotX.target = position[posi_num][0]; + robot_velocity[0] = pidRobotX.output; + + //USS距離調整処理 + if(posi_num == 2 || posi_num == 5 || posi_num == 8) + { + *pidUss.target = position[posi_num][1]; + robot_velocity[1] = -pidUss.output; + } + else + { + //y軸調整処理 + *pidRobotY.target = position[posi_num][1]; + robot_velocity[1] = pidRobotY.output; + } + + //角度・XYリセット + if(cmd.F == 2) + { + imu.angle[2] = 0; + *pidRobotYow.target = 0; + odm.x = 0; + *pidRobotX.target = 0; + odm.y = 0; + *pidRobotY.target = 0; + } + + //ホイール速度計算 + mecanum.setVelL(robot_velocity); + mecanum.computeWheelVel(); + mecanum.rescaleWheelVel(); + + //モーターの駆動 + for(int i = 0; i < 4; i++) + Motor[i].drive(mecanum.wheel_vel[i]); + + //posi_num += isConvergence(posi_num); + + pc.printf("%.2f\t", odm.x); + pc.printf("%.2f\t", odm.y); + + pc.printf("\n"); + wait(0.02); + } +} + +controller getPropoData() +{ + float dead_zone = 0.05; + controller propo; + sbus.isFailSafe(); + + //propo直接コントロール + if(sbus.isFailSafe()) + { + propo.LX = propo.LY = propo.RX = propo.RY = 0; + propo.H = propo.A = propo.D = propo.F = propo.G = propo.fail_safe = 0; + } + else + { + propo.LX = sbus.getStickVal(0) / 255.0; + propo.LY = sbus.getStickVal(1) / 255.0; + propo.RX = -sbus.getStickVal(2) / 255.0; + propo.RY = sbus.getStickVal(3) / 255.0; + propo.H = sbus.getSwitchVal(0); + propo.C = sbus.getSwitchVal(1); + propo.E = sbus.getSwitchVal(2); + propo.F = sbus.getSwitchVal(3); + propo.G = sbus.getSwitchVal(4); + propo.fail_safe = 1; + } + + if(propo.RX < dead_zone && propo.RX > -dead_zone) propo.RX = 0; + if(propo.RY < dead_zone && propo.RY > -dead_zone) propo.RY = 0; + if(propo.LX < dead_zone && propo.LX > -dead_zone) propo.LX = 0; + if(propo.LY < dead_zone && propo.LY > -dead_zone) propo.LY = 0; + return propo; +} + +/* +bool isConvergence(int num) +{ + bool tf; + if(num > 3 && num < 8) + num -= 4; + else if(num > 7 && num < 12) + num -= 8; + else if(num > 11 && num < 15) + num -= 8; + + if(num == 0) + { + if(pidRobotX.output == 0) + tf = 1; + else + tf = 0; + } + else if(num == 1) + { + if(pidUss.output == 0) + tf = 1; + else + tf = 0; + } + else if(num == 2) + { + wait(1.0); + tf = 1; + } + else if(num == 3) + { + if(pidRobotY.output == 0) + tf = 1; + else + tf = 0; + } + else if(num == 15) + { + + } + else if(num == 16) + { + + } + else if(num == 17) + { + + } + + return tf; +} +*/ \ No newline at end of file