A-A+

simulator_gazebo试用及问题修正

2013年03月22日 ROS 评论 2 条 阅读 47,049 次


近段时间需要仿真下四旋翼,TOP看中了ROS中的hector_quadrotor,让试下,本想这个简单。可后来却出现不少奇怪的问题。现在问题写出来供大家共同讨论。本人试用的环境是VMware 9.0.1+Ubuntu 12.04。
首先安装ROS,可以通过apt-get直接安装,安装方法见ROS官网的安装指导(要添加软件源和验证密钥)。我安装的是ros-groovy-desktop-full。接着安装stack hector_quadrotor,其要依赖common_msgsrosros_commsimulator_gazebohector_common、hector_gazebohector_models,前4个package(stack)已经随ROS一起安装。推荐用软件包的方式安装,这样后三个package就不用一个一个安装了,而且还可以节约很长的编译过程。

sudo apt-get install ros-groovy-hector-quadrotor

这样ROS环境已经弄好了。为了测试,方便起见,还要安装hector_quadrotor_apps。

sudo apt-get install ros-groovy-hector-quadrotor-apps

hector_quadrotor_apps是依赖hector_quadrotor的,所以如果要想用范例跑跑,只要通过软件包安装了范例,所有需要的就都安装了,前面的hector_quadroto也随着安装了。讲下依赖关系,方便想源码安装的同学。下面让我们跑跑范例。
运行范例前还要确认ROS的环境变量有没有设好,可以把ROS环境变量添加到用户目录的.bashrc文件中也可以直接在shell中source /opt/ros/groovy目录下的setup.bash脚本。下面运行

roslaunch hector_quadrotor_demo outdoor_flight_gazebo.launch

不知道其它同学得到什么结果,反正我的没出来gazebo的图形界面,shell还输出Msg Waiting for master...。似乎gazebo运行有点问题,其它情况未知。先看看不用ROS,直接使用gazebo。调用gazebo/script/setup.sh设置gazebo运行的环境变量并将gazebo/bin添加到$PATH变量中,先运行gzmaster,很不幸,段错误(没出现这种情况的同学跳过)。辗转半天在gazebo官网上找到答案:这是gazebo1.3的一个bug,须注释掉/etc/hosts文件中一行。

#::1 localhost ip6-localhost ip6-loopback

再运行,发现运行gzserver和gzclinet时都出现以下错误提示:

Error [Rendering.cc:37] Failed to load the Rendering engine subsystem
unable to find OpenGL rendering system. OGRE is probably installed incorrectly. Double check the OGRE cmake output, and make sure OpenGL is enabled.

又是一顿查找,终发现解决方法:在gazebo/script/setup.sh中给OGRE_RESOURCE_PATH设置正确的路径。我的是/usr/lib/i386-linux-gnu/OGRE-1.7.4。再试,终于出现图形界面了。但有时运行gzserver时会出现关于显示支持的错误,重新运行可能就好了,可能与显卡驱动有关,错误信息如下

X Error of failed request: BadDrawable (invalid Pixmap or Window parameter)
Major opcode of failed request: 55 (X_CreateGC)
Resource id in failed request: 0x4c00002
Serial number of failed request: 30
Current serial number in output stream: 32

既然gazebo的问题解决了,上ROS再试试,看还有什么问题。结果还是没有图形界面。PS一下,进程中只有gzclient,没有gzserver,仔细看看输出,日志确实只显示了一次gazebo的版权声明。查看launch文件,发现gazebo是运行靠hector_gazebo/hector_gazebo_worlds下的start.launch文件实现的。

<launch>
  <arg name="world" default=""/>
  <arg name="gui" default="true"/> 
  <param name="/use_sim_time" value="true" />
  <node name="gazebo" pkg="gazebo" type="gazebo" args="$(arg world)" respawn="false" output="screen"/> 
    <!-- start gui -->
  <group if="$(arg gui)">
    <node name="gazebo_gui" pkg="gazebo" type="gui" respawn="false" output="screen" required="true"/>
  </group>
</launch>

原来是运行的gazebo和gui。查找发现在package gazebo目录下有script/gazebo和gazebo/bin/gazebo两个同名的可执行文件。如果用rosrun gazebo gazebo的话,会提示有多个同名的可执行文件,并给出两个可执行文件的路径信息以供选择。我测试了一下,在我电脑上用roslaunch运行时其实是执行的是gazebo/bin/gazebo。为了更明白其中的原因,我查看了roslanuch的相关源码。在groovy/lib/python2.7/dist-packages/roslaunch/node_args.py文件中有个函数create_local_process_args,实现了程序完整路径的获取。代码如下:

