zoukankan      html  css  js  c++  java
  • stage_ros的world文件配置方法

    官方文档参阅:http://rtv.github.io/Stage/modules.html

    stage_ros是一个基于stage的2D模拟器,用于ROS的仿真测试。虽然现在越来越多的人在使用gazebo,但是在很多轻量测试领域,stage_ros仍然有一席之地。

    最常用的基于stage_ros的package是navigation_stage。它集成了对stage_ros的一些调用。但它只使用了dwa和trajactory planner,并且只有有限的几张地图,对我们的测试并不是很方便。所以我们需要制定自己的“my navigation_stage”。

    这里简单介绍一下stage_ros需要使用的world文件的配置方法。

    define block model
    (
      size [0.500 0.500 0.750]
      gui_nose 0
    )
    
    define topurg ranger
    (
      sensor(
        range_max 30.0
        fov 270.25
        samples 1081
      )
      # generic model properties
      color "black"
      size [ 0.050 0.050 0.100 ]
    )
    
    define pr2 position
    (
      size [0.650 0.650 0.250]
      origin [-0.050 0 0 0]
      gui_nose 1
      drive "omni"
      topurg(pose [ 0.275 0 0 0 ])
    )
    
    define floorplan model
    (
      # sombre, sensible, artistic
      color "gray30"
    
      # most maps will need a bounding box
      boundary 1
    
      gui_nose 0
      gui_grid 0
    
      gui_outline 0
      gripper_return 0
      fiducial_return 0
      ranger_return 1
    )
    
    # set the resolution of the underlying raytrace model in meters
    resolution 0.01
    
    interval_sim 100  # simulation timestep in milliseconds
    
    
    window
    ( 
      size [ 745.000 448.000 ] 
    
      rotate [ 0 -1.560 ]
      scale 30.287 
    )
    
    # load an environment bitmap
    floorplan
    ( 
      name "willow"
      bitmap "../maps/willow-full-0.025.pgm"
      size [58.300 45.625 1.000]
      pose [ -22.812 29.150 0 90.000 ] 
    )
    
    # throw in a robot
    pr2( pose [ -26.068 12.140 0 87.363 ] name "pr2" color "blue")
    block( pose [ -25.251 10.586 0 180.000 ] color "red")

    上面是navigation_stage里的一个示例。具体每个元素的语法请之后参阅官方文档。这里只针对文件的结构和自定义元素关系简单说明下:

    1)define block model:

    define block model
    (
      size [0.500 0.500 0.750]
      gui_nose 0
    )

    这是在定义一个块的模型,具体是做什么用的呢?现在还不知道,要读到下面才知道。这就像是定义了一个类,设置了成员变量的默认值,但还没有生成实例。

    2)define topurg ranger

    define topurg ranger
    (
      sensor(
        range_max 30.0
        fov 270.25
        samples 1081
      )
      # generic model properties
      color "black"
      size [ 0.050 0.050 0.100 ]
    )

    这是在定义一个模拟的声纳或雷达的模型,指定了雷达的最大范围等一些参数。同样,这只是“类”的定义,还没有实例。

    3) define pr2 position

    define pr2 position
    (
      size [0.650 0.650 0.250]
      origin [-0.050 0 0 0]
      gui_nose 1
      drive "omni"
      topurg(pose [ 0.275 0 0 0 ])
    )

    这是在定义机器人底盘,也可以说算是在定义一个机器人。我们可以在里面看到,它把2)中的topurg当作一个属性包含在了里面。就类似一个类中包含了类另一个类作为成员变量。从结构上我们能看出来,它是想定义一个带ranger的机器人抽象模型。

    4)define floorplan model

    define floorplan model
    (
      # sombre, sensible, artistic
      color "gray30"
    
      # most maps will need a bounding box
      boundary 1
    
      gui_nose 0
      gui_grid 0
    
      gui_outline 0
      gripper_return 0
      fiducial_return 0
      ranger_return 1
    )

    这是在为地图环境定义一个容器模型。map的地图数据是抽象的,stage_ros是不能直接使用的。所以要有一个容器把这些数据装起来,构造和模拟成一个“真实世界”,变成具体数据,然后才方便去和stage中定义的如前面的block,pr2去计算是否碰撞等。

    。如果你启动了move_base_amcl_2.5cm.launch文件的话,可以在stage的窗口中看到它,是一个红色的块

    5)world:

    # set the resolution of the underlying raytrace model in meters
    resolution 0.01
    
    interval_sim 100  # simulation timestep in milliseconds

    这是world本身属性的定义控制分辨率,模拟频率等。这里要注意一点,这个分辨率是stage本身使用的,不是map的分辨率。这个尤其重要,它主要是影响一些类似碰撞检测等stage本身的机制的。这是个坑,至于为什么,下面说到具体的模拟实例时会解释。

    6)window

    window
    ( 
      size [ 745.000 448.000 ] 
    
      rotate [ 0 -1.560 ]
      scale 30.287 
    )

    这是对显示出来的stage_ros的窗口的定义。属性基本都是在调大小,角度之类的,问题不大。唯一需要注意的是,这个size是包含了窗口状态栏的总大小,不只是地图有效区域,这个特别逗。

    7)floorplan

    floorplan
    ( 
      name "willow"
      bitmap "../maps/willow-full-0.025.pgm"
      size [58.300 45.625 1.000]
      pose [ -22.812 29.150 0 90.000 ] 
    )

    从这里开始往下就是开始生成我们自己定义的模型的实例的部分了。从这个生成定义我们可以看到,它加载了"../maps/willow-full-0.025.pgm"作为地图数据,也就是静态地图。size是怎么算的呢?用你的图片分辨率乘resolution即可。但要注意,这个resolution可不是5)中定义的那个,而是map server里定义的!这就是前面说到的坑了。整个配置文件里所有的size,pose等实际用的resolution,都是map server里的,不是这个文件本身定义的这个。包含下面的8)中也是这样。

    8)pr2 and block:

    pr2( pose [ -26.068 12.140 0 87.363 ] name "pr2" color "blue")
    block( pose [ -25.251 10.586 0 180.000 ] color "red")

    这两个就是定义我们的机器人和无用的块实例的地方了。机器人的名字被赋成了“pr2”,所以如果你在stage的窗口中用鼠标去选中它,就会显示出来这个名字了。颜色数据也在这里被赋值了,用于区分哪个是机器人,哪个是无用的块。

    PS:特别需要注意一点,地图的格式最好用jpeg。似乎是stage的代码有bug,用gif可能会完全无法正常显示,用png和pgm可能会出现地图缺失导致剩余部分被拉伸。目前测试只有jpeg是正常的。

    以上就是一个world文件的基本结构了。想要更多的配置和定义信息,可以参阅官方文件的解释。

  • 相关阅读:
    Kprobes—insight into the Linux kernel—replace kernel function with module
    Go将统治下一个十年
    linux—网络仿真开源软件—network simulator—ns
    Serval Project——Android
    CentOS7—Firefox—截图工具—fireshot插件
    Wi-Fi Direct技术
    国产CPU迷局 龙芯该如何参与市场竞争
    《深入理解Android:Wi-Fi,NFC和GPS》—android源码下载
    wifi direct—深入理解Wi-Fi P2P
    c语言学习基础:[1]开发工具介绍
  • 原文地址:https://www.cnblogs.com/qyit/p/11460331.html
Copyright © 2011-2022 走看看