2023rm賽后漫談
很多想說的,說到哪算哪吧。
一、無下位機(jī)方案
有使用Jetson Xavier NX 嘗試過無下位機(jī)的控制方案。廣工廖佬在這條路上已經(jīng)走的很遠(yuǎn)了,而我在嘗試的時(shí)候遇到一些問題尚未解決或尚未找到最優(yōu)解。
本人專業(yè)是測控技術(shù)與儀器,沒有一個(gè)很系統(tǒng)的編程培訓(xùn),全靠自己摸索與學(xué)習(xí)。在使用NX時(shí),利用板載CAN控制3508、達(dá)妙4310,均是成功的。這里我就來講講我遇到的問題。在調(diào)試工程機(jī)器人的時(shí)候,單路我掛載了5個(gè)4310,控制頻率為100Hz,起初會(huì)出現(xiàn)電機(jī)死掉無反應(yīng)的情況,經(jīng)過和喵老板的討論得出的結(jié)論是每個(gè)電機(jī)的FIFO容量有限,一旦超出他的容積就會(huì)讓電機(jī)電調(diào)程序跑飛。這里我不得不對幀與幀的報(bào)文發(fā)送在代碼層面做延時(shí)。這個(gè)電機(jī)的控制形式是激發(fā)式,只有收到了控制報(bào)文電調(diào)才會(huì)反饋報(bào)文。在一開始出問題的那種條件下,單個(gè)電機(jī)100Hz,5*100*2=1000Hz,在總線上會(huì)有1000Hz的報(bào)文,按道理1Mpbs的CAN總線不至于郵箱被擠爆。問題就出在我寫的程序,多個(gè)電機(jī)控制的CAN報(bào)文發(fā)送的代碼之間沒有時(shí)間間隔,對于NX來說,它的緩沖區(qū)和CPU執(zhí)行速度肯定是要比單片機(jī)要好10倍以上的,所以表面上是1000Hz,但報(bào)文的瞬時(shí)頻率可能至少有10000Hz,這樣就會(huì)很快的把電機(jī)的FIFO擠爆。
有嘗試過usb轉(zhuǎn)CAN的設(shè)備做無下位機(jī)方案。當(dāng)時(shí)使用的外設(shè)是達(dá)妙的那個(gè)CAN調(diào)試設(shè)備,本質(zhì)上這玩意是將CAN報(bào)文做一個(gè)轉(zhuǎn)換,走串口通訊發(fā)出來。最后沒有用是因?yàn)樵趐c上使用串口遠(yuǎn)遠(yuǎn)沒有socketCAN方便,另一方面是我的水平不太夠。使用socketCAN可以在不同的進(jìn)程里對同一個(gè)CAN通道進(jìn)行實(shí)例化使用,而串口只能在一個(gè)進(jìn)程中被占用,麻煩了不少。
賽后了解到有一種東西叫PCAN,可以在ARM架構(gòu)的LINUX通過掛載設(shè)備樹,從而使用socketCAN進(jìn)行使用。想來NX的那個(gè)CAN口也是類似的,在使用那個(gè)CAN時(shí)我都要使用命令掛載CAN設(shè)備。進(jìn)一步的,其實(shí)我認(rèn)為不光是ARM架構(gòu)的LINUX可以通過掛載設(shè)備樹的方式,x86/x64也可以,以后有時(shí)間再嘗試吧。不過我還看到一個(gè)東西,叫PCIE CAN卡,工業(yè)用的。
關(guān)于系統(tǒng)的實(shí)時(shí)性,常用的方法就是給系統(tǒng)打補(bǔ)丁,PREEMPT_RT。不過很奇怪的是我在nuc和NX上都有嘗試過自行編譯內(nèi)核,最后結(jié)果沒太大變化。有機(jī)會(huì)再去研究吧。
二、工程機(jī)器人的自定義控制
最理想的遠(yuǎn)程控制機(jī)械臂的方案是用慣性(類VR手柄)設(shè)備來操控機(jī)械臂的六軸姿態(tài)。南航那個(gè)方案做的挺好的,不僅是想法好,而且很適合他們的車。為什么,等我慢慢說。
大家在看一款機(jī)械臂的參數(shù)時(shí),不難注意到一個(gè)參數(shù)叫做重復(fù)定位精度。學(xué)機(jī)械的應(yīng)該學(xué)過數(shù)值測量、互換性、機(jī)械制造這些課,應(yīng)該知道,打千分表測數(shù)據(jù)一般會(huì)做幾組測試,一組重復(fù)測量5次然后取平均。舉個(gè)例子,讓機(jī)械臂從任意位置到A點(diǎn),A點(diǎn)會(huì)有個(gè)千分表,每次機(jī)械臂運(yùn)動(dòng)到A點(diǎn)后會(huì)與千分表進(jìn)行接觸,每次表的讀數(shù)會(huì)在一個(gè)微米級的區(qū)間變,那么我們就說重復(fù)定位精度時(shí)0.01mm。如果說機(jī)械臂的輸出單元在輸出端有個(gè)精度較高的編碼器,并且減速器精度不拉跨,通常都能做到0.01mm的重復(fù)定位。
對重復(fù)定位精度有了了解,再來說說我們比賽的機(jī)械臂需要這個(gè)指標(biāo)嘛?明顯是不需要的。講重復(fù)定位精度的機(jī)械臂應(yīng)用通常關(guān)心的是從A到B,再從B到A,只管起點(diǎn)和終點(diǎn)的位置是準(zhǔn)確的就好。而我們在比賽中,其實(shí)更關(guān)注的是軌跡定位精度。我們允許從A到B有誤差,但由于工程機(jī)器人他的功能的需求,他需要抓取機(jī)構(gòu)在一個(gè)相對復(fù)雜的環(huán)境中運(yùn)動(dòng),并且要抓取一個(gè)相對大的物體。這就導(dǎo)致我們需要非常精確且滯后很小的控制末端的姿態(tài)。做控制的同學(xué)應(yīng)該知道,在大負(fù)載的情況下,除非機(jī)構(gòu)運(yùn)行的很慢,否則是很難做到的。那么,六軸機(jī)械臂的控制將會(huì)變得難以滿足需求。反而,框架式在控制上會(huì)十分方便、迅速、有效。
大家所說的框架式,在工業(yè)界更多的叫三軸笛卡爾??蚣苁截?fù)責(zé)x、y、z方向的移動(dòng),然后再在末端裝三軸負(fù)責(zé)roll、pitch、yaw。當(dāng)我們使用控制器控制時(shí),單個(gè)慣性設(shè)備只能控制三個(gè)自由度。對于框架式的設(shè)備,當(dāng)我使用控制器控制三軸移動(dòng),那么我的三軸笛卡爾將會(huì)運(yùn)動(dòng),而負(fù)責(zé)旋轉(zhuǎn)的設(shè)備不會(huì)運(yùn)動(dòng)。但對于六軸機(jī)械臂,無論改變幾個(gè)自由度的數(shù)據(jù),將至少有3、4個(gè)關(guān)節(jié)會(huì)運(yùn)動(dòng),而機(jī)械臂這種串聯(lián)的設(shè)備,每個(gè)關(guān)節(jié)累計(jì)的誤差傳遞到末端將會(huì)非常非常大。而對于三軸笛卡爾設(shè)備,進(jìn)行力位混合控制(前饋+PI)時(shí),會(huì)比機(jī)械臂要簡單不少,同樣的條件我認(rèn)為三軸笛卡爾的軌跡精度更能保證