機器人武術擂臺---無差別組(五)推棋子演算法
機器人武術擂臺---無差別組(五)推棋子演算法
做一份筆記,大佬勿噴。
作者: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;//跳出
}
注:以上所有配置不一定通用,請各位讀者按照自己板子的型號和原理圖進行調整。
相關文章
- 巨集杉科技擺“擂臺”,遍尋天下儲存技術高手
- 深入淺出解讀 Java 虛擬機器的差別測試技術Java虛擬機
- Keep終於登上了IPO擂臺
- AI 殺人武器來臨,谷歌技術幫助美軍無人機識別更精準AI谷歌無人機
- 學術乾貨|深入淺出解讀 Java 虛擬機器的差別測試技術Java虛擬機
- 安卓模擬器與真機有什麼差別?安卓
- 棋子移動
- jvm虛擬機器的五個組成部分解析JVM虛擬機
- 6. 檢測兩臺機器上檔案的差異
- 機器碼和位元組碼分別介紹機器碼
- 我的眼裡無軟體差別(轉)
- 組裝一臺私人云儲存主機配置推薦 家庭NAS雲端儲存伺服器搭建伺服器
- Java 虛擬機器之五:Java位元組碼檔案結構Java虛擬機
- 無程式碼平臺之間的區別,和你想象中的無程式碼開發有沒差異?
- SQL小小擂臺------請用一個sql更新主鍵列SQL
- 班級擂臺(光榮)榜 - 極簡教育小工具
- TTS 擂臺: 文字轉語音模型的自由搏擊場TTS模型
- 特別報導:機器人推動製造業革命機器人
- 支援向量機(五)SMO演算法演算法
- 菜譜-擂椒皮蛋
- 智慧閘道器和交換機在智慧路燈杆上的用途差別
- 無線路由器訊號差怎麼辦?路由器
- 推薦五款實用的良心軟體,無廣告無彈窗
- 如何利用AI技術推進班組建設?AI
- 從MIT的新式無人船,聊聊機器人的“組隊打野”模式MIT機器人模式
- 高階實用又安全 各類識別技術手機推薦
- elasticsearch 5.1 別的機器無法訪問9200埠Elasticsearch
- 裝機必備的五款軟體推薦
- 《卸甲筆記》-PostgreSQL和Oracle的SQL差異分析之五:函式的差異(五)筆記SQLOracle函式
- Nielsen:智慧手機在印度,典型的性別差異
- 順序控制和狀態機之間的差別
- 【智慧駕駛】無人駕駛推進時間表及五大技術領域關鍵節點
- 倡導“遊戲無差別人臉識別”?請先回答這3個問題遊戲
- YouTube推薦演算法獲技術艾美獎演算法
- 分解機(Factorization Machines)推薦演算法原理Mac演算法
- [vnc] 一臺顯示器控制多臺機器VNC
- 機器視覺之人臉識別的流程及主要技術視覺
- 五款好用國產手機推薦! 可以跟iPhone媲美!iPhone