天天看点

ROS 学习系列 -- Roomba, Xtion Pro机器人制作地图在Android手机无法实时观测地图

turtlebot 配合Android应用 Make a Map可以允许用户通过手机操纵机器人扫描室内地图并在手机上显示出来,效果图如下:

ROS 学习系列 -- Roomba, Xtion Pro机器人制作地图在Android手机无法实时观测地图

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”就可以看到操作界面了,摇控行走可以看到室内图片信息显示出来了,但是地图上一片空白。

ROS 学习系列 -- Roomba, Xtion Pro机器人制作地图在Android手机无法实时观测地图

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被自动列出来了,选中后就看到地图确实正确显示出来了。

ROS 学习系列 -- Roomba, Xtion Pro机器人制作地图在Android手机无法实时观测地图

3. 问题确认

安卓的Make a map到底订阅了那个主题?我们可以通过rqt_graph来查看究竟:

ROS 学习系列 -- Roomba, Xtion Pro机器人制作地图在Android手机无法实时观测地图

我们可以看出来,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,地图出来了,房间图像不见了!

ROS 学习系列 -- Roomba, Xtion Pro机器人制作地图在Android手机无法实时观测地图

再次使用rqt_graph,可以看到 /map被Android节点成功订阅到了,而且不止一个主题,还有/scan

ROS 学习系列 -- Roomba, Xtion Pro机器人制作地图在Android手机无法实时观测地图

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所用的命名空间.

版权声明:本文为博主原创文章,未经博主允许不得转载。