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: mbed YKNCT_Movement SBDBT BNO055 YKNCT_MD YKNCT_I2C
main.cpp@12:1daa4d490a12, 2020-03-24 (annotated)
- Committer:
- yoshikawaryota
- Date:
- Tue Mar 24 07:22:31 2020 +0000
- Revision:
- 12:1daa4d490a12
- Parent:
- 11:80b1daeb243f
- Child:
- 13:e4de7896f808
update OEI;Ver.yoshikawa
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| TakushimaYukimasa | 0:9e851dc42cde | 1 | /** |
| TakushimaYukimasa | 0:9e851dc42cde | 2 | ******************************************************************************** |
| TakushimaYukimasa | 0:9e851dc42cde | 3 | * @file main.c |
| TakushimaYukimasa | 0:9e851dc42cde | 4 | * @author You |
| TakushimaYukimasa | 0:9e851dc42cde | 5 | * @version V?.?.? |
| TakushimaYukimasa | 0:9e851dc42cde | 6 | * @date Today |
| TakushimaYukimasa | 0:9e851dc42cde | 7 | * @brief メインファイル |
| TakushimaYukimasa | 0:9e851dc42cde | 8 | ****************************************************************************** |
| TakushimaYukimasa | 0:9e851dc42cde | 9 | */ |
| TakushimaYukimasa | 0:9e851dc42cde | 10 | |
| TakushimaYukimasa | 0:9e851dc42cde | 11 | /* Includes ------------------------------------------------------------------*/ |
| TakushimaYukimasa | 0:9e851dc42cde | 12 | #include <main.h> |
| TakushimaYukimasa | 0:9e851dc42cde | 13 | |
| TakushimaYukimasa | 0:9e851dc42cde | 14 | /* 型定義 --------------------------------------------------------------------*/ |
| TakushimaYukimasa | 0:9e851dc42cde | 15 | |
| TakushimaYukimasa | 0:9e851dc42cde | 16 | /* ロボットの加速度 */ |
| TakushimaYukimasa | 0:9e851dc42cde | 17 | ROCATION NowAcc; |
| TakushimaYukimasa | 0:9e851dc42cde | 18 | /* ロボットの座標 */ |
| TakushimaYukimasa | 0:9e851dc42cde | 19 | ROCATION NowLoc; |
| yoshikawaryota | 2:ec149525ec2a | 20 | /* ロボットの目標座標 */ |
| yoshikawaryota | 2:ec149525ec2a | 21 | ROCATION Target; |
| TakushimaYukimasa | 0:9e851dc42cde | 22 | |
| TakushimaYukimasa | 0:9e851dc42cde | 23 | /* 定数定義 ------------------------------------------------------------------*/ |
| TakushimaYukimasa | 0:9e851dc42cde | 24 | /* マクロ定義 ----------------------------------------------------------------*/ |
| TakushimaYukimasa | 0:9e851dc42cde | 25 | /* 関数プロトタイプ宣言 -------------------------------------------------------*/ |
| TakushimaYukimasa | 0:9e851dc42cde | 26 | |
| TakushimaYukimasa | 0:9e851dc42cde | 27 | /* タイマ呼び出し用 */ |
| TakushimaYukimasa | 0:9e851dc42cde | 28 | void IT_CallBack(void); |
| TakushimaYukimasa | 0:9e851dc42cde | 29 | |
| TakushimaYukimasa | 0:9e851dc42cde | 30 | /* 自己位置推定処理 */ |
| TakushimaYukimasa | 0:9e851dc42cde | 31 | void LocEstimate(void); |
| TakushimaYukimasa | 0:9e851dc42cde | 32 | |
| yoshikawaryota | 7:93ab5505ac1b | 33 | /* オムニ関係 */ |
| yoshikawaryota | 7:93ab5505ac1b | 34 | void SubOmuni(int X,int Y,int R); |
| yoshikawaryota | 2:ec149525ec2a | 35 | |
| yoshikawaryota | 8:ddedee42c253 | 36 | /* 台形制御値代入 */ |
| yoshikawaryota | 9:8c550d496736 | 37 | int omuni_control(int tar_x, int tar_y, int tar_theta, int error); |
| TakushimaYukimasa | 0:9e851dc42cde | 38 | |
| TakushimaYukimasa | 0:9e851dc42cde | 39 | /* 変数定義 ------------------------------------------------------------------*/ |
| TakushimaYukimasa | 0:9e851dc42cde | 40 | |
| TakushimaYukimasa | 0:9e851dc42cde | 41 | /* 操作権 0…なし 1…手動 2…自動 */ |
| TakushimaYukimasa | 0:9e851dc42cde | 42 | int operate=0; |
| TakushimaYukimasa | 0:9e851dc42cde | 43 | |
| TakushimaYukimasa | 0:9e851dc42cde | 44 | /* 自動シーケンス */ |
| TakushimaYukimasa | 0:9e851dc42cde | 45 | int auto_mode=0; |
| TakushimaYukimasa | 0:9e851dc42cde | 46 | |
| TakushimaYukimasa | 0:9e851dc42cde | 47 | /* 直読みエンコーダ角度保存(degree) */ |
| TakushimaYukimasa | 0:9e851dc42cde | 48 | double EncoderDeg[EncoderMAX] = {0}; |
| TakushimaYukimasa | 0:9e851dc42cde | 49 | |
| TakushimaYukimasa | 0:9e851dc42cde | 50 | /* 足回り値保存変数 */ |
| yoshikawaryota | 2:ec149525ec2a | 51 | int MovMotor[4]= {0}; |
| TakushimaYukimasa | 0:9e851dc42cde | 52 | |
| TakushimaYukimasa | 0:9e851dc42cde | 53 | /* 自動yaw補整目標角度 */ |
| TakushimaYukimasa | 0:9e851dc42cde | 54 | double TarTheta=0; |
| TakushimaYukimasa | 0:9e851dc42cde | 55 | |
| yoshikawaryota | 1:b9f698be841c | 56 | /* 補正値用定数 */ |
| yoshikawaryota | 1:b9f698be841c | 57 | int cor=4; |
| yoshikawaryota | 1:b9f698be841c | 58 | |
| TakushimaYukimasa | 0:9e851dc42cde | 59 | /* クラス定義 ----------------------------------------------------------------*/ |
| TakushimaYukimasa | 0:9e851dc42cde | 60 | |
| TakushimaYukimasa | 0:9e851dc42cde | 61 | /* 割り込み用クラス */ |
| TakushimaYukimasa | 0:9e851dc42cde | 62 | Ticker flipper; |
| TakushimaYukimasa | 0:9e851dc42cde | 63 | |
| yoshikawaryota | 1:b9f698be841c | 64 | /* gyro用タイマ */ |
| yoshikawaryota | 1:b9f698be841c | 65 | Timer yawCnt; |
| yoshikawaryota | 1:b9f698be841c | 66 | |
| yoshikawaryota | 2:ec149525ec2a | 67 | /* P制御終了タイマ */ |
| yoshikawaryota | 2:ec149525ec2a | 68 | Timer P_fin; |
| yoshikawaryota | 2:ec149525ec2a | 69 | |
| yoshikawaryota | 7:93ab5505ac1b | 70 | /* タイマ加速 */ |
| yoshikawaryota | 7:93ab5505ac1b | 71 | Timer Acc_time; |
| yoshikawaryota | 7:93ab5505ac1b | 72 | |
| TakushimaYukimasa | 0:9e851dc42cde | 73 | /* UART (Tx,Rx) */ |
| TakushimaYukimasa | 0:9e851dc42cde | 74 | Serial telemetry(USBTX, USBRX, 115200); |
| TakushimaYukimasa | 0:9e851dc42cde | 75 | |
| TakushimaYukimasa | 0:9e851dc42cde | 76 | /* コントローラー */ |
| TakushimaYukimasa | 0:9e851dc42cde | 77 | SBDBT DS3(PA_0, PA_1, 9600); |
| TakushimaYukimasa | 0:9e851dc42cde | 78 | |
| TakushimaYukimasa | 0:9e851dc42cde | 79 | /* オンボードLED */ |
| TakushimaYukimasa | 0:9e851dc42cde | 80 | DigitalOut led(LED2); |
| TakushimaYukimasa | 0:9e851dc42cde | 81 | |
| TakushimaYukimasa | 0:9e851dc42cde | 82 | /* USERボタン */ |
| TakushimaYukimasa | 0:9e851dc42cde | 83 | DigitalIn UB(PC_13,PullDown); |
| TakushimaYukimasa | 0:9e851dc42cde | 84 | |
| TakushimaYukimasa | 0:9e851dc42cde | 85 | /* エンコーダーピン CS */ |
| TakushimaYukimasa | 0:9e851dc42cde | 86 | DigitalOut CS[] = {PA_2,PA_3}; |
| TakushimaYukimasa | 0:9e851dc42cde | 87 | DigitalOut CL[] = {PA_4,PA_5}; |
| TakushimaYukimasa | 0:9e851dc42cde | 88 | DigitalIn DO[] = {PA_6,PA_7}; |
| TakushimaYukimasa | 0:9e851dc42cde | 89 | |
| TakushimaYukimasa | 0:9e851dc42cde | 90 | /* 足回り動作クラス定義 */ |
| TakushimaYukimasa | 0:9e851dc42cde | 91 | Move omuni(MovMotor,NowLoc.theta); |
| TakushimaYukimasa | 0:9e851dc42cde | 92 | |
| TakushimaYukimasa | 0:9e851dc42cde | 93 | /* I2C MDのクラス定義 */ |
| TakushimaYukimasa | 0:9e851dc42cde | 94 | YKNCT_MD_I2C MD(PB_9,PB_8); |
| TakushimaYukimasa | 0:9e851dc42cde | 95 | |
| TakushimaYukimasa | 0:9e851dc42cde | 96 | /* ジャイロのピン設定 */ |
| TakushimaYukimasa | 0:9e851dc42cde | 97 | BNO055 bno(PB_9, PB_8); |
| TakushimaYukimasa | 0:9e851dc42cde | 98 | |
| TakushimaYukimasa | 0:9e851dc42cde | 99 | |
| TakushimaYukimasa | 0:9e851dc42cde | 100 | /*----------------------------------- main ----------------------------------*/ |
| TakushimaYukimasa | 0:9e851dc42cde | 101 | int main() |
| TakushimaYukimasa | 0:9e851dc42cde | 102 | { |
| yoshikawaryota | 2:ec149525ec2a | 103 | telemetry.printf("\n\rMainStart"); |
| TakushimaYukimasa | 0:9e851dc42cde | 104 | |
| yoshikawaryota | 2:ec149525ec2a | 105 | /* 割り込みの設定 |
| yoshikawaryota | 2:ec149525ec2a | 106 | * IT_CallBack関数を0.1msで割り込み */ |
| yoshikawaryota | 2:ec149525ec2a | 107 | flipper.attach_us(&IT_CallBack, 100); |
| TakushimaYukimasa | 0:9e851dc42cde | 108 | |
| yoshikawaryota | 2:ec149525ec2a | 109 | /* ジャイロの設定 */ |
| yoshikawaryota | 2:ec149525ec2a | 110 | bno.setmode(OPERATION_MODE_IMUPLUS); |
| TakushimaYukimasa | 0:9e851dc42cde | 111 | |
| yoshikawaryota | 2:ec149525ec2a | 112 | /* I2CMDの設定 */ |
| yoshikawaryota | 2:ec149525ec2a | 113 | MD.Init(0,MD_SMB); |
| yoshikawaryota | 2:ec149525ec2a | 114 | MD.Init(1,MD_SMB); |
| yoshikawaryota | 2:ec149525ec2a | 115 | MD.Init(2,MD_SMB); |
| yoshikawaryota | 2:ec149525ec2a | 116 | MD.Init(3,MD_SMB); |
| TakushimaYukimasa | 0:9e851dc42cde | 117 | |
| yoshikawaryota | 2:ec149525ec2a | 118 | telemetry.printf("\n\rMainLoopStart"); |
| yoshikawaryota | 2:ec149525ec2a | 119 | /* メインループ --------------------------------------------------------------*/ |
| yoshikawaryota | 2:ec149525ec2a | 120 | while(1) { |
| yoshikawaryota | 2:ec149525ec2a | 121 | /* オンボードLED点滅 */ |
| yoshikawaryota | 2:ec149525ec2a | 122 | led=!led; |
| TakushimaYukimasa | 0:9e851dc42cde | 123 | |
| yoshikawaryota | 2:ec149525ec2a | 124 | /* 表示改行 */ |
| yoshikawaryota | 2:ec149525ec2a | 125 | telemetry.printf("\n\r"); |
| TakushimaYukimasa | 0:9e851dc42cde | 126 | |
| yoshikawaryota | 2:ec149525ec2a | 127 | /* 自動処理関連テレメトリ */ |
| yoshikawaryota | 2:ec149525ec2a | 128 | telemetry.printf("ope:%d ",operate); |
| yoshikawaryota | 2:ec149525ec2a | 129 | /* 座標テレメトリ */ |
| yoshikawaryota | 2:ec149525ec2a | 130 | telemetry.printf("X:%4.0f Y:%4.0f T:%4.0f ",NowLoc.X,NowLoc.Y,NowLoc.theta); |
| TakushimaYukimasa | 0:9e851dc42cde | 131 | |
| yoshikawaryota | 2:ec149525ec2a | 132 | /* 自己位置推定更新 */ |
| yoshikawaryota | 2:ec149525ec2a | 133 | LocEstimate(); |
| TakushimaYukimasa | 0:9e851dc42cde | 134 | |
| yoshikawaryota | 7:93ab5505ac1b | 135 | for(int i=0; i<4; i++) { |
| yoshikawaryota | 7:93ab5505ac1b | 136 | MD.Set(i,MovMotor[i]); |
| yoshikawaryota | 7:93ab5505ac1b | 137 | MovMotor[i]=0; |
| yoshikawaryota | 7:93ab5505ac1b | 138 | } |
| yoshikawaryota | 2:ec149525ec2a | 139 | /* I2CMD実行 */ |
| yoshikawaryota | 2:ec149525ec2a | 140 | MD.Exe(); |
| yoshikawaryota | 2:ec149525ec2a | 141 | |
| yoshikawaryota | 2:ec149525ec2a | 142 | /* タイマ-スタート */ |
| yoshikawaryota | 2:ec149525ec2a | 143 | yawCnt.start(); |
| yoshikawaryota | 2:ec149525ec2a | 144 | /* タイマーリセット */ |
| yoshikawaryota | 2:ec149525ec2a | 145 | yawCnt.reset(); |
| TakushimaYukimasa | 0:9e851dc42cde | 146 | |
| TakushimaYukimasa | 0:9e851dc42cde | 147 | |
| yoshikawaryota | 2:ec149525ec2a | 148 | /* 操縦権変更 ×停止 △手動 〇自動 */ |
| yoshikawaryota | 2:ec149525ec2a | 149 | if(DS3.CROSS) operate=0; |
| yoshikawaryota | 2:ec149525ec2a | 150 | if(DS3.TRIANGLE) operate=1; |
| yoshikawaryota | 2:ec149525ec2a | 151 | if(DS3.CIRCLE) operate=2; |
| TakushimaYukimasa | 0:9e851dc42cde | 152 | |
| yoshikawaryota | 2:ec149525ec2a | 153 | /* 操縦権:なし 停止動作 */ |
| yoshikawaryota | 2:ec149525ec2a | 154 | if(operate==0) { |
| yoshikawaryota | 2:ec149525ec2a | 155 | /* 足回り停止 */ |
| yoshikawaryota | 2:ec149525ec2a | 156 | omuni.XmarkOmni_Move(0,0,0); |
| yoshikawaryota | 2:ec149525ec2a | 157 | for (int i = 0; i < 4; i++) { |
| yoshikawaryota | 1:b9f698be841c | 158 | MD.Set(i,MovMotor[i]); |
| yoshikawaryota | 1:b9f698be841c | 159 | } |
| TakushimaYukimasa | 0:9e851dc42cde | 160 | |
| yoshikawaryota | 2:ec149525ec2a | 161 | } |
| yoshikawaryota | 2:ec149525ec2a | 162 | /* 操縦権:手動 */ |
| yoshikawaryota | 2:ec149525ec2a | 163 | else if(operate==1) { |
| yoshikawaryota | 2:ec149525ec2a | 164 | /* 足回り手動動作 */ |
| yoshikawaryota | 2:ec149525ec2a | 165 | int x_val = (double)(DS3.LX-64)*100/64; |
| yoshikawaryota | 2:ec149525ec2a | 166 | int y_val = (double)(64-DS3.LY)*100/64; |
| yoshikawaryota | 2:ec149525ec2a | 167 | int r_val = (double)(DS3.RX-64)*100/64; |
| yoshikawaryota | 1:b9f698be841c | 168 | |
| yoshikawaryota | 2:ec149525ec2a | 169 | /* 目標角更新 */ |
| yoshikawaryota | 2:ec149525ec2a | 170 | if(DS3.RX!=64) yawCnt.reset(); |
| yoshikawaryota | 2:ec149525ec2a | 171 | if(yawCnt.read_ms()<1000) TarTheta=NowLoc.theta; |
| yoshikawaryota | 2:ec149525ec2a | 172 | |
| yoshikawaryota | 2:ec149525ec2a | 173 | /* gyro値による補正 */ |
| yoshikawaryota | 2:ec149525ec2a | 174 | r_val += (TarTheta-NowLoc.theta)*cor; |
| yoshikawaryota | 2:ec149525ec2a | 175 | |
| yoshikawaryota | 7:93ab5505ac1b | 176 | SubOmuni(x_val, y_val, r_val); |
| TakushimaYukimasa | 0:9e851dc42cde | 177 | |
| yoshikawaryota | 2:ec149525ec2a | 178 | } |
| yoshikawaryota | 2:ec149525ec2a | 179 | /* 操縦権:自動 */ |
| yoshikawaryota | 2:ec149525ec2a | 180 | else if(operate==2) { |
| yoshikawaryota | 2:ec149525ec2a | 181 | switch(auto_mode) { |
| yoshikawaryota | 2:ec149525ec2a | 182 | /* スタート待機処理 */ |
| yoshikawaryota | 2:ec149525ec2a | 183 | case 0: |
| yoshikawaryota | 2:ec149525ec2a | 184 | /* オンボードSWで次のステップに */ |
| yoshikawaryota | 2:ec149525ec2a | 185 | if(UB) auto_mode++; |
| yoshikawaryota | 2:ec149525ec2a | 186 | break; |
| TakushimaYukimasa | 0:9e851dc42cde | 187 | |
| yoshikawaryota | 12:1daa4d490a12 | 188 | /* 〇〇の処理(青ゾーン) */ |
| yoshikawaryota | 2:ec149525ec2a | 189 | case 1: |
| yoshikawaryota | 12:1daa4d490a12 | 190 | if(omuni_control(1950, 1250, 0, 100) == 1) auto_mode++; |
| yoshikawaryota | 12:1daa4d490a12 | 191 | break; |
| yoshikawaryota | 12:1daa4d490a12 | 192 | case 2: |
| yoshikawaryota | 12:1daa4d490a12 | 193 | if(omuni_control(1950, 2750, 0, 100) == 1) auto_mode++; |
| yoshikawaryota | 12:1daa4d490a12 | 194 | break; |
| yoshikawaryota | 12:1daa4d490a12 | 195 | case 3: |
| yoshikawaryota | 12:1daa4d490a12 | 196 | if(omuni_control(510, 2750, 0, 100) == 1) auto_mode++; |
| yoshikawaryota | 12:1daa4d490a12 | 197 | break; |
| yoshikawaryota | 12:1daa4d490a12 | 198 | case 4: |
| yoshikawaryota | 12:1daa4d490a12 | 199 | if(omuni_control(510, 4250, 0, 100) == 1) auto_mode++; |
| yoshikawaryota | 12:1daa4d490a12 | 200 | break; |
| yoshikawaryota | 12:1daa4d490a12 | 201 | case 5: |
| yoshikawaryota | 12:1daa4d490a12 | 202 | if(omuni_control(1950, 4250, 0, 100) == 1) auto_mode++; |
| yoshikawaryota | 12:1daa4d490a12 | 203 | break; |
| yoshikawaryota | 12:1daa4d490a12 | 204 | case 6: |
| yoshikawaryota | 12:1daa4d490a12 | 205 | if(omuni_control(1950, 5750, 0, 100) == 1) auto_mode++; |
| yoshikawaryota | 12:1daa4d490a12 | 206 | break; |
| yoshikawaryota | 12:1daa4d490a12 | 207 | case 7: |
| yoshikawaryota | 12:1daa4d490a12 | 208 | if(omuni_control(1210, 5750, 0, 100) == 1) auto_mode++; |
| yoshikawaryota | 12:1daa4d490a12 | 209 | break; |
| yoshikawaryota | 12:1daa4d490a12 | 210 | case 8: |
| yoshikawaryota | 12:1daa4d490a12 | 211 | if(omuni_control(1210, 9000, 0, 100) == 1) auto_mode++; |
| yoshikawaryota | 12:1daa4d490a12 | 212 | break; |
| yoshikawaryota | 12:1daa4d490a12 | 213 | case 9: |
| yoshikawaryota | 12:1daa4d490a12 | 214 | if(omuni_control(5515, 9000, 0, 100) == 1) auto_mode++; |
| yoshikawaryota | 2:ec149525ec2a | 215 | break; |
| TakushimaYukimasa | 0:9e851dc42cde | 216 | |
| yoshikawaryota | 12:1daa4d490a12 | 217 | /* 〇〇の処理(赤ゾーン) */ |
| yoshikawaryota | 12:1daa4d490a12 | 218 | /*case 1: |
| yoshikawaryota | 12:1daa4d490a12 | 219 | if(omuni_control(-1950, 1250, 0, 100) == 1) auto_mode++; |
| yoshikawaryota | 12:1daa4d490a12 | 220 | break; |
| yoshikawaryota | 12:1daa4d490a12 | 221 | case 2: |
| yoshikawaryota | 12:1daa4d490a12 | 222 | if(omuni_control(-1950, 2750, 0, 100) == 1) auto_mode++; |
| yoshikawaryota | 12:1daa4d490a12 | 223 | break; |
| yoshikawaryota | 12:1daa4d490a12 | 224 | case 3: |
| yoshikawaryota | 12:1daa4d490a12 | 225 | if(omuni_control(-510, 2750, 0, 100) == 1) auto_mode++; |
| yoshikawaryota | 12:1daa4d490a12 | 226 | break; |
| yoshikawaryota | 12:1daa4d490a12 | 227 | case 4: |
| yoshikawaryota | 12:1daa4d490a12 | 228 | if(omuni_control(-510, 4250, 0, 100) == 1) auto_mode++; |
| yoshikawaryota | 12:1daa4d490a12 | 229 | break; |
| yoshikawaryota | 12:1daa4d490a12 | 230 | case 5: |
| yoshikawaryota | 12:1daa4d490a12 | 231 | if(omuni_control(-1950, 4250, 0, 100) == 1) auto_mode++; |
| yoshikawaryota | 12:1daa4d490a12 | 232 | break; |
| yoshikawaryota | 12:1daa4d490a12 | 233 | case 6: |
| yoshikawaryota | 12:1daa4d490a12 | 234 | if(omuni_control(-1950, 5750, 0, 100) == 1) auto_mode++; |
| yoshikawaryota | 12:1daa4d490a12 | 235 | break; |
| yoshikawaryota | 12:1daa4d490a12 | 236 | case 7: |
| yoshikawaryota | 12:1daa4d490a12 | 237 | if(omuni_control(-1210, 5750, 0, 100) == 1) auto_mode++; |
| yoshikawaryota | 12:1daa4d490a12 | 238 | break; |
| yoshikawaryota | 12:1daa4d490a12 | 239 | case 8: |
| yoshikawaryota | 12:1daa4d490a12 | 240 | if(omuni_control(-1210, 9000, 0, 100) == 1) auto_mode++; |
| yoshikawaryota | 12:1daa4d490a12 | 241 | break; |
| yoshikawaryota | 12:1daa4d490a12 | 242 | case 9: |
| yoshikawaryota | 12:1daa4d490a12 | 243 | if(omuni_control(-5515, 9000, 0, 100) == 1) auto_mode++; |
| yoshikawaryota | 12:1daa4d490a12 | 244 | break; |
| yoshikawaryota | 12:1daa4d490a12 | 245 | */ |
| yoshikawaryota | 12:1daa4d490a12 | 246 | |
| yoshikawaryota | 2:ec149525ec2a | 247 | /* 終了処理 */ |
| yoshikawaryota | 2:ec149525ec2a | 248 | default: |
| yoshikawaryota | 2:ec149525ec2a | 249 | auto_mode=0; |
| yoshikawaryota | 2:ec149525ec2a | 250 | operate=0; |
| yoshikawaryota | 2:ec149525ec2a | 251 | break; |
| yoshikawaryota | 2:ec149525ec2a | 252 | } |
| yoshikawaryota | 2:ec149525ec2a | 253 | } |
| yoshikawaryota | 2:ec149525ec2a | 254 | |
| TakushimaYukimasa | 0:9e851dc42cde | 255 | } |
| TakushimaYukimasa | 0:9e851dc42cde | 256 | } |
| TakushimaYukimasa | 0:9e851dc42cde | 257 | |
| TakushimaYukimasa | 0:9e851dc42cde | 258 | |
| TakushimaYukimasa | 0:9e851dc42cde | 259 | /******************************************************************************* |
| TakushimaYukimasa | 0:9e851dc42cde | 260 | * @概要 自己位置推定関数 |
| TakushimaYukimasa | 0:9e851dc42cde | 261 | * @引数 なし |
| TakushimaYukimasa | 0:9e851dc42cde | 262 | * @返り値 なし |
| TakushimaYukimasa | 0:9e851dc42cde | 263 | *******************************************************************************/ |
| yoshikawaryota | 2:ec149525ec2a | 264 | void LocEstimate(void) |
| yoshikawaryota | 2:ec149525ec2a | 265 | { |
| yoshikawaryota | 2:ec149525ec2a | 266 | static double GyroDeg[2]= {0}; |
| yoshikawaryota | 2:ec149525ec2a | 267 | static double EncDeg[2][2]= {0}; |
| yoshikawaryota | 2:ec149525ec2a | 268 | static double disp[3]= {0}; |
| TakushimaYukimasa | 0:9e851dc42cde | 269 | |
| yoshikawaryota | 7:93ab5505ac1b | 270 | |
| yoshikawaryota | 7:93ab5505ac1b | 271 | |
| yoshikawaryota | 2:ec149525ec2a | 272 | /* ジャイロの値取得 */ |
| yoshikawaryota | 2:ec149525ec2a | 273 | bno.get_angles(); |
| yoshikawaryota | 2:ec149525ec2a | 274 | GyroDeg[1]=GyroDeg[0]; |
| yoshikawaryota | 2:ec149525ec2a | 275 | GyroDeg[0]=bno.euler.yaw; |
| yoshikawaryota | 2:ec149525ec2a | 276 | if(GyroDeg[0]!=0) { |
| yoshikawaryota | 2:ec149525ec2a | 277 | /* 359→0を跨いだ時,前回の値を0から逆回転で負の値で表記 */ |
| yoshikawaryota | 2:ec149525ec2a | 278 | if(GyroDeg[1]<90 && GyroDeg[0]>270) GyroDeg[1]+=360; |
| yoshikawaryota | 2:ec149525ec2a | 279 | /* 0→359を跨いだ時,前回の値を360以上の値で表記 */ |
| yoshikawaryota | 2:ec149525ec2a | 280 | else if(GyroDeg[1]>270 && GyroDeg[0]<90) GyroDeg[1]-=360; |
| yoshikawaryota | 2:ec149525ec2a | 281 | /* 差を求める*/ |
| yoshikawaryota | 2:ec149525ec2a | 282 | disp[2]=GyroDeg[1]-GyroDeg[0]; |
| yoshikawaryota | 2:ec149525ec2a | 283 | } |
| yoshikawaryota | 2:ec149525ec2a | 284 | /* Enc2つの差分求める */ |
| yoshikawaryota | 2:ec149525ec2a | 285 | for(int i=0; i<2; i++) { |
| yoshikawaryota | 2:ec149525ec2a | 286 | EncDeg[i][1]=EncDeg[i][0]; |
| yoshikawaryota | 2:ec149525ec2a | 287 | EncDeg[i][0]=EncoderDeg[i]; |
| yoshikawaryota | 7:93ab5505ac1b | 288 | disp[i]=DEG_TO_DIS(EncDeg[i][1]-EncDeg[i][0]); |
| yoshikawaryota | 2:ec149525ec2a | 289 | } |
| yoshikawaryota | 2:ec149525ec2a | 290 | /* 差分を加速度として保存 */ |
| yoshikawaryota | 2:ec149525ec2a | 291 | NowAcc.theta = disp[2]; |
| yoshikawaryota | 7:93ab5505ac1b | 292 | NowAcc.X = -disp[0] * cos(DEG_TO_RAD(NowLoc.theta)) - disp[1] * sin(DEG_TO_RAD(NowLoc.theta)); |
| yoshikawaryota | 7:93ab5505ac1b | 293 | NowAcc.Y = -disp[0] * sin(DEG_TO_RAD(NowLoc.theta)) + disp[1] * cos(DEG_TO_RAD(NowLoc.theta)); |
| yoshikawaryota | 2:ec149525ec2a | 294 | /* 差分を累積して現在位置を保存 */ |
| yoshikawaryota | 2:ec149525ec2a | 295 | NowLoc.X += NowAcc.X; |
| yoshikawaryota | 2:ec149525ec2a | 296 | NowLoc.Y += NowAcc.Y; |
| yoshikawaryota | 2:ec149525ec2a | 297 | NowLoc.theta += NowAcc.theta; |
| TakushimaYukimasa | 0:9e851dc42cde | 298 | } |
| TakushimaYukimasa | 0:9e851dc42cde | 299 | |
| TakushimaYukimasa | 0:9e851dc42cde | 300 | |
| TakushimaYukimasa | 0:9e851dc42cde | 301 | |
| TakushimaYukimasa | 0:9e851dc42cde | 302 | |
| TakushimaYukimasa | 0:9e851dc42cde | 303 | /* 割り込み(100us) *************************************************************/ |
| TakushimaYukimasa | 0:9e851dc42cde | 304 | void IT_CallBack(void) |
| TakushimaYukimasa | 0:9e851dc42cde | 305 | { |
| yoshikawaryota | 2:ec149525ec2a | 306 | static int cnt = 0; |
| yoshikawaryota | 2:ec149525ec2a | 307 | static int data[EncoderMAX] = {0}; |
| yoshikawaryota | 2:ec149525ec2a | 308 | static double EncDeg[EncoderMAX][2] = {0}; |
| yoshikawaryota | 2:ec149525ec2a | 309 | |
| yoshikawaryota | 2:ec149525ec2a | 310 | for(int i=0; i<EncoderMAX; i++) |
| yoshikawaryota | 2:ec149525ec2a | 311 | switch(cnt) { |
| yoshikawaryota | 2:ec149525ec2a | 312 | /* 最初の処理 */ |
| yoshikawaryota | 2:ec149525ec2a | 313 | case 0: |
| yoshikawaryota | 2:ec149525ec2a | 314 | data[i] = 0; |
| yoshikawaryota | 2:ec149525ec2a | 315 | CS[i] = 0; |
| yoshikawaryota | 2:ec149525ec2a | 316 | CL[i] = 1; |
| yoshikawaryota | 2:ec149525ec2a | 317 | break; |
| yoshikawaryota | 2:ec149525ec2a | 318 | /* 最後の処理 */ |
| yoshikawaryota | 2:ec149525ec2a | 319 | case 25: |
| yoshikawaryota | 2:ec149525ec2a | 320 | CS[i]=1; |
| yoshikawaryota | 2:ec149525ec2a | 321 | /* 前回の値更新 今回の値更新(エンコーダの値(0~4096)を角度(0~360)に) */ |
| yoshikawaryota | 2:ec149525ec2a | 322 | EncDeg[i][1] = EncDeg[i][0]; |
| yoshikawaryota | 2:ec149525ec2a | 323 | EncDeg[i][0] = (double)data[i] * 360.0 / 4096; |
| yoshikawaryota | 2:ec149525ec2a | 324 | /* 359→0を跨いだ時,前回の値を0から逆回転で負の値で表記 */ |
| yoshikawaryota | 2:ec149525ec2a | 325 | if ((270 <= EncDeg[i][1]) && (EncDeg[i][0] < 90)) |
| yoshikawaryota | 2:ec149525ec2a | 326 | EncDeg[i][1] -= 360; |
| yoshikawaryota | 2:ec149525ec2a | 327 | /* 0→359を跨いだ時,前回の値を360以上の値で表記 */ |
| yoshikawaryota | 2:ec149525ec2a | 328 | else if ((EncDeg[i][1] < 90) && (270 <= EncDeg[i][0])) |
| yoshikawaryota | 2:ec149525ec2a | 329 | EncDeg[i][1] += 360; |
| yoshikawaryota | 2:ec149525ec2a | 330 | /* 差を求める*/ |
| yoshikawaryota | 2:ec149525ec2a | 331 | EncoderDeg[i] += EncDeg[i][0] - EncDeg[i][1]; |
| yoshikawaryota | 2:ec149525ec2a | 332 | break; |
| yoshikawaryota | 2:ec149525ec2a | 333 | /* 通常の処理 */ |
| yoshikawaryota | 2:ec149525ec2a | 334 | default: |
| yoshikawaryota | 2:ec149525ec2a | 335 | CL[i]=!CL[i]; |
| yoshikawaryota | 2:ec149525ec2a | 336 | /* 最初でも最後でもなく奇数回で最初以外の時読み取り処理 */ |
| yoshikawaryota | 2:ec149525ec2a | 337 | if(cnt != 1 && cnt % 2) { |
| yoshikawaryota | 2:ec149525ec2a | 338 | data[i] |= (DO[i]==1); |
| yoshikawaryota | 2:ec149525ec2a | 339 | data[i] = data[i] << 1; |
| yoshikawaryota | 2:ec149525ec2a | 340 | } |
| yoshikawaryota | 2:ec149525ec2a | 341 | break; |
| yoshikawaryota | 2:ec149525ec2a | 342 | } |
| yoshikawaryota | 2:ec149525ec2a | 343 | cnt++; |
| yoshikawaryota | 2:ec149525ec2a | 344 | cnt%=26; |
| yoshikawaryota | 2:ec149525ec2a | 345 | } |
| yoshikawaryota | 2:ec149525ec2a | 346 | |
| yoshikawaryota | 2:ec149525ec2a | 347 | |
| yoshikawaryota | 2:ec149525ec2a | 348 | |
| yoshikawaryota | 2:ec149525ec2a | 349 | |
| yoshikawaryota | 7:93ab5505ac1b | 350 | |
| yoshikawaryota | 7:93ab5505ac1b | 351 | /******************************************************************************* |
| yoshikawaryota | 7:93ab5505ac1b | 352 | * @概要 オムニの値計算する(加算式) |
| yoshikawaryota | 7:93ab5505ac1b | 353 | * @引数 X,Y,Rotationそれぞれの操作量 |
| yoshikawaryota | 7:93ab5505ac1b | 354 | * @返り値 なし |
| yoshikawaryota | 7:93ab5505ac1b | 355 | *******************************************************************************/ |
| yoshikawaryota | 7:93ab5505ac1b | 356 | void SubOmuni(int X,int Y,int R) |
| yoshikawaryota | 7:93ab5505ac1b | 357 | { |
| yoshikawaryota | 7:93ab5505ac1b | 358 | /* 入力を100%に制限 */ |
| yoshikawaryota | 7:93ab5505ac1b | 359 | X=Rest(X,100); |
| yoshikawaryota | 7:93ab5505ac1b | 360 | Y=Rest(Y,100); |
| yoshikawaryota | 7:93ab5505ac1b | 361 | R=Rest(R,100); |
| yoshikawaryota | 7:93ab5505ac1b | 362 | |
| yoshikawaryota | 9:8c550d496736 | 363 | |
| yoshikawaryota | 9:8c550d496736 | 364 | |
| yoshikawaryota | 9:8c550d496736 | 365 | |
| yoshikawaryota | 7:93ab5505ac1b | 366 | /* オムニ計算結果をtmpに */ |
| yoshikawaryota | 7:93ab5505ac1b | 367 | int tmp[4]= {0}; |
| yoshikawaryota | 9:8c550d496736 | 368 | |
| yoshikawaryota | 9:8c550d496736 | 369 | /* 一度データをtmpに保存 */ |
| yoshikawaryota | 9:8c550d496736 | 370 | for(int i=0; i<4; i++) |
| yoshikawaryota | 9:8c550d496736 | 371 | tmp[i]=MovMotor[i]; |
| yoshikawaryota | 9:8c550d496736 | 372 | |
| yoshikawaryota | 9:8c550d496736 | 373 | /* オムニ計算 */ |
| yoshikawaryota | 7:93ab5505ac1b | 374 | omuni.XmarkOmni_Move(X,Y,R); |
| yoshikawaryota | 7:93ab5505ac1b | 375 | |
| yoshikawaryota | 7:93ab5505ac1b | 376 | /* 計算結果を加算する */ |
| yoshikawaryota | 9:8c550d496736 | 377 | for(int i=0; i<4; i++) |
| yoshikawaryota | 9:8c550d496736 | 378 | MovMotor[i]+=tmp[i]; |
| yoshikawaryota | 7:93ab5505ac1b | 379 | } |
| yoshikawaryota | 7:93ab5505ac1b | 380 | |
| yoshikawaryota | 7:93ab5505ac1b | 381 | |
| yoshikawaryota | 7:93ab5505ac1b | 382 | |
| yoshikawaryota | 7:93ab5505ac1b | 383 | |
| yoshikawaryota | 7:93ab5505ac1b | 384 | |
| yoshikawaryota | 2:ec149525ec2a | 385 | /******************************************************************************* |
| yoshikawaryota | 9:8c550d496736 | 386 | * @概要 台形制御 |
| yoshikawaryota | 10:e19d1d12f0ed | 387 | * @引数 tar_x :目標のx座標 |
| yoshikawaryota | 10:e19d1d12f0ed | 388 | * @引数 tar_y :目標のy座標 |
| yoshikawaryota | 10:e19d1d12f0ed | 389 | * @引数 tar_theta:目標角 |
| yoshikawaryota | 12:1daa4d490a12 | 390 | * @引数 error :次ステップに進む基準とする距離 |
| yoshikawaryota | 9:8c550d496736 | 391 | * @返り値 0(継続) 1(移動完了) |
| yoshikawaryota | 2:ec149525ec2a | 392 | *******************************************************************************/ |
| yoshikawaryota | 9:8c550d496736 | 393 | int omuni_control(int tar_x, int tar_y, int tar_theta, int error) |
| yoshikawaryota | 2:ec149525ec2a | 394 | { |
| yoshikawaryota | 6:201e3de9777d | 395 | static int log_distance = 0; |
| yoshikawaryota | 9:8c550d496736 | 396 | static int be_tar_x = 0, be_tar_y = 0; |
| yoshikawaryota | 9:8c550d496736 | 397 | static int a = 0, b = 0; |
| yoshikawaryota | 6:201e3de9777d | 398 | static double log_theta = 0; |
| yoshikawaryota | 6:201e3de9777d | 399 | static bool dis_flag = 0; |
| TakushimaYukimasa | 0:9e851dc42cde | 400 | |
| yoshikawaryota | 4:05a6bda2e11f | 401 | if(dis_flag==0) { |
| yoshikawaryota | 7:93ab5505ac1b | 402 | /* タイマー初期化 */ |
| yoshikawaryota | 7:93ab5505ac1b | 403 | Acc_time.reset(); |
| yoshikawaryota | 7:93ab5505ac1b | 404 | P_fin.reset(); |
| yoshikawaryota | 7:93ab5505ac1b | 405 | /* タイマー始動 */ |
| yoshikawaryota | 7:93ab5505ac1b | 406 | Acc_time.start(); |
| yoshikawaryota | 7:93ab5505ac1b | 407 | P_fin.start(); |
| yoshikawaryota | 6:201e3de9777d | 408 | /* 現在角度を記録しておく */ |
| yoshikawaryota | 6:201e3de9777d | 409 | log_theta = NowLoc.theta; |
| yoshikawaryota | 4:05a6bda2e11f | 410 | /* 現在座標と目標座標との距離を記録しておく */ |
| yoshikawaryota | 4:05a6bda2e11f | 411 | log_distance = (int)sqrt(pow((double)tar_x - NowLoc.X, 2.0) + pow((double)tar_y - NowLoc.Y, 2.0)); |
| yoshikawaryota | 9:8c550d496736 | 412 | /* 目標地点間を結ぶ直線の傾きと切片を求める */ |
| yoshikawaryota | 10:e19d1d12f0ed | 413 | if(tar_x != be_tar_x) a = (tar_y - be_tar_y) / (tar_x - be_tar_x); |
| yoshikawaryota | 9:8c550d496736 | 414 | b = tar_y - a * tar_x; |
| yoshikawaryota | 4:05a6bda2e11f | 415 | /* フラグ回収 */ |
| yoshikawaryota | 4:05a6bda2e11f | 416 | dis_flag=1; |
| yoshikawaryota | 4:05a6bda2e11f | 417 | } |
| yoshikawaryota | 2:ec149525ec2a | 418 | |
| yoshikawaryota | 12:1daa4d490a12 | 419 | int x_val = 0, /*x_acc_val = 0,*/ x_dec_val = 0, Px = 0; |
| yoshikawaryota | 12:1daa4d490a12 | 420 | int y_val = 0, /*y_acc_val = 0,*/ y_dec_val = 0, Py = 0; |
| yoshikawaryota | 4:05a6bda2e11f | 421 | int t_val = 0; |
| yoshikawaryota | 10:e19d1d12f0ed | 422 | int P_dis = 0, r = 0; |
| yoshikawaryota | 10:e19d1d12f0ed | 423 | int Max[2] = {0}, Min[2] = {0}, x = 0, y = 0; |
| yoshikawaryota | 4:05a6bda2e11f | 424 | |
| yoshikawaryota | 4:05a6bda2e11f | 425 | double theta_tar = 0.0; |
| yoshikawaryota | 9:8c550d496736 | 426 | |
| yoshikawaryota | 10:e19d1d12f0ed | 427 | /* x,yの値域を代入(0=x,1=y) */ |
| yoshikawaryota | 9:8c550d496736 | 428 | if(NowLoc.X <= tar_x) { |
| yoshikawaryota | 10:e19d1d12f0ed | 429 | Max[0] = tar_x; |
| yoshikawaryota | 10:e19d1d12f0ed | 430 | Min[0] = NowLoc.X; |
| yoshikawaryota | 9:8c550d496736 | 431 | } else { |
| yoshikawaryota | 10:e19d1d12f0ed | 432 | Max[0] = NowLoc.X; |
| yoshikawaryota | 10:e19d1d12f0ed | 433 | Min[0] = tar_x; |
| yoshikawaryota | 10:e19d1d12f0ed | 434 | } |
| yoshikawaryota | 10:e19d1d12f0ed | 435 | if(NowLoc.Y <= tar_y) { |
| yoshikawaryota | 10:e19d1d12f0ed | 436 | Max[1] = tar_y; |
| yoshikawaryota | 10:e19d1d12f0ed | 437 | Min[1] = NowLoc.Y; |
| yoshikawaryota | 10:e19d1d12f0ed | 438 | } else { |
| yoshikawaryota | 10:e19d1d12f0ed | 439 | Max[1] = NowLoc.Y; |
| yoshikawaryota | 10:e19d1d12f0ed | 440 | Min[1] = tar_y; |
| yoshikawaryota | 9:8c550d496736 | 441 | } |
| yoshikawaryota | 9:8c550d496736 | 442 | /* 目標にする点Pの決定 */ |
| yoshikawaryota | 10:e19d1d12f0ed | 443 | if(Max[0] != Min[0]) { |
| yoshikawaryota | 10:e19d1d12f0ed | 444 | r = sqrt(pow(NowAcc.X,2)+pow(NowAcc.Y,2)) * 1.5; |
| yoshikawaryota | 10:e19d1d12f0ed | 445 | /* 半径の最大を設定 */ |
| yoshikawaryota | 10:e19d1d12f0ed | 446 | r = Rest(r, 100); |
| yoshikawaryota | 10:e19d1d12f0ed | 447 | for(x=Min[0]; x<=Max[0]; x++) { |
| yoshikawaryota | 10:e19d1d12f0ed | 448 | y = a * x + b; |
| yoshikawaryota | 10:e19d1d12f0ed | 449 | P_dis = sqrt(pow(x-NowLoc.X,2)+pow(y-NowLoc.Y,2)); |
| yoshikawaryota | 10:e19d1d12f0ed | 450 | if(P_dis == r && ABS(tar_x - x) < ABS(tar_x - NowLoc.X) || P_dis == r && ABS(tar_y - y) < ABS(tar_y - NowLoc.Y)) { |
| yoshikawaryota | 10:e19d1d12f0ed | 451 | Px = x; |
| yoshikawaryota | 10:e19d1d12f0ed | 452 | Py = y; |
| yoshikawaryota | 10:e19d1d12f0ed | 453 | break; |
| yoshikawaryota | 10:e19d1d12f0ed | 454 | } |
| yoshikawaryota | 10:e19d1d12f0ed | 455 | if(x == Max[0]) { |
| yoshikawaryota | 10:e19d1d12f0ed | 456 | Px = tar_x; |
| yoshikawaryota | 10:e19d1d12f0ed | 457 | Py = tar_y; |
| yoshikawaryota | 10:e19d1d12f0ed | 458 | } |
| yoshikawaryota | 9:8c550d496736 | 459 | } |
| yoshikawaryota | 10:e19d1d12f0ed | 460 | } |
| yoshikawaryota | 12:1daa4d490a12 | 461 | /* x=定数の式(縦の直線)になった時 */ |
| yoshikawaryota | 10:e19d1d12f0ed | 462 | else { |
| yoshikawaryota | 10:e19d1d12f0ed | 463 | r = sqrt(pow(NowAcc.X,2)+pow(NowAcc.Y,2)) * 1.5; |
| yoshikawaryota | 10:e19d1d12f0ed | 464 | /* 半径の最大を設定 */ |
| yoshikawaryota | 10:e19d1d12f0ed | 465 | r = Rest(r, 100); |
| yoshikawaryota | 10:e19d1d12f0ed | 466 | for(y=Min[1]; y<=Max[1]; y++) { |
| yoshikawaryota | 10:e19d1d12f0ed | 467 | P_dis = y; |
| yoshikawaryota | 12:1daa4d490a12 | 468 | |
| yoshikawaryota | 9:8c550d496736 | 469 | Px = tar_x; |
| yoshikawaryota | 10:e19d1d12f0ed | 470 | if(P_dis == r && ABS(tar_y - y) < ABS(tar_y - NowLoc.Y)) { |
| yoshikawaryota | 10:e19d1d12f0ed | 471 | Py = y; |
| yoshikawaryota | 10:e19d1d12f0ed | 472 | break; |
| yoshikawaryota | 10:e19d1d12f0ed | 473 | } |
| yoshikawaryota | 10:e19d1d12f0ed | 474 | if(y == Max[1]) Py = tar_y; |
| yoshikawaryota | 9:8c550d496736 | 475 | } |
| yoshikawaryota | 9:8c550d496736 | 476 | } |
| yoshikawaryota | 7:93ab5505ac1b | 477 | /* 減速処理の値代入 */ |
| yoshikawaryota | 9:8c550d496736 | 478 | x_dec_val = ABS((Px - NowLoc.X) * 0.06); |
| yoshikawaryota | 9:8c550d496736 | 479 | y_dec_val = ABS((Py - NowLoc.Y) * 0.06); |
| yoshikawaryota | 7:93ab5505ac1b | 480 | /* 加速処理の値代入 */ |
| yoshikawaryota | 12:1daa4d490a12 | 481 | /*x_acc_val=ABS((int)Acc_time.read_ms() * 0.15); |
| yoshikawaryota | 12:1daa4d490a12 | 482 | y_acc_val=ABS((int)Acc_time.read_ms() * 0.15);*/ |
| yoshikawaryota | 7:93ab5505ac1b | 483 | /* 低い方の値代入 */ |
| yoshikawaryota | 12:1daa4d490a12 | 484 | /*x_val = M_MIN(x_acc_val, x_dec_val); |
| yoshikawaryota | 12:1daa4d490a12 | 485 | y_val = M_MIN(y_acc_val, y_dec_val);*/ |
| yoshikawaryota | 12:1daa4d490a12 | 486 | x_val = x_dec_val; |
| yoshikawaryota | 12:1daa4d490a12 | 487 | y_val = y_dec_val; |
| yoshikawaryota | 9:8c550d496736 | 488 | |
| yoshikawaryota | 4:05a6bda2e11f | 489 | /* 最低を決める */ |
| yoshikawaryota | 7:93ab5505ac1b | 490 | x_val = M_MAX(x_val, 20); |
| yoshikawaryota | 7:93ab5505ac1b | 491 | y_val = M_MAX(y_val, 20); |
| yoshikawaryota | 9:8c550d496736 | 492 | |
| yoshikawaryota | 4:05a6bda2e11f | 493 | /* 100以内に収める */ |
| yoshikawaryota | 4:05a6bda2e11f | 494 | x_val = Rest(x_val, 100); |
| yoshikawaryota | 4:05a6bda2e11f | 495 | y_val = Rest(y_val, 100); |
| yoshikawaryota | 2:ec149525ec2a | 496 | |
| yoshikawaryota | 4:05a6bda2e11f | 497 | /* 正負を決める */ |
| yoshikawaryota | 9:8c550d496736 | 498 | if ((Px - NowLoc.X) < 0) |
| yoshikawaryota | 4:05a6bda2e11f | 499 | x_val *= -1; |
| yoshikawaryota | 9:8c550d496736 | 500 | if ((Py - NowLoc.Y) < 0) |
| yoshikawaryota | 4:05a6bda2e11f | 501 | y_val *= -1; |
| yoshikawaryota | 2:ec149525ec2a | 502 | |
| yoshikawaryota | 4:05a6bda2e11f | 503 | /* 残り距離計算 */ |
| yoshikawaryota | 4:05a6bda2e11f | 504 | int remain = (int)sqrt(pow((double)tar_x - NowLoc.X, 2.0) + pow((double)tar_y - NowLoc.Y, 2.0)); |
| yoshikawaryota | 4:05a6bda2e11f | 505 | /* 移動量に応じたthetaを求める */ |
| yoshikawaryota | 8:ddedee42c253 | 506 | theta_tar = (((double)log_distance - remain) / log_distance) * (tar_theta - log_theta) + log_theta; |
| yoshikawaryota | 4:05a6bda2e11f | 507 | /* 合わせるthetaと現在thetaの差分からtheta補整をかける */ |
| yoshikawaryota | 4:05a6bda2e11f | 508 | t_val = (theta_tar - NowLoc.theta) * 1.5; |
| yoshikawaryota | 3:b77f51108bf1 | 509 | |
| yoshikawaryota | 4:05a6bda2e11f | 510 | t_val = Rest(t_val, 20); |
| yoshikawaryota | 2:ec149525ec2a | 511 | |
| yoshikawaryota | 7:93ab5505ac1b | 512 | SubOmuni(x_val, y_val, t_val); |
| yoshikawaryota | 2:ec149525ec2a | 513 | |
| yoshikawaryota | 4:05a6bda2e11f | 514 | /* 終了処理 */ |
| yoshikawaryota | 9:8c550d496736 | 515 | if(error != 0 && error >= remain) { |
| yoshikawaryota | 9:8c550d496736 | 516 | be_tar_x = tar_x; |
| yoshikawaryota | 9:8c550d496736 | 517 | be_tar_y = tar_y; |
| yoshikawaryota | 9:8c550d496736 | 518 | return 1; |
| yoshikawaryota | 9:8c550d496736 | 519 | } else if ((5 > ABS(remain)) && ABS(tar_theta - NowLoc.theta) < 0.1) { |
| yoshikawaryota | 4:05a6bda2e11f | 520 | x_val = 0; |
| yoshikawaryota | 4:05a6bda2e11f | 521 | y_val = 0; |
| yoshikawaryota | 4:05a6bda2e11f | 522 | } |
| yoshikawaryota | 4:05a6bda2e11f | 523 | if (x_val == 0 && y_val == 0) |
| yoshikawaryota | 4:05a6bda2e11f | 524 | P_fin.start(); |
| yoshikawaryota | 4:05a6bda2e11f | 525 | else |
| yoshikawaryota | 4:05a6bda2e11f | 526 | P_fin.reset(); |
| yoshikawaryota | 2:ec149525ec2a | 527 | |
| yoshikawaryota | 4:05a6bda2e11f | 528 | if (P_fin.read_ms() > 100) { |
| yoshikawaryota | 4:05a6bda2e11f | 529 | /* タイマー停止 */ |
| yoshikawaryota | 4:05a6bda2e11f | 530 | P_fin.stop(); |
| yoshikawaryota | 4:05a6bda2e11f | 531 | /* フラグを建て直す */ |
| yoshikawaryota | 4:05a6bda2e11f | 532 | dis_flag=0; |
| yoshikawaryota | 9:8c550d496736 | 533 | |
| yoshikawaryota | 8:ddedee42c253 | 534 | return 1; |
| yoshikawaryota | 2:ec149525ec2a | 535 | } |
| yoshikawaryota | 8:ddedee42c253 | 536 | return 0; |
| TakushimaYukimasa | 0:9e851dc42cde | 537 | } |