遨博协作机器人ROS开发 - 机械臂复杂轨迹规划
目錄
一、簡介
二、環(huán)境版本
三、學(xué)習(xí)目標(biāo)
四、知識儲備
?五、任務(wù)實施
六、任務(wù)拓展
?七、課堂小結(jié)
?八、課后練習(xí)
一、簡介
大家好,歡迎關(guān)注遨博學(xué)院帶來的系列技術(shù)分享文章(協(xié)作機(jī)器人ROS開發(fā)),今天我們來學(xué)習(xí)一下“機(jī)械臂復(fù)雜軌跡規(guī)劃”。
二、環(huán)境版本
- 主機(jī)系統(tǒng)版本:Windwos10 64位
- 處理器型號:Intel-i7
- 虛擬機(jī)版本:VMware Workstation 16 Pro
- 虛擬機(jī)系統(tǒng):Ubuntu 18.04.6 LTS
- ROS版本:Melodic
三、學(xué)習(xí)目標(biāo)
四、知識儲備
下面開始介紹本節(jié)內(nèi)容的知識點:
1.MoveIt!的正向運(yùn)動學(xué)
通過MoveIt!的API接口控制機(jī)械臂運(yùn)動,程序中一般是通過設(shè)置機(jī)械臂末端需要到達(dá)的位姿,然后規(guī)劃路徑并執(zhí)行來控制機(jī)械臂運(yùn)動的,這樣可以保證每次末端都會運(yùn)動到指定的位姿,但是,機(jī)械臂6個關(guān)節(jié)的姿態(tài)每次規(guī)劃并不一定相同。
如下方兩個示意圖所示,機(jī)械臂具有相同的末端位姿,但是具備不同的關(guān)節(jié)角。
?通過機(jī)械臂末端的位姿來計算機(jī)器人運(yùn)動的路徑,其實是一個逆運(yùn)動學(xué)的過程,如果需要每次機(jī)械臂運(yùn)動后的整體姿態(tài)是固定的,就需要使用正運(yùn)動學(xué)過程,如下列代碼所示,設(shè)置的目標(biāo)不是末端的位姿,而是6個關(guān)節(jié)的角度。
需要注意的是,在ROS中角度使用的單位是弧度,而在機(jī)械臂示教器中使用的單位是角度,需要進(jìn)行單位的轉(zhuǎn)換。
設(shè)置關(guān)節(jié)角為目標(biāo)姿態(tài)時需要調(diào)用setJointValueTarget函數(shù)。
?2.圓弧軌跡規(guī)劃
在MoveIt!規(guī)劃中,圓弧軌跡插補(bǔ)API是未提供的。實際應(yīng)用里,例如焊接等任務(wù)需要圓弧軌跡,那么就需要自行實現(xiàn)。方法如下圖所示,是用很多直線段模擬圓弧,取點越多越接近實際圓弧。在圓弧上均勻采樣,將位置依次添加到路點,最后調(diào)用直線路徑規(guī)劃API實現(xiàn)圓弧運(yùn)動,實現(xiàn)方法如右側(cè)代碼所示。
3.軌跡重定義
如果對規(guī)劃出來的軌跡不是很滿意,可以在“plan”和“execute”之間對軌跡進(jìn)行修改。這里以刪除軌跡中的中間點為例,對軌跡進(jìn)行重定義。
首先調(diào)用MoveIt!的API規(guī)劃得到一條路徑plan(軌跡規(guī)劃),如下列代碼所示:
?接著調(diào)用右側(cè)代碼中實現(xiàn)的函數(shù),delete_trajectory(plan, 10);,這是對plan每隔10個點刪除一個,完成軌跡重定義,當(dāng)然如果刪除的點太多,會造成真實機(jī)械臂運(yùn)動產(chǎn)生卡頓和抖動。
?4.多軌跡連續(xù)運(yùn)動
如果要一次運(yùn)動多種復(fù)雜的軌跡,使用前面的方法,需要每次規(guī)劃路徑,然后等待機(jī)械臂運(yùn)動完成,再次規(guī)劃下一條路徑,如此往復(fù)。在執(zhí)行每條路徑后,要規(guī)劃下一條路徑,這必然會導(dǎo)致計算路徑耗時所產(chǎn)生的停頓,如果計算機(jī)的運(yùn)算能力不高,這種停頓時間會更加明顯。
如何讓機(jī)械臂在各段軌跡之間不停頓,一氣呵成完成所有軌跡的運(yùn)動?MoveIt!本身是沒有此功能的,因為MoveIt!規(guī)劃出來的軌跡一定是速度從0到0的軌跡,我們需要重新組合API的調(diào)用來實現(xiàn)多軌跡連續(xù)運(yùn)動。
實現(xiàn)方法是將規(guī)劃得到的多條軌跡拼接成一條,然后對這一條軌跡中的速度,加速度進(jìn)行重新規(guī)劃,成為一條完整的軌跡,關(guān)鍵就在于如何重規(guī)劃。
下面給出用時間最優(yōu)算法對拼接的軌跡進(jìn)行重規(guī)劃,當(dāng)然也可以用其它算法實現(xiàn)。
?下列是多條軌跡連續(xù)規(guī)劃示例代碼,生成新軌跡,然后就可以控制機(jī)械臂運(yùn)動。
代碼流程為首先定義一個軌跡變量trajectory,接著將已經(jīng)規(guī)劃好的路徑中的每個點加入到trajectory中,重復(fù)此操作加入所有規(guī)劃的軌跡,然后將所有的軌跡點重新規(guī)劃,生成新的軌跡trajectory,最后將新軌跡賦值到規(guī)劃變量中。
?5.修改超時運(yùn)動限制
MoveIt!對于機(jī)械臂運(yùn)動一條軌跡的時間是有默認(rèn)限制的,如果采用多軌跡連續(xù)運(yùn)動,那么會認(rèn)為這是一條完整的軌跡,一般復(fù)雜軌跡運(yùn)動的時間是比較長的,所以需要修改這個限制,以防超時導(dǎo)致的報錯,方法如下。
修改AUBO-E5的MoveIt功能包下launch文件夾下的trajectory_execution.launch.xml文件,將執(zhí)行的超時時間修改為20,單位是秒,如果在運(yùn)行時報timeout的錯誤,也和機(jī)械臂運(yùn)行速度有關(guān),可適當(dāng)增大這個數(shù)值。
在下圖所示的位置進(jìn)行修改,需要注意的是,軌跡執(zhí)行時間限制的修改最好經(jīng)過測試并符合實際需求。
?五、任務(wù)實施
接下來,我們來看下通過機(jī)械臂跳舞案例,展現(xiàn)正向運(yùn)動學(xué)、軌跡重定義、多軌跡連續(xù)運(yùn)動等內(nèi)容。
12.機(jī)械臂復(fù)雜軌跡規(guī)劃
六、任務(wù)拓展
設(shè)置機(jī)械臂速度與加速度限制。
為了使機(jī)械臂舞蹈運(yùn)動速度和加速度更快,需要修改AUBO-E5的MoveIt功能包下config文件夾下的joint_limits.yaml文件,如右圖所示,這里可以設(shè)置機(jī)械臂6個關(guān)節(jié)最大速度和加速度。
此文件內(nèi)內(nèi)參數(shù)的含義如下:
- has_velocity_limits:速度限制是否生效,true代表生效,false代表不生效,生效時才能控制最大速度;
- max_velocity:最大速度限制值,單位為弧度/s;
- has_acceleration_limits:加速度限制是否生效,true代表生效,false代表不生效,生效時才能控制最大加速度;
- max_acceleration:最大加速度限制值,單位為弧度/平方秒。
?七、課堂小結(jié)
下面我們進(jìn)行課堂小結(jié):
1.本節(jié)內(nèi)容主要針對MoveIt!的復(fù)雜路徑規(guī)劃,可以利用圓弧軌跡規(guī)劃、軌跡重定義、多軌跡連續(xù)運(yùn)動等方式完成需要的軌跡路徑,這在實際的應(yīng)用過程中是非常重要的。
2.真實機(jī)械臂的ROS最大速度與最大加速的限制調(diào)節(jié)需要以安全為主,特別是在調(diào)試開發(fā)階段,防止速度超出預(yù)期造成不必要的損失,同時也請放心,在ROS控制下,機(jī)械臂的碰撞停止等安全功能依然有效。
?八、課后練習(xí)
最后給大家布置一道課后習(xí)題。
1.利用圓弧軌跡規(guī)劃的方法,編寫1個在水平面規(guī)劃圓形末端軌跡的程序節(jié)點,并控制真實機(jī)械臂完成此軌跡的驗證。
2.利用軌跡重定義的方法,逐步刪除軌跡中的路點,觀察真實機(jī)械臂的運(yùn)動情況。
在接下來的ROS課程中,我們會講解遨博機(jī)械臂末端工具ROS驅(qū)動,歡迎持續(xù)關(guān)注。
總結(jié)
以上是生活随笔為你收集整理的遨博协作机器人ROS开发 - 机械臂复杂轨迹规划的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。