2017中國旅遊暨安防機器人大賽總結
可以說是一個遲到的總結吧。
一個多月的準備,到比賽的三天,再到後期錄製視訊,再到剛剛又重現看到PID控制演算法。決定,還是應該總結一下,是因為我的怠惰而沒有好好學習PID控制呢,還是因為我的大意沒有能在在意到跑道上的油漆改變,又或是我的某種劣性心態讓最後的選擇走向了極端……
好,以上內容都是扯淡,下面步入正題:
先直接引用一下技術報告:
“
五、程式碼程式設計部分
在程式設計方面,我們儘可能降低了程式設計的難度。對於各種感測器和電機的呼叫在之前加以封裝,直接以函式的形式呼叫。對於哪怕是非計算機專業的同學也是可以一目瞭然。但凡對C語言稍有接觸的同學,都可以將想法付諸於實踐。
我們隊伍在具體操作的過程中,採用了分段程式設計的思想。將全程分為七個部分,按照統一的標準進行編寫。比方說同樣命名方式的變數名、同樣的註釋方式。這樣一來極大的提高了我們隊伍之內的團隊協作能力和默契。與此同時,關鍵的函式呼叫則是大家在前期一起摸索所得到的,有了相同程式碼基礎,每個分段根據自己的需求進行封裝。無論是從程式碼可讀性還是效率方面都有了很大的提升。
在不過千行的程式碼之下,我們貫徹濃縮就是精華的理念,說是極簡主義也絕不過分。尤其肖同學精緻的編碼風格,執著追求的精神更是給我們這個隊伍在程式設計方面上前進的動力,引領我們這個隊伍的一步步前行。
六、亮點、創新點
1.這個機器人,經過大量的實戰檢驗並且還同其餘機器人進行過比對,不斷完善優化而成。
2.十分優秀的驅動、控制能力,各種配件的佔比恰到好處。在追求速度的同時也能保持自身的穩定和引數傳遞的精確。
3.我們不單單是為了比賽而比賽,在完成探險專案的同時。稍稍加以改裝,我們也能適應尋寶以及快遞的比賽。進德修業,與時偕行,是我們每一個人的追求。
4.在關鍵位置加以改裝,為了適應探險比賽,我們不僅加設了保護措施,並且還用多種方法進行控制和校正。例如指南針和光敏感測器同時配合,確保在比賽過程中的穩定。
”
以上內容可能也沒有什麼用,接下來:
說起來,我們的程式碼是“老炮筒,漢陽造”? 未必未必,在考慮到巡線和轉彎的速度和穩定劣勢上,經過一開始的討論。我們幾乎把所有精力都放在了路線規劃和路線的調整上。這個決策是沒有什麼問題的,然而我們缺少補救機制,缺少應對緊急情況的第二套程式碼。這一點,從總體看來是很尷尬的。
劣勢的地方:一個是別人的二值感測器,紅外距離探測器,PID,鉸鏈,前後雙感測器排,記憶功能。記得有一個學校的車,是能漂移並且準確巡線的,姑且稱其為漂移大佬吧。 相當多的有待學習的地方,能不能學會並且又擁有自己的革新的話,
還看明年吧。
記錄下一些小操作,以便於明年參考:
void run(int m, int p) //舵機控制函式
{
motor(1, m);
motor(2, p);
}
void start()
{
servo(1, 550);
// servo(3, 950);//左手放下
// servo(4, 30);//右手放下
servo(2, 150);//頭右
msleep(500);
servo(2, 900);//頭左
msleep(500);
servo(2, 150);//頭右
msleep(500);
servo(2, 900);//頭左
msleep(500);
servo(2, 500);
servo(3, 950);//左手放下
servo(4, 50);//右手放下
while (digital(1) == 0)
{
stop();
}
}
void dance(void)
{
stop();
//sleep(2);
servo(3, 150);
msleep(500);
servo(3, 950);//左手放下
msleep(500);
servo(4, 850);
msleep(500);
servo(4, 50);//右手放下
}
void line(void)
{
if (analog(4)<Gray&&analog(5)<Gray&&analog(6)<Gray&&analog(3)<Gray&&analog(2)<Gray&&analog(7)<Gray&&analog(1)<Gray&&analog(8)<Gray)
run(P, P);
if (analog(4) > Gray&&analog(5) > Gray) //直行
run(P, P);
else if (analog(4) > Gray&&analog(5) < Gray) //左偏
run(P - 5, P);
else if (analog(4) < Gray&&analog(5) > Gray) //右偏
run(P, P - 5);
else if (analog(3) > Gray&&analog(6) < Gray) //左偏
run(P / 2, P);
else if (analog(3) < Gray&&analog(6) > Gray) //右偏
run(P, P / 2);
else if (analog(2)>Gray&&analog(7)<Gray) //左偏
run(P / 2, P);
else if (analog(2)<Gray&&analog(7)>Gray) //右偏
run(P, P / 2);
else if (analog(3) > Gray&&analog(6) < Gray&&analog(4) > Gray&&analog(5) < Gray) //左偏
run(P / 2, P);
else if (analog(3) < Gray&&analog(6) > Gray&&analog(4) < Gray&&analog(5) > Gray) //右偏
run(P, P / 2);
}
void TurnLeft(int n) //左轉
{
float t, slp, mslp;
t = 5.8 * n;
slp = (int)t / 1000;
mslp = (int)t % 1000;
run(P, -P);
sleep(slp);
run(P, -P);
msleep(mslp);
}
void TurnRight(int n) //右轉
{
float t, slp, mslp;
t = 5.8 * n;
slp = (int)t / 1000;
mslp = (int)t % 1000;
run(-P, P);
sleep(slp);
run(-P, P);
msleep(mslp);
}