# **FIRA 2024 HuroCup 超級攻略** 動作排班:江舉重、睿投籃、紀章折返跑 | | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | -------- | --- | --- | --- | --- | --- | --- | --- | | 早上9~12 | | 江 | 江 | 紀 | 江 | 江 | | | 下午2~5 | 紀 | 睿 | 紀 | 紀 | 睿 | 睿 | 睿 | | 晚上7~9 | 睿 | | 紀 | | | 紀 | 紀 | ### 工人智慧 Arduino nano ![image](https://hackmd.io/_uploads/HJa74iqxA.png =30%x) * 輸出腳位 -> Buttom D4 -> Buttom 1 D5 -> Buttom 2 D6 -> Buttom 3 D7 -> Buttom 4 D8 -> Buttom 5 D9 -> Buttom 6 * 輸入腳位 > ### 新手教學 ::: spoiler 流程 接電開機 > Google遠端連小電腦 > 按Dip000010 button2接收電腦命令 > 遠端執行比賽策略 ::: ::: spoiler 機器人供電 STM+小電腦: 12V (3pin電池) 右腿、左腿、上半身: 4pin電池 ![IMG_1112](https://hackmd.io/_uploads/S1-zuu50p.jpg) ![IMG_1058](https://hackmd.io/_uploads/Skx-Yq8R6.jpg) ::: ::: spoiler 機器人按鈕整理 * 1是開 0是關 * Dip的1,2,3,4,5,6依序是二進位的32,16,8,4,2,1,所以有0~63可以切換。 * 因為供電是STM給小電腦,直接關STM電腦會斷電。所以關機時電腦要比STM先關。 * 機器人暴走時要直接關馬達電源,關STM只會取消當前控制的動作,並不會Torque Off。 ![IMG_1055](https://hackmd.io/_uploads/r185PW_Ap.jpg) ::: ::: spoiler 機器人開機後 遠端連線小電腦 在自己的電腦安裝 Google遠端 ![image](https://hackmd.io/_uploads/HyOviGKC6.png) 自己的電腦登入aiRobots的gmail > [name=帳號: airobotslab@gmail.com][name=密碼: ic2sic2sic2s] 選取David (如果David有正常開機且連到一樣的網路就會顯示線上。) PIN碼為:123456 成功連線就可以取用小電腦的畫面了 ::: :::spoiler 遠端執行比賽策略 遠端成功後開起桌面 FIRA_Computer_VS2010 裡的 Fira2018.sln 專案檔 ![image](https://hackmd.io/_uploads/rks24_I0T.png) 按偵錯來執行專案檔 (當前在哪個程式無所謂,偵錯是針對Fira2018.sln這個專案) ![IMG_1061](https://hackmd.io/_uploads/B1nC5c806.jpg) 沒意外就會進來這個比賽用的主要畫面 ![螢幕擷取畫面 2024-03-19 024434](https://hackmd.io/_uploads/rkL42OL0a.jpg) ![](https://i.imgur.com/Ebteg1N.png) (1) 按下 **Cam** 打開視覺。 (2) 按下 **Set Cam** 開啟攝影機調整畫面 (3) 按進階設定,將白平衡的自動方框勾選後再取消勾選,按儲存 Run Stratagy 前要記得 **先調dip000010按button2** (前人的預設),目的是要開啟 **接收電腦指令(ReceiceFromComp=True)**,否則機器人不會聽話。 > ![image](https://hackmd.io/_uploads/HJslvYUAp.png) > button2其他dip有些會對應到其他動作,如果是要執行比賽策略的話記得切換成不是這些dip的狀態再按下button2(其實也不一定要000010) 選擇比賽項目,就可以Run Stratagy了 ![IMG_1062](https://hackmd.io/_uploads/SktWp58A6.jpg) ::: ### 舉重 :::spoiler 舉重策略內容 詳細策略流程如下 ![image](https://hackmd.io/_uploads/r1oewuI0p.png) 設定舉重前的步數 ![image](https://hackmd.io/_uploads/Sk420_LRT.png) ![image](https://hackmd.io/_uploads/SkbmdmFAT.png) ![image](https://hackmd.io/_uploads/S1Eh27FA6.png) ![image](https://hackmd.io/_uploads/SJORh7tCa.png) 2022版本 motor34 lean angle角度大馬達數字調大 / motor44 lean angle角度大馬達數字調小 step40 雙手舉起來 step55 剛蹲下來 step118 撿起棍子 step146 棍子靠在大腿 step159 檢棍後仰完wait step169 往前傾 > 169~179晃太快會前倒 step179 前傾wait steo184 準備要站 step196 站起來 舉高後走路動作 ![image](https://hackmd.io/_uploads/BJJIzDMyC.png) ![image](https://hackmd.io/_uploads/Sk2ufDfkR.png) ![image](https://hackmd.io/_uploads/B1wnGPG1C.png) ![image](https://hackmd.io/_uploads/rkJP_0lxR.png) ::: ### 籃球 ::: spoiler 籃球策略 先檢查基本動作 - [ ] WALK_F - [x] WALK_FF - [x] WALK_B - [ ] SHIFT_L - [ ] SHIFT_LL - [ ] SHIFT_R - [ ] SHIFT_RR - [ ] TURN_L - [ ] TURN_R 在 Code4_MOTION.c 裡面可以看到 ```c #ifdef SHIFT_R case SHIFT_R: Add_motor_job( 255, 2, 0, 0, 0 ); Mtn_curveknee(); Mtn_Shift_R(); Add_motor_job( 30, 255, 7, 5, 0 ); Add_motor_job( 31, 255, 7, 59, 0 ); Add_motor_job( 32, 189, 6, 26, 0 ); Add_motor_job( 33, 160, 3, 54, 0 ); Add_motor_job( 34, 29, 9, 28, 0 ); Add_motor_job( 35, 255, 7, 72, 0 ); Add_motor_job( 40, 255, 7, 72, 0 ); Add_motor_job( 41, 255, 7, 72, 0 ); Add_motor_job( 42, 67, 9, 31, 0 ); Add_motor_job( 43, 96, 12, 64, 0 ); Add_motor_job( 44, 227, 6, 33, 0 ); Add_motor_job( 45, 255, 7, 72, 0 ); Add_motor_job( 255, 1, 0, 0, 0 ); Add_motor_job( 255, 2, 0, 0, 0 ); //Mtn_POSE_Standing_NoUpperbody(100,0,5); break; #endif ``` 這段程式碼的用意是小電腦會傳送動作指令編號給 STM32 ,所以當 STM32 接收到指令編號的時候就會根據指定編號做動作,裡面的 Mtn_curveknee() 和 Add_motor_job() 的用途就是要讓機器人做完動作之後會回到 initial 的初始動作,希望可以讓動作做起來比較一致(我覺得這邊還可以改,因為機器人踩在地上對它做 initial 其實不會真的回到初始動作)。 如果不想要開小電腦調動作就只需要在 main.c 裡面針對想要點擊的按鈕加入動作就好,下面是例子: ```c / BTN2 Trigger else if (EXTI_GetITStatus(EXTI_Line11) != RESET) { int i; EXTI_ClearITPendingBit(EXTI_Line11); LedSwitch(!GetLedStatus(2), 2); // BTN2 -> Strategy DipMode = ReadDip(); ReceiceFromComp = TRUE; #ifdef COMP USART_ITConfig(COMP_PORT, USART_IT_RXNE, ENABLE); #endif // Read_IMU = TRUE; // LedSwitch(Read_IMU, 7); printf("BTN 2 Triggered\r\n"); if(ReadDip() == 3){ Mtn_curveknee(); Mtn_Walk_FF(); Add_motor_job( 255, 5, 0, 0, 0 ); Add_motor_job( 30, 255, 7, 5, 0 ); Add_motor_job( 31, 255, 7, 59, 0 ); Add_motor_job( 32, 189, 6, 26, 0 ); Add_motor_job( 33, 160, 3, 54, 0 ); Add_motor_job( 34, 29, 9, 28, 0 ); Add_motor_job( 35, 255, 7, 72, 0 ); Add_motor_job( 40, 255, 7, 72, 0 ); Add_motor_job( 41, 255, 7, 72, 0 ); Add_motor_job( 42, 67, 9, 31, 0 ); Add_motor_job( 43, 96, 12, 64, 0 ); Add_motor_job( 44, 227, 6, 33, 0 ); Add_motor_job( 45, 255, 7, 72, 0 ); Add_motor_job( 255, 1, 0, 0, 0 ); Add_motor_job( 255, 2, 0, 0, 0 ); } ``` 這樣的話在 dip 為 3 時,按下按鈕 2 就會執行下面的動作。 所以接下來就要調整動作,上面的基本動作要用檔去調動作。 ``` "FIRA_2024_Motion\STM32_TeenSizeDJ1\ParameterizedLIPM_Dj1Fira_2018\Mtn_.._...m" ``` 調投球距離可以去人機介面改 13 號馬達的速度 方法一: 給定寫死的 dip 給定後退步數,或者是時間不夠了,就進入下一個狀態 方法二: 針對當前和籃框的距離往後退,直到距離超過 1500 ,或者是時間不夠了,就進入下一個狀態 然後再根據當前和籃框的距離給不同的動作參數,目前有調好三種投籃動作,所以只需要 distance >= 1500 -> THROW_180 -> motion 4.c 呼叫 Mtn_Throw_180 1500 > distance >= 1400 -> THROW_140 -> motion 4.c 呼叫 Mtn_Throw_140 distance < 1400 -> THROW_120 -> motion 4.c 呼叫 Mtn_Throw_120 ::: 流程: 會一直在 main.c 檔的 while 做 led 的操作,直到中斷發生。 中斷分為硬體中斷跟軟體中斷: 1. 硬體中斷(按下按鈕,讓中斷觸發高/低電位的方法): 可以當作突然發生的事件。 2. 軟體中斷(時間中斷,每當 counter 發生 overflow 會觸發): 可以當作是背景的程式每隔一段時間會被執行(會呼叫 Renewmotion()更新動作)。 在 main.c 檔中的硬體中斷又可分為要執行單一動作或者是連續動作。 1. 單一動作: 可以直接呼叫動作的 `.h` 檔進行執行,在動作的 `.h` 檔中會執行很多的 `Add_motor` 函式,將馬達的資訊輸入到 `MotorScheduleStruct.List` 的 List 中作保存,然後在`Update_MotorSchedule_to_MotorData()` 會實際把這個 List 中的 data 輸入給馬達。 2. 連續動作: 可以直接給定 Motion.Mode_RX = 動作編號(WALK_FF),進行連續動作,連續動作的編號會大於 100 ,之後就會用軟體中斷去執行連續動作。