[译]机器人操作系统简介:终极机器人应用框架(上)
2019獨角獸企業重金招聘Python工程師標準>>>
[譯]機器人操作系統簡介:終極機器人應用框架
/***?原文出處:https://www.toptal.com/robotics/introduction-to-robot-operating-system*?@author?dogstar.huang?<chanzonghuang@gmail.com>?2016-03-05*/機器人操作系統(ROS)不是一個真實的操作系統,而是一個框架以及一系列為運行在異質計算機集群的操作系統提供基礎功能的工具。 它的用處不局限于機器人,還包括大量關注與外設一起工作的工具。
ROS 分成2000多個包,每個包提供特定的功能。連續框架的工具數量可能是它的最大功率。
為什么我應該用ROS?
ROS提供了硬件抽象,設備驅動,多機器進程間的通信,測試和可視化的工具等功能。
ROS的關鍵特性是軟件運行和溝通的方式,使得你可以設計復雜的軟件而不需要知道相關的硬件如何工作。ROS提供了一種利用中央樞紐連接進程(節點)網絡的方式。 節點可以運行在眾多設備上,并且可以通過各種途徑與中央樞紐進行連接。
創建網絡的主要方式有提供可請求的服務,或者定義與其他節點的發布/訂閱者連接。這兩種方法都是通過指定消息類型來通信的。 一些類型由核心包提供,而消息類型則可由用戶包來定義。
對于小型問題,開發人員可以通過連接已存在的解決方案來集成一個復雜的系統。這種方式的系統已經實現,它允許我們:
在fly上用熟悉的接口替換組件,以便為各種變化移除停止系統的需要
為另一個組件把眾多組件的輸出混合成一個輸出,以便并行解各類問題
只要實現消息系統對應的合適連接器就可以連接各種各樣編程語言創造的組件,使得通過連接來自大量開發人員已存在的模塊進行軟件開發很容易
創建基于設備網絡的節點,而不用關心代碼在哪里運行以及實現進程通信(IPC)和遠程過程調用(RPC)系統
根據遠程硬件的需要,通過部署前兩個要點即可直接連接饋送,而不用編寫任何額外的代碼
我們在計劃演示通過迭代開發一個簡單方案是多么地有用。相比于其他方式,這里有幾個關鍵的好處。ROS有多平臺支持以及允許通過隱藏于表面的點對點連接進行多設備的進程連接。 此設計允許支持任何包裝了C++通信類的任何語言,或者手動為語言接口開發類。
ROS由我們的社區創建,意味著它也回歸于社區。多虧于這個系統架構,經過若干年后,這種氛圍導致了大量可重用并易于集成的包的涌現。
一些變種如:http://www.mrpt.org/,http://carmen.sourceforge.net/intro.html, http://lcm-proj.github.io/,http://playerstage.sourceforge.net/,https://msdn.microsoft.com/en-us/library/bb648760.aspx 等提供了其中一些特性,但不是全部。 大多數時候,設計的衰落在于語言支持的局限,未優化進程通信,或者按理說是最難修復的問題 -- 缺少對大量設備的支持。
我們準備構建什么?
既然我們的關注點是框架而不是針對特定問題的具體算法,所以給定的問題是相當簡單的。我們的目標就是為一個車載的計算機構建通過Wi-Fi連接的軟件, 從而可以通過使用電腦上的游戲把柄和安裝在機器人上的攝像機來遠程控制和監控機器人。
首先,為了示范ROS的基本原則,我們將會創建一個簡單的程序來連接一個簡單的模擬。我們會把游戲手柄綁定到電腦上并且嘗試為能把游戲手柄輸入轉換成機器人控制信息而設計一個好的控制方案。
編寫ROS代碼的只要語言是C++和Python,首選C++是因為它的性能。由于代碼中更少的樣板和不需要明確的構建,我們將會通過Python來解釋示例。
安裝與配置
ROS版本由名稱來組成。如現在這個日期,最新的發布版本是_Jade Turtle_,而最新的LTS版本是_Indigo Igloo_。最好是使用LTS版本,因為ROS不保證向前兼容性,所以全部的示例將使用_Indigo_這個版本來編寫。
ROS可用于大量的*NIX平臺,官方支持的版本運行于Ubuntu。OS X,Arch Linux,Debian,Raapbain 和Android版本則由社區支持。
我們將經歷在Ubuntu 14.04桌面的安裝過程。全部支持的版本和平臺的過程都可在官網獲得。帶ROS的虛擬機也有。
安裝是平臺依賴性的(大部分平臺都有自己提供的包),而工作區間的配置對于全部平臺來說都是一樣的。
在Ubuntu上安裝
ROS提供了自己的倉庫。第一步就是要添加它們。
sudo?sh?-c?'echo?"deb?http://packages.ros.org/ros/ubuntu?$(lsb_release?-sc)?main"?>?/etc/apt/sources.list.d/ros-latest.list' sudo?apt-key?adv?--keyserver?hkp://pool.sks-keyservers.net?--recv-key?0xB01FA116 sudo?apt-get?update然后會有針對你的Ubuntu版本的全部ROS的全部托管包。例如,Ubuntu 14.04支持indeigo和jade。
在桌面上安裝基本的包可以三選一:
最小化安裝:sudo apt-get install ros-indigo-ros-base
帶基本額外GUI工具的:sudo apt-get install ros-indigo-desktop
全量安裝,即有全部官方特性的,包含了大量模擬器以及導航和知覺類庫:sudo apt-get install ros-indigo-desktop-full
為了獲得最好的工作體驗,推薦全量安裝。對于僅僅是用于運行節點的設備安裝,基本版本則足夠了。不和你選擇的是哪個選項,你都可以安裝任何需要的package_name包通過執行:
sudo?apt-get?install?ros-indigo-<package-name>最終的名字將會把下劃線替換成橫線,所以stage_ros在這個包里
ros-indigo-stage-ros下一步是安裝rosdep。在ROS的包可以聲明他們依賴的包。rosdep允許你編譯這些包而不用過多地人工維護依賴處理。為了安裝它,調用:
sudo?rosdep?init rosdep?updateROS有幾個被它的工具使用的環境變量。默認的安裝,bash腳本在/opt/ros/indigo/setup.bash初始化他們。在每個bash的會話中都需要初始化這些變量,所以最好的解決方案是把他們添加到~/.bashrc。
echo?"source?/opt/ros/indigo/setup.bash"?>>?~/.bashrc source?~/.bashrc一些包通過rosinstall來安裝擴展的依賴,rosinstall可作為一個包來獲得并可通過sudo apt-get install python-rosinstall安裝。
這里到了在Ubuntu上安裝的最后。接下來是安裝工作區間的簡短介紹。
配置
自從_Groovy Galapagos后_,ROS工作區間通過catkin來管理。我們需要為全部托管的負定義一個目錄。在這個目錄里創建一個src目錄,并在里面調用catkin_init_workspace。 這將會創建大量的鏈接到當前ROS版本源的符號。下一步是把這個工作音區也添加到環境變量。
為了演示整個工作區間的配置,選擇一個空的目錄并執行以下命令:
mkdir?src cd?src catkin_init_workspace cd?.. catkin_make echo?"source?$(pwd)/devel/setup.bash"?>>?~/.bashrc source?~/.bashrc現在你已經創建了一個可以在里面創建自己ROS包的工作區間。
熟悉工具
馬上創建代碼是一個很大的跨越。讓我們先來熟悉一些運行在屏幕后的系統。第一步是運行基本的GUI并看下它生成了什么消息。
為了在ROS中運行一些東西,需要加載一個核心的進程。這一點很簡單,只要在一個新的終端窗口并輸入:
roscore在你的整個連接設備網絡中,roscore僅需要在為通信分發托管中央樞紐的設備上加載一次。
roscore的主要角色是告訴節點他們應該連接哪個節點,以及通過哪種方式(不管是通過網絡端口還是共享內存)。這樣的目的是為了在最小化時間和運行全部通信所需要的帶寬時, 讓節點只關心他們想知道的數據,而不是他們想要連接的節點。
rqt
運行roscore后,可以為ROS加載主要的GUI工具:rqt。我們會看到很一般的東西 -- 一個空白的窗口。rqt托管了非常大量的可以在可視化配置中進行配置的插件 以及任何數量的預定義視圖。
為了能夠開始,先運行插件_Robot Steering_,可以通過Plugins > Robot Tools > Robot Steering來選擇它。我們會看到有兩個滑塊,代表著我們的機器人將會擁有的線性和旋轉運動。 在插件的頂部可以看到一個有/cmd_vel的輸入框。我們可以任意進行重命名。它代表了此操舵發布的主題。終端工具是看到在后臺運行了什么的最好地方。
終端工具
ROS有幾個非常有用的工具來檢查系統中正在發生什么。第一個我們將會介紹的工具是rostopic。 它允許我們檢查節點可以評閱和發布的主題。運行```rostopic list···將會產生:
/cmd_vel /rosout /rosout_agg后兩個主題通常都會運行并且與中央ROS系統相關。/cmd_vel主題則由我們的操舵發布。在操舵中重命名這個主題也會在這里重全名?,F在,我們對于在這個主題里面發生的東西感興趣。 運行rostopic echo /cmd_vel將看不到什么東西(除非你對滑塊作了調整)。這個進程會一直執行,直到我們取消它。讓我們把垂直滑塊移到20 m/s??粗敵?#xff0c;我們會看到以下一次又一次重復的內容:
linear:x:?0.2y:?0.0z:?0.0 angular:x:?0.0y:?0.0z:?0.0這個消息重復的頻率是多少?rostopic hz /cmd_vel說平均頻率是10Hz。好吧,通過我很慢的Wi-Fi連接可以運行多少像這樣的主題?rostopic bw /cmd_vel表明平均是480B/s。
到目前為止一切運行良好,但我們將要討論消息類型。這種數據對于人類是友好的,但應用需要raw格式的數據,并且需要知道消息類型以便它能解析數據。 類型可以通過rostopic type /cmd_vel來決定,告訴我們這是一個geometry_msgs/Twist。任何ROS終端的工具無參數調用時都會返回一個標準的幫助消息。
ROS的wiki非常贊,在網頁搜索這個字符串會找到一系列的解釋,從它包括了什么到它的結構是怎樣的應有盡有。但是我們不用依賴于它。rosmsg是針對消息類型的通用工具。 運行rosmsg show geometry_msgs/Twist會返回:
geometry_msgs/Vector3?linearfloat64?xfloat64?yfloat64?z geometry_msgs/Vector3?angularfloat64?xfloat64?yfloat64?z這個消息包含了兩個3D向量,表示在三維空間中的線性和旋轉速度。
如果我們想知道一個節點連接了什么主題,rosnode info <node-name>會給出關于節點的詳細數據。rostopic,rosmsg和rosnode是檢查raw ROS功能的主要工具。 ROS有大量的GUI和終端工具,但這些已超出了這次簡介的范疇。
運行ROS節點的主要工具是rosrun和roslaunch。rosrun通過rosrun <package_name> <node_name>來運行節點,而roslaunch則基于加載 由于是ROS自動化中最為復雜的元素所以我們知之甚少的文件來運行節點。
我們可以關閉運行的全部東西以開啟我們最初的代碼。在下文中,我們將省略說明運行任何和ROS相關的東西都需要一個活躍的roscore實例。你遇到的很多問題都可以通過關閉 運行roscore對應的窗口來解決,并且新開一個窗口重新加載。這樣的話會更新全部需要重新加載的依賴,包括在bash和在roscore中。
創建游戲柄遙
我們第一個目標是通過創建一個發布geometry_msgs/Twist數據給基于游戲柄輸入的/cmd_vel來模擬Robot Steering的功能。第一步的產出是joy包。
joy包
這個joy包為操縱桿和游戲柄提供了通用的ROS驅動。它沒有包含在默認的安裝,所以需要這樣進行安裝:
sudo?apt-get?install?ros-indigo-joy安裝完成后,可以運行rosrun joy joy_node。這會把我們和默認的操縱桿或者游戲連接起來。運行rostopic list可以看到有一個叫/joy的主題。通過rostopic echo可以 看到以下格式的消息(請注意你需要使用游戲柄或操縱桿解析待發布的消息)。
header:seq:?4156stamp:secs:?1450707466nsecs:?204517084frame_id:?'' axes:?[0.0,?0.0,?0.0,?-0.0,?0.0,?0.0,?0.0,?0.0] buttons:?[0,?0,?0,?0,?0,?0,?0,?0,?0,?0,?0]現在你可以忽略頭部。除此之外,axes和buttons恰到好處地解析了他們代表什么。移動軸和按下在控制器上的按鈕會導致這些數字發生變化。使用我們的工具,可以決定這個消息類型 是sensor_msgs/Joy并且對應的格式是:
std_msgs/Header?headeruint32?seqtime?stampstring?frame_id float32[]?axes int32[]?buttons創建我們的遙
編寫代碼的第一步是創建一個包。在工作區間的src目錄里,運行:
catkin_create_pkg?toptal_tutorial?rospy?joy?geometry_msgs?sensor_msgs在這里我們聲明了將要創建的包名,緊跟隨后的是所要依賴的包。無須擔心,依賴可以稍候手動更新。
現在我們有了toptal_tutorial目錄。在這個目錄里,創建一個將會放置全部Python腳本的scripts目錄。
現在來創建一個teleop.py文件,并在里面放置:
#!/usr/bin/env?python?import?rospy?from?sensor_msgs.msg?import?Joy?def?joy_callback(data):?print?data?def?main():?rospy.init_node('teleop')?rospy.Subscriber('joy',?Joy,?joy_callback)?while?not?rospy.is_shutdown():?pass?if?__name__?==?'__main__':?main()我們還需要設置chmod +x teleop.py以便腳本能被執行。在某個終端上運行rosrun joy joy_node并有另一個終端上運行rosrun toptal_tutorial teleop.py將會導致運行teleop.py的終端被輸出的Joy消息填充。
讓我們來檢查一下代碼做了什么。
首先,導入托管了與ROS框架交互的類庫的rospy。每一個定義了消息的包都有一個帶消息定義的msg子包。我們導入了Joy以便可以處理輸入。 這里不需要導入嵌入式的消息類型(如來自在Joy消息中的std_msgs.msg的Header),除非我們想明確地提及他們。
第一步是初始化一個指定名字的節點(在這里,我們把它叫作“teleop”)。然后創建一個訂閱者來訂閱sensor_msgs.msg.Joy類型的“joy”主題,并且通過 回調joy_callback函數來處理每一個消息?;卣{接收一個參數,即來自消息的數據。訪問這個數據的成員非常簡單。如果想打印第一個軸的狀態,或者想 重新調用這個消息類型,可以調用print data.axes[0],并且是一個浮點類型。在最后的循環會一直循環直到ROS關閉。
下一步是處理未知的數據。我們會創建一個根據輸入而改變的Twist消息,然后會把它發布到cmd_vel主題。
#!/usr/bin/env?python?import?rospy?from?sensor_msgs.msg?import?Joy?from?geometry_msgs.msg?import?Twist?#?new?from?functools?import?partial?#?new?def?joy_callback(pub,?data):?#?modified?cmd_vel?=?Twist()?#?new?cmd_vel.linear.x?=?data.axes[1]?#?new?cmd_vel.angular.z?=?data.axes[0]?#?new?pub.publish(cmd_vel)?#?new?def?main():?rospy.init_node('teleop')?pub?=?rospy.Publisher('cmd_vel',?Twist,?queue_size=1000)?#?new?rospy.Subscriber('joy',?Joy,?partial(joy_callback,?pub))?#?modified?while?not?rospy.is_shutdown():?pass?if?__name__?==?'__main__':?main()首先,添加Twist消息,并且為通過functools.partial綁定函數參數添加支持。然后創建一個發布者,pub,來把一個Twist消息類型發布給cmd_vel。我們把這個發布者和回調函數進行綁定,并使它為每一個由前兩個軸代表的速度的輸入都發布一個Twist消息。 這些代碼做了我們期望的它做的事情,而且可以通過rostopic echo /cmd_vel看到結果的輸出。
但我們還有一個問題。joy主題發布的速度會很大。如果監控rostopic hz /cmd_vel并在圓圈中移動模擬遙桿,可以看到超級大量的消息。 這不僅僅導致了大量的通信,還導致了接收這些消息的進程需要一個個地處理他們。其實并不需要如此頻繁地發布這些數據,最好是以一個穩定的速率如10Hz來發布。 可以通過以下代碼來實現。
#!/usr/bin/env?python?import?rospy?from?sensor_msgs.msg?import?Joy?from?geometry_msgs.msg?import?Twist?from?functools?import?partial?def?joy_callback(cmd_vel,?data):?#?modified?cmd_vel.linear.x?=?data.axes[1]?cmd_vel.angular.z?=?data.axes[0]?#?moved?pub.publish(cmd_vel)?to?main?loop?def?main():?rospy.init_node('teleop')?cmd_vel?=?Twist()?#?new?pub?=?rospy.Publisher('cmd_vel',?Twist,?queue_size=1000)?rospy.Subscriber('joy',?Joy,?partial(joy_callback,?cmd_vel))?#?modified?rate?=?rospy.Rate(10)?#?new?while?not?rospy.is_shutdown():?pub.publish(cmd_vel)?#?new?rate.sleep()?#?new?if?__name__?==?'__main__':?main()我們修改了回調函數以便接收可變的Twist對象并且在循環中作了修改。來自rospy.Rate的sleep函數維護了一個穩定的輸出頻率。
最后的代碼將會導致/cmd_vel主題以10Hz來獲得速度命令,以模擬_Robot Steering_ ···rqt```插件的輸出。
下一篇:[譯]機器人操作系統簡介:終極機器人應用框架(下)
------------------------ ? ?
本作品采用知識共享署名-非商業性使用-相同方式共享 3.0 未本地化版本許可協議進行許可。
本文翻譯作者為:dogstar,發表于艾翻譯(itran.cc);歡迎轉載,但請注明出處,謝謝!
轉載于:https://my.oschina.net/dogstar/blog/631616
總結
以上是生活随笔為你收集整理的[译]机器人操作系统简介:终极机器人应用框架(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: openstack nova-netwo
- 下一篇: 第6周 搜索与排序