遨博协作机器人ROS开发 - 自定义运动学求解器算法插件
目錄
一、簡(jiǎn)介
二、環(huán)境版本
三、學(xué)習(xí)目標(biāo)
四、知識(shí)儲(chǔ)備
五、任務(wù)實(shí)施
六、任務(wù)拓展
?七、課堂小結(jié)
八、課后練習(xí)
一、簡(jiǎn)介
大家好,歡迎關(guān)注遨博學(xué)院帶來(lái)的系列技術(shù)分享文章(協(xié)作機(jī)器人ROS開(kāi)發(fā)),今天我們來(lái)學(xué)習(xí)一下“自定義運(yùn)動(dòng)學(xué)求解器算法插件”。
二、環(huán)境版本
- 主機(jī)系統(tǒng)版本:Windwos10 64位
- 處理器型號(hào):Intel-i7
- 虛擬機(jī)版本:VMware Workstation 16 Pro
- 虛擬機(jī)系統(tǒng):Ubuntu 18.04.6 LTS
- ROS版本:Melodic
三、學(xué)習(xí)目標(biāo)
四、知識(shí)儲(chǔ)備
下面開(kāi)始介紹本節(jié)內(nèi)容的知識(shí)點(diǎn):
1.MoveIt!插件機(jī)制
MoveIt!是ROS中一個(gè)重要的集成化開(kāi)發(fā)平臺(tái),由一系列功能包組成,提供運(yùn)動(dòng)規(guī)劃、操作控制、3D感知、運(yùn)動(dòng)學(xué)等功能模塊,是ROS社區(qū)中使用度排名前三的功能包,目前已經(jīng)支持AUBO-E5機(jī)械臂。
MoveIt!中集成了眾多工具集軟件,集成了各種庫(kù),包括:
運(yùn)動(dòng)規(guī)劃(Motion Planning):MoveIt!只需提供機(jī)器人URDF模型,就可以調(diào)用幾大運(yùn)動(dòng)規(guī)劃庫(kù)的規(guī)劃算法(如OMPL,SBPL,CHMOP),自動(dòng)生成機(jī)器人運(yùn)動(dòng)軌跡。
軌跡插值(Trajectory Processing):由于大多數(shù)規(guī)劃器只能返回一系列路徑點(diǎn),MoveIt!可以根據(jù)機(jī)器人的控制參數(shù)(速度、加速度限制等)重新處理路徑,生成一條帶有時(shí)間戳、位置、速度、加速度信息的完整軌跡。
操作(Manipulation):根據(jù)識(shí)別的物體生成一系列動(dòng)作抓取物體(pick-and-place)目前MoveIt!本身這部分功能還比較弱,不涉及任何反饋、動(dòng)力學(xué)、re-grasp等操作問(wèn)題。
?
3D感知(Perception):可以利用傳感器采集的點(diǎn)云或深度圖像,生成用于碰撞檢測(cè)的OctoMap,OctoMap為八叉樹(shù)形式表示點(diǎn)云,可以大大降低存儲(chǔ)空間,同時(shí),這些3D OctoMap也可以依據(jù)貝葉斯準(zhǔn)則不斷實(shí)時(shí)更新。這樣,機(jī)器人就可以避開(kāi)真實(shí)世界的障礙物了。
運(yùn)動(dòng)學(xué)(Kinematics):目前可以支持多種運(yùn)動(dòng)學(xué)求解器,如OpenRave的封閉解ikfast、Orocos的數(shù)值解KDL、考慮關(guān)節(jié)極限的數(shù)值解Trac_ik、用戶(hù)自己定義的基于service的求解器。
碰撞檢測(cè)(Collision Checking):碰撞檢測(cè)是運(yùn)動(dòng)規(guī)劃的一大難題,如果采用基于采樣的規(guī)劃算法,那么需要對(duì)每個(gè)采樣點(diǎn)做有效性判斷,這時(shí)候就需要進(jìn)行碰撞檢測(cè)。所以,運(yùn)動(dòng)規(guī)劃需要提供一個(gè)高效的碰撞檢測(cè)算法。FCL(Flexible Collision Library),可以非常快速地實(shí)現(xiàn)各種幾何體(3D面片、OctoMap、基本幾何體)的碰撞檢測(cè)。?
控制(Control):屬于機(jī)器人控制接口,可以讓MoveIt!發(fā)布機(jī)器人需要的控制指令。
交互(Interaction):MoveIt!給開(kāi)發(fā)者提供了三種交互方式,直觀的RViz圖形界面、快速編程的Python、豐富的高級(jí)功能的C++。
如右圖所示,MoveIt!中的眾多功能都使用插件機(jī)制集成,并提供了豐富的接口。這樣用戶(hù)可以方便的覆寫(xiě)插件功能,而無(wú)需接觸框架的核心。?
2.MoveIt!運(yùn)動(dòng)學(xué)求解插件
運(yùn)動(dòng)學(xué)插件作為重要的功能模塊,目前使用的主要有以下3個(gè)。
(1)KDL
KDL(Kinematics and Dynamics Library)是MoveIt!中的默認(rèn)運(yùn)動(dòng)學(xué)插件,其有自己的優(yōu)缺點(diǎn),優(yōu)點(diǎn)在于可求解封閉情況下逆運(yùn)動(dòng),缺點(diǎn)在于速度慢,同時(shí)可能找不到解。
(2)TRAC-IK
TRAC-IK和KDL類(lèi)似,也是一種基于數(shù)值解的運(yùn)動(dòng)學(xué)插件,但是在算法層面上進(jìn)行了很多改進(jìn),求解效率高了很多。可以直接使用以下命令安裝:
(3)IKFAST
IKFAST是一種基于解析算法的運(yùn)動(dòng)學(xué)插件,可以求解任意復(fù)雜運(yùn)動(dòng)鏈的運(yùn)動(dòng)學(xué)方程并保證每次求解的一致性,整體來(lái)說(shuō),IKFAST比較穩(wěn)定快速,一般5us的速度可完成運(yùn)算。
3.MoveIt!運(yùn)動(dòng)插件開(kāi)發(fā)方法
MoveIt!并不提供算法源碼,只是將算法按照約定的方法進(jìn)行封裝,算法是數(shù)學(xué)模型的代碼實(shí)現(xiàn),和MoveIt!本身并沒(méi)有關(guān)系,如果需要集成功能算法到MoveIt!中,需要編寫(xiě)接口文件,如下圖所示,滿(mǎn)足MoveIt!的插件規(guī)范即可,然后向move_group進(jìn)行注冊(cè),這樣使用時(shí)即可通過(guò)yaml或launch文件進(jìn)行直接的調(diào)用。
?
?如圖所示。
planning_interface是由moveit_core_package的核心庫(kù)提供,提供一個(gè)標(biāo)準(zhǔn)的協(xié)議接口,方便用戶(hù)集成其他算法。
PlannerConfigurationSettings用于配置參數(shù)。
PlanningContext用于規(guī)劃算法的具體實(shí)現(xiàn)。
PlannerManager用于向MoveIt!注冊(cè)插件,并告知MoveIt!此插件的作用。
PlannerManager實(shí)現(xiàn)時(shí)核心調(diào)用接口是Register,目的是進(jìn)行注冊(cè)。
PlanningContext實(shí)現(xiàn)時(shí)核心調(diào)用接口是solve,包含具體的運(yùn)動(dòng)規(guī)劃算法。
4.自定義運(yùn)動(dòng)規(guī)劃算法的實(shí)現(xiàn)
自定義一個(gè)LERPInterface類(lèi),主要內(nèi)容是重構(gòu)接口函數(shù),完成自定義的運(yùn)動(dòng)規(guī)劃算法,在類(lèi)中重點(diǎn)是實(shí)現(xiàn)兩個(gè)函數(shù)。
(1)solve函數(shù),這是運(yùn)動(dòng)規(guī)劃算法的主要調(diào)用接口,通過(guò)輸入運(yùn)動(dòng)規(guī)劃場(chǎng)景、運(yùn)動(dòng)規(guī)劃的起始和終止位置,返回運(yùn)動(dòng)規(guī)劃結(jié)果。
(2)interpolate函數(shù),這是運(yùn)動(dòng)規(guī)劃算法的具體實(shí)現(xiàn)函數(shù),包含具體的算法。
自定義一個(gè)LERPPlanningContext類(lèi),這個(gè)類(lèi)繼承自MoveIt!提供的planning_interface::PlanningContext,實(shí)現(xiàn)了兩個(gè)不同輸入條件下的solve函數(shù),terminate終止運(yùn)動(dòng)函數(shù)、clear清除緩存函數(shù),如下列代碼片段所示。??
自定義一個(gè)LERPPlannerManager 類(lèi),這個(gè)類(lèi)繼承自MoveIt!提供的planning_interface::PlannerManager,其中,initialize實(shí)現(xiàn)了算法初始化、canServiceRequest實(shí)現(xiàn)該插件是否可以應(yīng)答運(yùn)動(dòng)規(guī)劃的請(qǐng)求、getDescription實(shí)現(xiàn)了獲取運(yùn)動(dòng)規(guī)劃器的字符串描述、getPlanningAlgorithms實(shí)現(xiàn)了獲取運(yùn)動(dòng)規(guī)劃算法的名稱(chēng)、getPlanningContext實(shí)現(xiàn)對(duì)避障狀態(tài)配置。
如下列代碼片段所示。?
五、任務(wù)實(shí)施
接下來(lái),我們來(lái)看下替換默認(rèn)運(yùn)動(dòng)學(xué)求解器算法插件為自定義插件,控制虛擬機(jī)器人運(yùn)動(dòng),驗(yàn)證算法的有效性的演示。
14.自定義運(yùn)動(dòng)學(xué)求解器算法插件
六、任務(wù)拓展
恢復(fù)默認(rèn)配置。
完成更換自定義運(yùn)動(dòng)學(xué)求解器算法插件后,修改配置文件,將運(yùn)動(dòng)學(xué)插件更換為默認(rèn)運(yùn)動(dòng)學(xué)求解器插件,分析相關(guān)配置文件的參數(shù)含義。
?七、課堂小結(jié)
下面我們進(jìn)行課堂小結(jié):
MoveIt!的功能大部分都是以插件的形式提供,并提供了開(kāi)發(fā)接口,運(yùn)動(dòng)學(xué)、碰撞檢測(cè)、路徑規(guī)劃等功能都可以讓用戶(hù)將自己的算法移植到ROS中,完成對(duì)機(jī)器臂數(shù)學(xué)計(jì)算的驗(yàn)證。
八、課后練習(xí)
最后給大家布置兩道課后習(xí)題。
1.在ROS中,分別更換運(yùn)動(dòng)學(xué)算法插件為KDL、TRAC-IK、IKFAST,完成相同路徑的軌跡規(guī)劃,對(duì)比AUBO-E5機(jī)械臂在不同運(yùn)動(dòng)學(xué)求解器下的路徑效果。
2.按照例程編寫(xiě)一個(gè)運(yùn)動(dòng)學(xué)求解器算法插件,熟悉開(kāi)發(fā)流程。
?
在接下來(lái)的ROS課程中,我們會(huì)講解Intel RealSense深度相機(jī)ROS驅(qū)動(dòng)開(kāi)發(fā),歡迎持續(xù)關(guān)注。?
總結(jié)
以上是生活随笔為你收集整理的遨博协作机器人ROS开发 - 自定义运动学求解器算法插件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java 内存 溢出_java内存溢出的
- 下一篇: ORACLE 授权 新增 修改 删除 注