當前位置: 華文問答 > 數位

如何制作一個機器人?

2013-09-23數位

等這個問題好久了,趕緊強答一波。

先上視訊。









https://www.zhihu.com/video/925727570417324032







這是我和大腿同學@黯倦魔女(以下簡稱腿哥)大三暑假開始制作的一個機器人,屬於Ballbot家族,其運動方式用爹媽的話來說就是獅子踩球,或者可以理解成獨輪平衡車。Ballbot的始祖是Ralph Hollis教授的CMU Ballbot, 大概長這樣(圖片來自 Ballbot - Wikipedia):

CMU Ballbot

最初的念頭源於某個下午茶後,我和腿哥說起暑假漫漫該如何是好,不如找點樂子造個機器人玩玩。想起之前在IEEE Spectrum上看到的A Robot That Balances on a Ball,呆萌又順從,大概長這樣(圖片來自 Ballbot - Wikipedia):

BallIP

便一拍大腿,決定造個這個,代號球波(Qiubot)。。。

接下來回到正題,如何制作一個機器人(球波)。

第0步:找一個金主。(壕們可忽略)

為其重要性,這一步列在最前,因為財力往往決定了制作體驗和機器人的效能。但這不一定要最先做,只是需要keep in mind,機器人是個燒錢貨,一般造價不菲且十分容易超預算。對於在讀的學生來說,最劃算的當然是學校買單,既能學到東西又無需降低生活品質,更重要的是可以不用在想法或效能上妥協,零件可挑最貴的買(逃

具體操作方式因人而異,可以參加學校的機器人比賽,社團或者加入實驗室。剛開始的時候以上幾點對我們都不適用,於是我和腿哥只能自掏腰包,各出一半。一開始我們小心翼翼,零件都挑便宜的買,多少耽誤了些進度。等到球波頗具雛形後,我們向學院申請資助,提出造好後可以在學校每年一度的開放日上展示。老師們很開心,表示可提供包養並予以鼓勵,敞開膀子幹吧少年!

這裏給個參考,這是被包養前我們在第一版球波上的花費,總計2000多人民幣,雖然不算多,但也將近一個月的夥食。。

獲得贊助後,買東西都經學校下單,我們便沒再統計花費。沒有財務之憂後我們的消費速度直線上升,後來買四個金屬萬向輪的價格就已經超過了這個數,當然我們的進度也大大加快,花錢畢竟能省時間。

算上不少花在試錯上的錢,粗略估計球波總造價在一萬人民幣左右。這筆錢對大部份學生黨來說還是值得心疼的,但對財大氣粗的某港校就不值一提了。

技能習得 :淘寶上砍價的能力和一開始就要有燒別人錢的心態

第1步:建模及制圖。(機器人構造簡單的可略過)

鑒於我和腿哥都是CS出身,沒任何機械背景,在直接上手之前我們決定還是先規劃一下。本想用經典的SolidWorks畫圖,無奈我們都是mac使用者也沒有財力支持正版,於是選擇了Autodesk的Fusion 360。後來發現其功能強大不輸Solidworks,且學生免費,支持水果,在這裏強烈安利一波。

點亮了一些基本的制圖技能後發現想象力是最大的限制因素。沒學過機械設計,就自己腦補各零件應該有的樣子。後來發現其實一開始畫錯(醜)並不是問題,重要的是之後不斷叠代不斷改進。

折騰了一個下午第一版的球波設計圖誕生了,大概長這樣(Ballbot實際上三個輪子足夠平衡,為了後面方便寫程式就用了四輪):

加材料渲染之後長這樣:

我之前在robocon隊裏呆過,跟裏面大觸們的圖比起來固然是個渣,然而它在兩個純碼農的眼裏簡直騷氣沖天。

技能習得 :CAD制圖和基本的機械設計

第2步:組裝機械部份

終於到了hardcore的部份,手指上的傷疤似乎還在隱隱作痛。

從最簡單的做起,第一步是球波的支撐板,也就是上圖圓形透明的那塊板。我們采用常見亞克力板,買回來後厚著臉皮找機械系的教授借用他們的雷射切割機。支撐板get。

第二步,支撐板和電機的連線部份。這個沒有現成的部件,我們決定使用3D打印。實驗室有台壞掉的3D印表機,一直沒人用。於是我們花了一個晚上修好了3D印表機,花了一個晚上偵錯然後再花一晚上打印。連線部件get。大概長這樣:

起初我們設計的時候只考慮其功能,結果因為3D印表機精度不錯加上這玩意設計得太尖銳,安裝的時候手指沒少被割傷,後來學乖了邊角都得加光滑過度。然後因為打印材料的熱脹冷縮及印表機的精度問題,打出來的零件尺寸跟設計圖會有誤差,一開始計算尺寸的時候就得把這個考慮進去。還有各種各樣的問題,總而言之硬體都是坑。。。

技能習得 :3D印表機的維修偵錯及花式擰螺絲

第3步:搭建電路部份

終於到了更hardcore的部份,看著照片仿佛還能聞到燒焦的味道。

在把電機安裝到支撐板上之前,需要確認電機能按預想地運轉。我們使用樹莓派(Raspberry pi)作為主控,用gpio接四個電機驅動板,每個驅動板接一個步進電機。選用步進電機是因為它扭矩比較大。電路接好後大概長這樣:

一通電,電機就歡快地轉了起來。我和腿哥正準備彈冠相慶,電機就越轉越慢最後完全停下來了,空氣中彌漫著一股塑膠燒焦的味道。

一陣緊鑼密鼓的偵錯之後發現因為電流太大,L298N電機驅動板激發了過熱保護。而且電線載流量太小,這裏一個步進電機就是1.5A,4個就是6A,而有些電路用的還是彩虹(杜邦)線。。。naive了。。。

一陣緊鑼密鼓的偵錯之後發現L298N就是個坑貨,我們決定換上一般3D印表機使用的A4988步進電機驅動板。媽媽再也不用擔心我宕機了。

換了線換了板後繼續試,電機又歡快的轉了起來。

於是我們把電機安裝到支撐板上









https://www.zhihu.com/video/925751734196924416







再加上IMU,用傳感器的姿態控制電機的轉速和方向。









https://www.zhihu.com/video/925752220161544192







看上去就只差把球波倒過來調個PID了!!

然而還是太naive。我們發現電機轉得並不順滑,時不時會跳步或者停頓。一陣緊鑼密鼓的偵錯之後發現是因為電機控制程式碼寫得不夠即時,用來控制電機的PWM頻率不夠穩定。改進了程式碼之後情況有所好轉,然而問題還是存在。又一陣緊鑼密鼓的偵錯之後發現問題的關鍵在於即時的程式碼跑在一個非即時的作業系統之下,整個系統就還是非即時的。。。於是幹脆把控制電機的程式碼放在Arduino上,樹莓派只處理IMU的數據,二者用串口通訊。雖然這樣也還是不能保證即時性,但效果比之前好多了。

技能習得 :步進電機的使用及硬體花式debug法

第4步:寫控制程式碼

這一步是我們的老本行嘿嘿。。。然而這是一個flag,回過頭來看這一步花的時間最多。

為搭建測試環境,我們拆了實驗室的一張桌子,這樣便獲得了一個完美的支架:

???????????

為了不用盲調PID,我們用rosserial接上ROS,再用rqt_plot畫出roll和pitch角度的即時曲線,大概長這樣:









https://www.zhihu.com/video/925753356033593344







PID調一調,球波居然真的搖搖晃晃站了起來!









https://www.zhihu.com/video/925754013402664960







然而堅持不了多久就會倒下去,怎麽調PID都沒有用。一陣緊鑼密鼓的偵錯之後並沒有解決辦法。

這樣過了一段有事沒事調PID的日子,快要絕望的時候,突然想起可以請教一下Masaaki Kumagai教授,就是前面提到的A Robot That Balances on a Ball的主人。於是抱著試一試的心態給教授發了信件。沒想到教授秒回,並給出了許多建設性意見。

嗯,看來這種搖搖晃晃站不穩的情形教授也遇到過,獲得不少心理安慰。接下來需要解決問題。一是教授提到的backlash,我們一陣緊鑼密鼓的偵錯之後發現萬向輪輪面與球的接觸存在不少間隙,會導致一些起伏,於是決定換上輪面更加完整的全鋁合金萬向輪,大概長這樣

球波的顏值瞬間提高了不少(800軟妹幣一個的代價。。。)。

然而,換上之後問題更嚴重了。一是輪子直徑增大導致電機提供的扭力不再夠用。二是金屬的輪子和光滑的保齡球之間摩擦太小。最終結果就是backlash更加嚴重。

解決方案有二,一是換扭力大的電機(為此重新設計了銜接部份,也更換了驅動板),二是給保齡球加一層塑膠膜(汽車輪轂噴膜)。換上之後顏(cheng)值(ben)再漲二十百分點。

為節省空間把驅動板外殼給拆了

然後是提高控制頻率。我們直接擯棄了樹莓派(不即時的都是辣雞。。)換上了Arduino Mega,用頻率穩定的interrupt機制輸出PWM控制電機。

除此之外,還為IMU設計了一個減震裝置(又是一條血路。。。)以減少雜訊,雖然後來發現不是很有必要。

升級之後長這樣,小夥簡直帥氣逼人:

這次在直接上手調PID之前我們吸取了教訓(這玩意太重,每次扶著調完整個手臂都在抖),打算先測試一下整個系統work不work。

於是我們用第一版球波剩下的零件隨手搭了一個二輪平衡車來練習調PID。。。









https://www.zhihu.com/video/925756319938539520







加個遙控









https://www.zhihu.com/video/925756591716851712







然後把電池整合到車上









https://www.zhihu.com/video/925756706204557312







加個蓋就可以賣了。。咳咳。。。扯遠了

回到球波,把所有東西都整合到一起,吹一口仙氣,就可以出爐了!









https://www.zhihu.com/video/925757031527383040







這樣,一個機器人(球波)就制作好了。

技能習得 :敢於叠代,敢於推倒重來(尤其是硬體)的大無畏精神

至於你問我這玩意花這麽多時間精力搞出來有什麽用嘛(被問一萬次了)。。。

沒事的時候可以跟小夥伴練習傳接球(波)









https://www.zhihu.com/video/925764680180461568







(感謝 @龏秂犚 同學的出鏡)

然後可以帶去參加科技展,逗逗小朋友。

最後還可以給它搭建個網站:qiubot.com 就可以昭告世人(給你捐錢)啦!

後續:拜訪祖師爺

來到CMU後有幸拜訪了Ralph Hollis教授,一償夙願。

他們實驗室還有個用電磁驅動輪子(球)的Ballbot,直接省去了電機,整個機器人就只有一個球在底下自己動,可謂腦洞不小。除此之外這位白發蒼蒼的老爺爺還有一車跟電磁有關的黑科技,鑒於他有商業合作就不放上來了。最後一臉粉絲相地和CMU Ballbot同框一張(教授太高真不是我腿短。。)

後記:制作球波前後近半年有余,從大三暑假到大四下學期。其間也忙著別的比賽,上課,畢業設計和申請學校,中途一度擱置。申請結束後總算有時間了卻這樁心事。最後的球波仍有很多可改進之處,但作為一條CS狗從硬體的坑裏拉扯出這樣一個機器人我要給自己頒發一朵小紅花。

造過球波後,越發認為自己搭建一個機器人是學習Robotics的最佳方式,從機械到電子到軟體,只有自己踏過坑才能深刻地理解。

回到本問題,題主其實不用擔心知識儲備不夠,只需要敢於跳坑,一個一個解決遇到的問題,自然而然就會積累下寶貴的實踐經驗和各種亂七八糟的知識,且這樣學到的東西才會讓你畢生難忘(像炸電池這種事我才不會說。。

完。