python控制机械臂6轴_在ROS环境下,怎么使用moveit!来驱动真实的六轴机械臂?
很多小伙伴在使用ROS的時候,都會產生類似的疑問,程序寫過那么多,仿真也跑過不少,但是如何控制真實機械臂/機器人呢?
今天古月君就來嘗試破個題。
首先,解決這個問題的關鍵詞是“接口”。所謂接口,即數據傳輸的通道,如何將ROS功能包計算得到的數據發給真實機器人并使之運動是問題的關鍵。
機械臂有點復雜,我們先以簡單一些的ROS小車為例,看看ROS是如何讓真實小車動起來的。
大家在某寶上搜索“ROS移動機器人”,會出現一系列的小車,看來看去,無非都是類似下圖的零部件組成的:
做個分類,大家應該會更清晰一些:
這就是從控制角度看到的機器人四大組成部分,ROS并不是機器人的全部,主要運行于控制系統當中。
以小車的導航為例,從復雜的算法到小車的運動具體經過了哪些步驟呢?
1.使用者在rviz中使用鼠標選擇一個導航目標點
2.全局規劃器開始路徑規劃,得到一條從A到B的最優路徑
3.本地規劃器開始計算機器人每個周期的最佳速度,盡量靠近最優路徑并躲避動態障礙物
OK,劃重點啦,此時以上還都是ROS功能包完成的工作,我們進一步簡化以上步驟,所有功能看成黑盒,輸入是目標位置,輸出是周期速度,這個周期速度就是“接口”。
接下來我們要做的事情就是讓小車的硬件匹配這個周期速度的接口,怎么匹配呢?
小車的運動最后由電機執行,電機要轉起來就需要一個電壓信號,要產生電壓信號就需要將控制信號(PWM)放大,要產生控制信號就需要有一個微控制器(MCU),微控制器的輸入指令哪里來,一條電纜(網線或串口線)連接PC和MCU,接口就連上了。
當然,接口連上只是“肉體連接”,要做到“精神連接”還需要完成控制器里的驅動控制,也就是我們常說的PID閉環控制。
至此,我們成功的讓小車動起來了,總結一下,我們怎么讓小車動起來的:
1.ROS功能包跑起來
2.控制數據傳輸給小車的控制器
3.控制器里完成底層控制
4.控制信號變成電信號,電機轉起來
似乎有點偏題,我們回到機械臂的場景,原理依然是上邊的四個步驟,根據不同的硬件條件,并不是每個步驟都需要我們自己來實現。
在ROS環境下,不管是移動小車的move_base,還是機械臂的MoveIt!,都是解決第一個步驟的功能算法問題。ROS最大的好處就是:我們可以先不關注功能算法的內部實現,通過接口的拼接快速實現系統的原型。所以這里我們需要關注的一個問題是MoveIt!的輸入輸出接口是什么?
在下邊這張圖中,我們可以看到MoveIt!核心節點的接口:
輸入:編程API(C++、Python)、GUI(Rviz中的Motion Planning)
輸出:關節軌跡(Trajectory)
先不糾結MoveIt!里邊干了啥,反正當我們通過程序或者界面指定一個目標位置后,它會規劃得到一條運動到目標位置的軌跡,這條軌跡由一系列關節空間的位置組成。
和ROS小車一樣,接下來,我們要把這條軌跡發給機械臂的控制器,如果你使用的是類似UR、ABB這種工業機械臂的話,控制器都是配套的,只需要在示教器上做一些TCP端口的配置,就可以接收軌跡數據了,后續的底層控制算法和電機驅動就不需要我們關心了,完善的控制器都會幫我們實現。
換一個場景,如果是我們自己做機械臂,控制器需要自己開發,又該如何做呢?
還是上邊ROS小車的思路,機械臂控制器里也需要實現這些基礎功能:
1.接收控制數據(運動軌跡)
2.完成底層運動控制
3.控制信號變成電信號,電機轉起來
不管你用的控制器是MCU、樹莓派還是PC,總會有和外界通信的方法,比如常見的串口、網絡等,所以第一個接收控制數據的方法就是通過任一媒介,將軌跡數據發送到控制器上,具體實現可以參考ros_serial、ROS-I Simple Message功能包或串口、 socket通信的編程方法。
收到數據之后呢?MoveIt!規劃得到的關節軌跡由一系列軌跡點組成,每兩個點之間的時間間隔不定,基本是0.1~1秒之間,這個時間間隔對于底層控制來講,是非常大的,很容易造成軌跡運動不圓滑、速度不均勻的現象,需要進一步細分到和控制周期匹配的間隔,也就是你可能常聽說的“軌跡插補”,具體實現可以參考ros_control。
比如初始軌跡的運動總時間是5s,按照10ms插補,那么我們將得到一條由500個點組成的軌跡,每個點包含此刻各關節的位置信息。
接下來就是把這些位置信息變成電信號,讓電機轉動帶動機械臂運動,這就是我們常說的電機驅動。如果你用的是步進電機,你可能需要一個可以接收脈沖位置的步進驅動器,如果你用的是伺服電機,可能需要一個可以接收位置指令的伺服驅動器,如果你使用的是舵機,直接發送位置指令即可,如果你要自己做驅動器,請谷歌“如何實現電機驅動器”。
按照周期依次完成所有點后,軌跡運動完成,真實機械臂就按照MoveIt!的規劃完成運動了。https://www.zhihu.com/video/1180610312959721472
古月君洋洋灑灑寫了這么多,你可能已經從入門到放棄了。。。
好吧,忽略上邊的所有內容,直接看圖:
ROS MoveIt!控制真實機械臂的一般框架:
1.通過程序或界面設置機械臂運動目標
2.MoveIt!完成運動規劃并輸出關節軌跡
3.通過socket接口和控制器連接,將關節軌跡發送給控制器
4.控制器進行插補運算,并周期發送給電機驅動器
5.驅動器完成閉環控制,讓電機多、快、好、爽的跟隨輸入指令
6.控制器反饋實時狀態到MoveIt!,Rviz動態顯示當前狀態
以上內容古月君偏向于系統原理的介紹,具體實現的手段和硬件相關,各位還需要在原理的基礎上完成開發。
更多參考歡迎繼續閱讀古月居的歷史文章:功夫手:一款基于ROS的工業機器人?mp.weixin.qq.com公開課 | ROS機器人開發案例(附ppt)?mp.weixin.qq.com古月私房課 | ROS機械臂開發中的主角MoveIt!?mp.weixin.qq.com古月私房課 | 搭建仿真環境一樣玩轉ROS機械臂?mp.weixin.qq.com古月私房課 | 針對工業應用的ROS-I又是什么?mp.weixin.qq.com古月私房課 | 基于ROS設計一款機械臂控制系統?mp.weixin.qq.com
愿各位擁有一個段美好的機器人開發之旅。
總結
以上是生活随笔為你收集整理的python控制机械臂6轴_在ROS环境下,怎么使用moveit!来驱动真实的六轴机械臂?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu kylin (优麒麟)18
- 下一篇: Python使用栈将中序转后序(代码)