機器人武術擂臺---無差別組(五)推棋子演算法
機器人武術擂臺---無差別組(五)推棋子演算法
做一份筆記,大佬勿噴。
作者:sumjess
注意:本部落格是以《2018年華北五省(市、自治區)大學生機器人大賽競賽規則》為基礎而寫的
@@@@@@@@@一共寫2個版本的推棋子演算法-----STM32、K60@@@@@@@@
特別提醒:K60是基於山外庫書寫!
一、總述:
推棋子有一個筆者想嘗試的辦法,就是使用陀螺儀,這樣可以讓車在場地內做到定位功能,可以讓車走遍及整場。但是由於時間問題,暫時還是使用最普遍的16個光電開關的方案。
無論是推棋子還是互推,前提都是不掉下擂臺,所以在所有的光電開關中,起到防掉落功能的光電開關的優先順序應該為最高,所以,可能會有人想用中斷來防掉落,小編認為此舉是沒有必要的,因為在主函式中,虛擬碼就是:光電開關檢測-->電機執行,所以小編認為用不用中斷都一樣,其他的光電開關就是檢測棋子的作用啦。
所以整體演算法部分程式碼就是:
(if) 如果檢測到有掉落危險,那麼執行指令脫離危險。
(else if) 否則檢測哪個方向有棋子,哪側有棋子向哪個方向開去。
(else) 否則慢速直行
所以不難發現,演算法都是巢狀,用的都是if,當然在這裡也可以用狀態機。所以小編STM32的程式用的是if巢狀,K60用的是狀態機。
二、演算法部分:
@@@@@@@@@STM32的推棋子演算法@@@@@@@@
#define delays 380
void algor_SUM_UP(void)
{
if(up_for_lift==0&&up_for_right==0&&up_back_left==0&&up_back_right==0)//沒有掉落危險
{
/////////////////////////////////////後側檢測
if(back_1==0||back_2==0)//後側
{
delay_us(200);//去抖
if(back_1==0||back_2==0)//確定後側
{
drive_Back_H();//高速倒車
}
}
else
{
;
}
/////////////////////////////////////前面檢測
if(for_1==0||for_2==0||for_3==0)//前面
{
delay_us(200);
if(for_1==0||for_2==0||for_3==0)//確定前面
{
drive_For_H();//高速直行
}
}
else
{
;
}
/////////////////////////////////////後側檢測--如果沒有,那麼直行
if(back_1==0||back_2==0)//後側
{
delay_us(200);
if(back_1==0||back_2==0)//確定後側
{
drive_Back_H();//高速後退
}
}
else
{
drive_For_L();//低速直行
}
/////////////////////////////////////前面檢測--如果確實有,那麼高速直行;如果沒有,看最下面的else2;如果一瞬間有,看下看面的else1;
if(for_1==0||for_2==0||for_3==0)//前面
{
delay_us(200);
if(for_1==0||for_2==0||for_3==0)//確定前面
{
drive_For_H();//高速直行
}
else//else1,檢測左邊,如果有左轉;如果一瞬間有,看下面的else3;
{
if(left_1==0||left_2==0||for_lift==0||back_lift==0)//左側
{
delay_us(200);
if(left_1==0||left_2==0||for_lift==0||back_lift==0)//確定左側
{
drive_Left_S();//超級左轉
delay_ms(delays);
}
}
else//else3,如果有右轉;如果一瞬間有低速直行;
{
if(right_1==0||right_2==0||for_right==0||back_right==0)//右側
{
delay_us(200);
if(right_1==0||right_2==0||for_right==0||back_right==0)//確定右側
{
drive_Right_S();//超級右轉
delay_ms(delays);
}
else
{
drive_For_L();//低速直行
}
}
}
}
}
else//檢測左側,如果有左轉;如果一瞬間有,檢測右側;如果右側確實有,右轉;如果右側一瞬間有,那麼低速直行;
{
if(left_1==0||left_2==0||for_lift==0||back_lift==0)//左側
{
delay_us(200);
if(left_1==0||left_2==0||for_lift==0||back_lift==0)//確定左側
{
drive_Left_S();//左轉
delay_ms(delays);
}
}
else
{
if(right_1==0||right_2==0||for_right==0||back_right==0)//右側
{
delay_us(200);
if(right_1==0||right_2==0||for_right==0||back_right==0)//確定右側
{
drive_Right_S();//右轉
delay_ms(delays);
}
else
{
drive_For_L();//低速直行
}
}
}
}
}
else
{
if(up_for_lift==1||up_for_right==1)//前方有掉落危險
{
delay_us(200);
if(up_for_lift==1||up_for_right==1)//確定有掉落危險
{
drive_Stop();//停下驅動
drive_Back_H();//高速倒車
delay_ms(700);//300ms
drive_Right();//右轉(可以設定向左向右演算法)
delay_ms(500);//250ms
}
}
if(up_back_left==1||up_back_right==1)//後方有掉落危險
{
delay_us(200);
if(up_back_left==1||up_back_right==1)//確定有掉落危險
{
drive_Stop();//停下驅動J
drive_For_M();//快速直行
delay_ms(700);//300msJ
drive_Right();//右轉(可以設定向左向右演算法)J
delay_ms(500);//250msJ
}
}
}
}
@@@@@@@@@K60的推棋子演算法@@@@@@@@@@
1、掃描函式:
uint8 opt_qua_Scan(void)//排位模式掃描程式
{
int sensorState;
if( left_forward_edge == 1 ) { sensorState = 1; }//左前邊緣
else if ( right_forward_edge == 1 ) { sensorState = 2; }//右前邊緣
else if ( left_back_edge == 1 ) { sensorState = 3; }//左後邊緣
else if ( right_back_edge == 1 ) { sensorState = 4; }//右後邊緣
else if ( left_forward == 0 ) { sensorState = 5; }//左後
else if ( forward_middle_left == 0 ) { sensorState = 6; }//前中左
else if ( forward_middle_right == 0 ) { sensorState = 7; }//前中右
else if ( right_forward == 0 ) { sensorState = 8; }//右前
else if ( left_1 == 0 ) { sensorState = 9; }//左一
else if ( right_1 == 0 ) { sensorState = 10; }//右一
else if ( left_2 == 0 ) { sensorState = 11; }//左二
else if ( right_2 == 0 ) { sensorState = 12; }//右二
else if ( left_back == 0 ) { sensorState = 13; }//左後
else if ( back_middle_left == 0 ) { sensorState = 14; }//後中左
else if ( back_middle_right == 0 ) { sensorState = 15; }//後中右
else if ( right_back == 0 ) { sensorState = 16; }//右後
else { sensorState = 17; }//巡邏模式
return sensorState;
}
2、執行函式:
t=opt_qua_Scan(); //得到鍵值
switch(t)
{
case 1:
{
//右後
sumjess_back_right_fastest();
break;
}
case 2:
{
//左後
sumjess_back_left_fastest();
break;
}
case 3:
{
//右前
sumjess_forward_right_fastest();
break;
}
case 4:
{
//右前
sumjess_forward_right_fastest();
break;
}
case 5:
{
//左後
sumjess_back_left_faster();
break;
}
case 6:
{
//前左
sumjess_forward_left_fast();
break;
}
case 7:
{
//前右
sumjess_forward_right_faster();
break;
}
case 8:
{
//前右
sumjess_forward_right_fastest();
break;
}
case 9:
{
//前左
sumjess_back_left_fastest();
break;
}
case 10:
{
//右後
sumjess_back_right_fastest();
break;
}
case 11:
{
//前左
sumjess_back_left_fastest();
break;
}
case 12:
{
//前右
sumjess_forward_right_fastest();
break;
}
case 13:
{
//左後
sumjess_back_left_faster();
break;
}
case 14:
{
//左後
sumjess_back_left_faster();
break;
}
case 15:
{
//右後
sumjess_back_right_fastest();
break;
}
case 16:
{
//右後
sumjess_back_right_faster();
break;
}
case 17:
{
//中速前進
sumjess_forward_faster();
break;
}
default:
break;//跳出
}
注:以上所有配置不一定通用,請各位讀者按照自己板子的型號和原理圖進行調整。
相關文章
- AI 殺人武器來臨,谷歌技術幫助美軍無人機識別更精準AI谷歌無人機
- 巨集杉科技擺“擂臺”,遍尋天下儲存技術高手
- 深入淺出解讀 Java 虛擬機器的差別測試技術Java虛擬機
- Keep終於登上了IPO擂臺
- 學術乾貨|深入淺出解讀 Java 虛擬機器的差別測試技術Java虛擬機
- 安卓模擬器與真機有什麼差別?安卓
- 棋子移動
- 機器學習Sklearn系列:(五)聚類演算法機器學習聚類演算法
- 6. 檢測兩臺機器上檔案的差異
- 題解-翻棋子
- 機器學習分享——反向傳播演算法推導機器學習反向傳播演算法
- 機器碼和位元組碼分別介紹機器碼
- 無程式碼平臺之間的區別,和你想象中的無程式碼開發有沒差異?
- 班級擂臺(光榮)榜 - 極簡教育小工具
- TTS 擂臺: 文字轉語音模型的自由搏擊場TTS模型
- P11234 [CSP-S 2024] 擂臺遊戲 題解遊戲
- 機器學習——提升方法AdaBoost演算法,推導過程機器學習演算法
- 【機器學習】深度解析機器學習五大流派中主演算法精髓機器學習演算法
- 特別報導:機器人推動製造業革命機器人
- 菜譜-擂椒皮蛋
- 組裝一臺私人云儲存主機配置推薦 家庭NAS雲端儲存伺服器搭建伺服器
- 流批一體機器學習演算法平臺機器學習演算法
- Java 虛擬機器之五:Java位元組碼檔案結構Java虛擬機
- 機器學習中演算法與模型的區別機器學習演算法模型
- 機器學習反向傳播演算法的數學推導機器學習反向傳播演算法
- 百度年內推出無差別速率產品YE
- 智慧閘道器和交換機在智慧路燈杆上的用途差別
- 推薦五款實用的良心軟體,無廣告無彈窗
- 機器學習平臺mahout,推薦系統演算法與架構剖析視訊教程網盤下載機器學習演算法架構
- PostgreSQL 技術內幕(五)Greenplum-Interconnect模組SQL
- 順序控制和狀態機之間的差別
- 如何利用AI技術推進班組建設?AI
- 倡導“遊戲無差別人臉識別”?請先回答這3個問題遊戲
- 2700元組裝一臺R5-2400G最強APU主機配置推薦
- 從MIT的新式無人船,聊聊機器人的“組隊打野”模式MIT機器人模式
- 裝機必備的五款軟體推薦
- 得物技術基於自注意機制的影像識別演算法演算法
- 機器視覺之人臉識別的流程及主要技術視覺