turtlebot 配合Android應用 Make a Map可以允許使用者通過手機操縱機器人掃描室内地圖并在手機上顯示出來,效果圖如下:
ROS機器人與安卓裝置的通訊協作是通過rocon實作的,細節這裡不作描述。本文适合已經對該技術非常熟悉的人閱讀。
1. 問題描述
下載下傳安卓rocon remocon和Make a map并安裝,在turtlebot上啟動機器人:
$ roslaunch turtlebot_bringup minimal.launch
該指令可以啟動turtlebot的輪子驅動并加在Android interaction 應用rapps. 該指令可以成功啟動的前提條件是正确配置的硬體環境變量,把roomba和XTion pro Live指定給ROS.
接下來在安卓終端打開Rocon remocon應用,添加一個master URI,把turtlebot的IP輸入,這時就可以看到該節點資訊了,點選進入後選擇角色”Android pair”. 就可以看到大量的應用,啟動”Make a map”就可以看到操作界面了,搖控行走可以看到室内圖檔資訊顯示出來了,但是地圖上一片空白。
2. 問題分析
首先檢視地圖資料到底生産沒有,地圖應該是由 /map 主題釋出出來的,這時候我們看一些該主題:
$ rostopic echo /map
發現居然沒有任何資料,不甘心--列出所有主題:
$ rostopic list
詭異的結果出現了,你會發現大部分的topic都被加了一個字首:”turtlebot”. 地圖資料很可能釋出到了”/turtlebot/map”上了:
rostopic echo /turtlebot/map
資料嘩嘩的不停的更新了,我的眼淚也嘩嘩的流啊,NND這是毛情況?先不管這個,我們要驗證一下地圖資料到底對不對,使用rviz:
$ roslaunch turtlebot_rviz_launchers view_navigation.launch
上來就看到warning: No map received, 點選topic下拉框,看到/turtlebot/map被自動列出來了,選中後就看到地圖确實正确顯示出來了。
3. 問題确認
安卓的Make a map到底訂閱了那個主題?我們可以通過rqt_graph來檢視究竟:
我們可以看出來,android那邊隻使用了一個主題”/teleop/compressed_image”,也就是圖像資料,沒有map資料被訂閱的痕迹,看來就是這個”/turtlebot”字首搞的鬼了。
懷疑是rocon通過 .rapp啟動一個.launch檔案的時候,這個綴搞被自動加上了,試一下手工啟動. 這需要禁止ros在點選安卓應用後啟動.launch檔案。
$ roscd turtlebot_rapps
$ sudo gedit rapps/make_a_map/make_a_map.rapp
把launch項去掉後,儲存退出:
display: Make A Map
description: Make a map by driving a TurtleBot from an Android device.
compatibility: rocon:/turtlebot
public_interface: make_a_map.interface
icon: make_a_map_bubble_icon.png
将安卓終端的Make a map點選”back”退出,在rocon中點選’leave’離開該Master節點, 關閉turtlebot上的Master,并重新啟動:
$ roslaunch turtlebot_bringup minimal.launch
在另外一個terminal手工啟動make a map:
$ roslaunch turtlebot_rapps make_a_map.launch
這個時候在安卓終端打開rocon remocon啟動Map a map,地圖出來了,房間圖像不見了!
再次使用rqt_graph,可以看到 /map被Android節點成功訂閱到了,而且不止一個主題,還有/scan
4. 結論
安卓應用Make a map 需要訂閱的主題為:
圖像資料:/teleop/compressed_image
地圖資料:/map
雷射掃描: /scan
而通過remocon啟動程式後真正的資料主題為:
圖像資料:/teleop/compressed_image
地圖資料:/turtlebot/map
雷射掃描: /turtlebot/scan
5. 解決方案
需要完成下面的主題映射:
/turtlebot/map –> /map
/turtlebot/scan –> /scan
在 turtlebot_rapp 的make_a_map.launch 檔案裡面添加映射指令. 先找到該檔案nano編輯
roscd turtlebot_rapps/rapps/make_a_map/
sudo nano make_a_map.launch
加入以下兩個指令:
<node pkg="topic_tools" name="map_relay" type="relay" args="map /map" />
<node pkg="topic_tools" name="scan_relay" type="relay" args="scan /scan" />
注意這裡的參數千萬不要帶字首’turtlebot’,而是使用相對路徑’map’ ‘scan’ ,而映射目标主題要寫明絕對路徑’/map’ ‘/sacn’.
因為這個launch檔案就被放到了’turtlebot’命名空間裡面了,相對路徑會被自動補全--前面加上命名空間
6. 後記--’turtlebot’命名空間哪裡來的?
ROS預設就有一個環境變量 TURTLEBOTNAME=turtlebot.該環境變量被經由minimal.launch−−>standalone.launch−−> (find rocon_app_manager)/launch/includes/_app_manager.xml 一直傳遞進 rapp_manager.py 裡面。該程式負責啟動romocon對應的rapp launch檔案,檢視函數_process_start_app(self, req)
rospy.loginfo("Rapp Manager : starting app '" + req.name + "' underneath " + self._application_namespace)
resp.started, resp.message, subscribers, publishers, services, action_clients, action_servers = \
rapp.start(self._application_namespace,
self._gateway_name,
self._rocon_uri,
req.remappings,
req.parameters,
self._param['app_output_to_screen'],
self._param['simulation'],
self.caps_list)
每次啟動的所有程式都被放到了命名空間裡面,這裡的self._application_namespace就是robot_name參數的值。
rospy.loginfo()的内容可以通過檢視 /rosout 這個主題觀察,驗證每次啟動rapp所用的命名空間.
版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。