我也是臨危受命,在北京聯絡導師的時候,學校的老闆就催我早點回去。其實,我心知肚明,那就是乙個爛攤子,乙個有關擦窗機器人的專案。老師們做的更多的是模仿,缺少思考,更缺少工程思維。
起初拿到這個專案,我就斷言,這是乙個幾近於廢掉的專案。混亂的**,幼稚的演算法,不經考慮的硬體,甚至沒有調好的底層。
我只好給自己定乙個需求目標:
做出機械人在窗戶上的運動和路徑規劃。
第一天:
第一天先來重構程式結構,原來的程式是這樣的:
暫且不提**質量,混亂的結構,完全沒有主次:
那麼先把感測器的拿出來,再拿出控制層,哦,沒有控制層,只好重建,這個工程完全沒有閉環控制,那麼,怎麼可能走得直線嗎!怎麼可能按照一定的角度走,怎麼可能路徑規劃!
再就是執行緒管理層,暫時先用比較簡單地結構來重新寫。結果發現,原來的人寫了一堆的中斷,根本沒有系統意識,乙個隨便執行著的程式,正在等待著各種卡死。最後,通訊層,也就是上位機互動除錯,如果沒有上位機配合,怎麼調波形呢。
1.user - 排程管理,這一部分要詳細說下。原來的作者幾乎就是乙個loop()解決所有問題,控制和各種資源排程全在這乙個週期的迴圈裡面,完全沒有時序感,基本就是gg,所以我就做了這樣的簡單處理。
通過systick時鐘來確定不同週期的任務
duty_1ms:感測器處理部分,語音晶元,姿態器件,按鍵啦,氣壓計等等;
duty_10ms:控制層,控制機械人的兩個引數:basefly:油門也就是前進後退的基礎速度;angel:機械人的角度;
duty_50ms:任務排程器;
duty_100ms:上位機通訊;
這樣,整個系統就建立起基礎架構了!
mpu_lib - 姿態解算
(操蛋了,硬體設計第一大失誤,就是採用了103c8t6,一款128k的晶元,根本頂不住計算量,而且這個系列,沒有浮點數計算優化,所以只好通過配置mpu6050dmp解決問題,不過這也導致了後面的問題)
第一天,解決了姿態這一塊的問題,原來的作者就是通過簡單融合濾波,角度不穩定也不夠準。陀螺儀求角度的問題主要是存在零點漂移,加速度計的問題就是有遲滯性。因此需要做融合濾波,不詳細講這裡了。但是,這個**的資源太小,做計算加上卡爾曼根本頂不住,只好用dmp模式,但是dmp模式也存在漏洞,進而導致後面不得不推倒重來。
dmp是啥?dmp就是mpu6050內建的計算單元,使用了官方的姿態計算演算法,效果並不如人意。
以前做過dmp配置,配置完畢,讀取四元數,通過四元數計算角度:
這裡埋下了隱患。好,得到角度了。
直接上玻璃,不好調引數,那麼先在地上調。其實效果是一樣的。
第二天:
下面,就解決第二大問題,控制問題:
這就是控制層的函式,elecpid.fdb是控制器的目標角度值。yaw_control就是pid控制函式了。
這一部分就很有難度了。我個人認為,我的pid函式是最簡直漂亮的。採用了c語言 的指標函式這一技巧,非常的適合pid控制。還可以靈活切換不同的控制函式。pid控制使用了普通的線性pid控制器,控制機械人向某個方向按照一定的速度運轉,如果角度可以做到0~360°的話,就屬於全導航,但是鑑於我們姿態器件的演算法能力,我們實現了0~180°方向的導航,其實這已經滿足需求了。
pid控制見上圖,pid_reset的作用是設定引數,pid_calc則是控制輸出函式:
驅動電路如下:
基於pwm控制實現正轉和反轉的功率輸出,in2\in1接兩個pwm引腳。這裡就是佈線要求嚴格一點,pad上要多鋪過孔,大電流通過的同時,減少分布引數,較小電磁干擾,然後電容c1比較關鍵,必須使用快恢復二極體,包括做開關電源也是這裡處理不好,輸出就不好看。佈線也是乙個經驗問題。
之後,通過無線藍芽除錯具體的引數,基本做到:轉向反應快,超調小,控制平滑,就可以。
做到這種曲線,波動和偏差盡可能小。但是,系統的調節能力比較弱,慢速系統的癥結。
第三天:
我們弱化一下pid部分吧。直接將上層的任務排程層。因為實現時間太短。無法做複雜的任務排程管理。
我實現了上面兩個函式,就是乙個單執行緒排程器,將任務函式f插入*task中,然後taskrun作為定期檢查函式,定期檢查函式執行:
實現三個功能:
1.是否觸發函式(基於時間還是基於事件);
2.函式是否使能;
3.是否登出函式;
然後執行函式佇列;
所以這裡需要有乙個非常嚴格的時鐘函式,為*task做標定。
小公尺有品眾籌擦窗機器人 一手掌控 停電也不會跌落
近日,小公尺有品眾籌上架了一款擦窗機器人,原價1999元,眾籌價僅1299元。這款擦窗機器人名為 赫特智慧型變頻擦窗機器人 邊長僅23.1cm,厚7.6cm。能夠識別玻璃,一放就吸,2600pa大吸力。搭載hutthink智慧型變頻吸力演算法,根據髒汙程度調節吸力。髒玻璃表面附著大量細微硬顆程式設計...
記一次專案的死鎖分析
公司專案使用多執行緒開發,因此使用gdb exec c corefile執行core檔案後,使用bt列印堆疊資訊 看不出問題,需要進入到執行緒內部分析。1.info threads 列印執行緒資訊 可以看到有多個 lll lock wait 看到這裡,我們推測可能是鎖出現問題了。那麼繼續往,進入到執...
mvc 記一次「專案」的歷程
大二上半學期因為選修課的原因,答應幫老師完善學院的選課系統。在這之前沒有做過乙個可以成為 專案 的專案,本著挑戰自己的原則和可以不上選修課的福利,斷斷續續用了一學期的時間來完善這個選課系統。接受這個專案的時候,專案已經被乙個學姐做的差不多了,基本框架模型都有了。值得一提的是,學姐是現學現做,用的是我...