1. 程式人生 > >2017中國旅遊暨安防機器人大賽總結

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);
}