try:
        #TODO:fuerte: pass through rospack and catkin cache
        rospack = rospkg.RosPack(rospkg.get_ros_paths(env=env))
        matches = roslib.packages.find_node(node.package, node.type, rospack)
    except rospkg.ResourceNotFound as e:
        # multiple nodes, invalid package
        raise NodeParamsException(str(e))
    if not matches:
        raise NodeParamsException("can't locate node [%s] in package [%s]"%(node.type, node.package))
    else:
        # old behavior was to take first, do we want to change this in Fuerte-style?
        cmd = matches[0]
    if not cmd:
        raise NodeParamsException("Cannot locate node of type [%s] in package [%s]"%(node.type, node.package))
    return _launch_prefix_args(node) + [cmd] + args

其中matches就是获取的程序完整路径,下面的cmd = matches[0]只取了第一条路径作为返回值,但我想运行的是第二个路径(是个脚本,实际运行的是gzserver,gui也是脚本运行的是gzclient。这两个脚本里还设置了gazebo的环境参数)。其实在ROS中用不到gazebo/bin/gazebo,为了解决程序选择错误,我只能将gazebo/bin/gazebo改名了。再运行,还是有错误:

Warning [parser.cc:361] Converting a deprecated SDF source[/opt/ros/groovy/stacks/hector_gazebo/hector_gazebo_worlds/worlds/rolling_landscape_120m.world].
Version[1.0] to Version[1.3]
Please use the gzsdf tool to update your SDF files.
$ gzsdf convert [sdf_file]
Error [Converter.cc:73] Unable to load file[]

后面还有XML元素分析错误的警告。本来gazebo是可以进行SDF文件版本的自动转换的,但是在这没有成功。没办法,只能自己改了。关于SDF文件的相关说明可以参考官网。我给出我修改后的hector_gazebo/hector_gazebo_worlds/worlds/rolling_landscape_120m.world

<?xml version="1.0" encoding="UTF-8" ?>
<sdf version="1.3">
    <world name="default">
        <scene>
            <ambient> 0.5 0.5 0.5 1 </ambient>
            <background> 0.5 0.5 0.5 1 </background>
            <shadows>false </shadows>
        </scene>
        <physics type="ode">
            <gravity> 0 0 -9.81 </gravity>
            <ode>
                <solver>
            <type>quick</type>
            <dt>0.001</dt>
            <iters>10</iters>
            <sor>1.3 </sor>
        </solver>
                <constraints>
            <cfm>0.0</cfm>
            <erp>0.2</erp>
            <contact_max_correcting_vel>10</contact_max_correcting_vel>
            <contact_surface_layer>0.001</contact_surface_layer>
        </constraints>
            </ode>
        </physics>
        <light type="directional" name="directional_light_1">
        <cast_shadows>false</cast_shadows>
            <pose>0 20 20 0.1 0.1 0</pose>
            <diffuse>1 1 1 1</diffuse>
            <specular>1 1 1 1</specular>
            <attenuation>
        <range>300</range>
        </attenuation>
            <direction>0.1 0.1 -1</direction>
        </light>
        <model name="120m_landscape_smooth_tri">
        <static>true</static>
            <link name="120m_landscape_smooth_tri_link">
                <pose>0 0 0 0 0 0</pose>
                <collision name="120m_landscape_smooth_tri_collision">
                    <geometry>
                        <mesh>
                <uri>file://opt/ros/groovy/stacks/hector_gazebo/hector_gazebo_worlds/Media/models/120m_landscape_smooth_tri.dae</uri>
                <scale>1 1 1</scale>
            </mesh>            
                    </geometry>
                </collision>
                <visual name="120m_landscape_smooth_tri">
            <cast_shadows>false</cast_shadows>
                    <geometry>
                        <mesh>
                <uri>file://opt/ros/groovy/stacks/hector_gazebo/hector_gazebo_worlds/Media/models/120m_landscape_smooth_tri.dae</uri>
                <scale>1 1 1</scale>
            </mesh>            
                    </geometry>
                </visual>
            </link>
        </model>
    </world>
</sdf>

运行一下,终于gazebo的图形界面出来了。但是还有点问题,定义的mesh文件都加载不了,模型不显示等。这些问题等我拿到二手本装个新系统看看。用虚拟机太慢了。最后说一下,在我解决问题的过程中,似乎gazebo的相关ROS packages有1-2次的更新,如果同学你没有遇到其中一部分的问题,说明他们已经修复了。PS:本来今天应该能研究下问题的,可昨天到手的二手本我给退回去了,空格键不听话,老自己触发。

标签:

2 条留言  访客:2 条  博主:0 条

  1. 高清电视棒

    分析的很透彻,很欣赏你的看法,学习了。

  2. 网上买衣服

    哈哈哈。我的天啊。太专业了,又是代码,我慢慢看吧。

给我留言

Copyright © ExBot易科机器人实验室 保留所有权利.   Theme   Robin modified by poyoten

用户登录

分享到: