首页 - 文章教程 - STDR仿真 - 正文

1.初识简单的二维移动机器人群仿真器STDR

0x00 What's STDR Simulator?

1.png

STDR是Simple Two Dimentional Robot Simulator的缩写,它可以非常容易的对在二维平面移动的机器人进行仿真,STDR的设计目的不是为了像Gazebo那样的大型逼真的机器人仿真或者一个功能最全面、功能强大的仿真器,这款软件的目的是为了尽可能的简单的去模拟单个移动机器人的运动或者多个机器人的协同仿真。而且STDR不仅可以运行在一个有图形界面的环境中,还可以运行在一个无桌面环境的系统中,这样我们就可以在终端中使用ssh连接后就可以进行仿真任务了。

STDR可以完美的与ROS兼容配套,机器人上的传感器数据都是通过ros话题的形式发布。跟ROS运行一样,STDR的运行也可以将图形用户接口和服务器分开在不同的电脑上运行,而且STDR也可以和Rviz一起工作,在Rviz中将STDR中的机器人数据可视化显示。关于该仿真器的更多详细介绍可以观看其在ROS Wiki上的主页,网址如下:

http://wiki.ros.org/stdr_simulator


0x01 安装STDR仿真器

下面介绍两种安装方式,一种是最简单的使用apt来安装,另外一种下载源码后自己编译来安装,下面先介绍第一种apt安装,直接在终端中输入如下命令:

sudo apt-get install ros-$ROS_DISTRO-stdr-simulator

其中$ROS_DISTRO会根据当前安装的ROS版本来自动区分,如果安装的是indigo,那么就会被替换成indigo,如果安装的是kinetic就会被替换成kinetic,这样我就不用为了两个不同的ROS版本来写两遍安装命令了。

下面来介绍使用源码来编译安装,此方式不建议一般用户来尝试,只有当现在发布的功能已经无法满足自己的仿真需要才需要在源码基础上修改,不过要想增加自己需要的功能前提是自己对STDR源码结构需要非常了解才行,下面来介绍源码编译过程,首先从github下面源码,下载命令如下:

git clone https://github.com/stdr-simulator-ros-pkg/stdr_simulator.git

1521795632283290.png

当最后编译到达100%时整个编译过程就结束了,然后需要source devel/setup.bash这样就能保证在命令行中直接找到该仿真软件包了,通过使用下图中命令来操作来验证,只有出现下图所示的输出stdr的各项操作才能正常进行:

Screenshot from 2018-04-02 14:36:42.png


0x02 STDR代码架构介绍

在真正运行该仿真以前我们需要对该软件的实现需要有个简单的认识,这样在后面的实际运行中会了解的更加通透,首先查看一下源码目录组成:

Screenshot from 2018-03-23 17:06:45.png

在认识了各个代码目录后,需要弄清楚各代码直接是如何互相调用、协同工作来完成整个仿真任务的,了解这个简单的仿真软件实现方式非常有助于我们后对该代码的修改。


0x03 启动STDR进行仿真

对STDR有了初步的认识后,我们现在开始真正的启动来查看STDR的效果,直接在终端中输入以下命令即可启动,会自动弹出如下的窗口:

roslaunch stdr_launchers server_with_map_and_gui_plus_robot.launch

Screenshot from 2018-03-23 17:44:44.png

启动后在地图的左下角会自动的生成一个机器人,其中红色的线是雷达的扫描输出,绿色的部分是超声波的输出。我们同样可以在rviz中显示该仿真环境,使用如下命令:

roslaunch stdr_launchers rviz.launch

Screenshot from 2018-03-23 17:54:07.png

当将从上往下的视图方式修改为orbit视图方式后我们就可以来转换不同的观察视角了,那个像喇叭一样的东西就是超声波的输出。

Screenshot from 2018-03-23 18:01:53.png

接下来我们查看下当前的话题输出和服务列表,分别使用rostopic list命令和rosservice list命令即可:

Screenshot from 2018-03-23 18:06:18.png

话题和节点之间的关系图通过rqt_graph命令来查看,如下图所示:

2.png


0x04 控制机器人移动

(1)在控制机器人移动我们可以直接往控制其移动的/robot0/cmd_vel话题中发送消息即可,或者也可以使用teleop_twist_keyboard软件包来键盘遥控仿真机器人四处移动,这种控制方式跟我们在现实中控制真实的小车是一样的,这样就起到了仿真的作用,首先来使用向话题中直接的发布消息控制仿真机器人移动:

rostopic pub -r 2 /robot0/cmd_vel geometry_msgs/Twist '{linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: -0.5}}'

1521900301480098.png

当开始向话题中发布消息后就会发现仿真的机器人开始顺时针转动,这是因为在ROS中规定角速度的正方向是逆时针方向,我们在发布的消息中角速度设定为-0.5,所以就会出现顺时针运动,运动效果如下图所示。

1.gif

(2)接下来第二种方式是我们可以使用键盘来遥控仿真机器人来四处移动,首先需要下载teleop_twist_keyboard源码,下载操作步骤如下:

git clone https://github.com/ros-teleop/teleop_twist_keyboard.git

Screenshot from 2018-03-25 10-48-06.png

对于teleop_twist_keyboard.py源码修改部分主要是修改成robot0仿真机器人的速度控制话题,因为默认的发送话题名称是/cmd_vel,这样键盘控制时没办法发送到指定的/robot0/cmd_vel话题上,也就没办法来遥控机器人了,所以需要修改话题名:

Screenshot from 2018-03-25 10-53-14.png

接下来我们就可以先编译一下该软件包,然后就可以运行该控制节点来遥控仿真机器人四处走动了,首先我们需要先进入工作空间的根目录运行catkin_make来编译该软件包,然后使用source devel/setup.bash配置环境变量使该软件包可以被搜索到,接下来就可以运行如下命令来启动该节点了:

rosrun teleop_twist_keyboard teleop_twist_keyboard.py

当我们根据提示使用键盘上的按键就可以控制仿真机器人四处走动了,需要注意的是该仿真机器人对速度的处理方式为:当接收一条控制命令后会一直不断执行该命令,直到有下一条命令来改变当期的运行状态,如果想让机器人停止走动只需要按k键即可,向控制移动命令话题中发送全为0的控制命令就会让其停止移动,具体效果如下图所示:

2.gif


0x05 创建多个机器人

到现在我们一直操作的就是一个机器人,接下来我们看看如何使用该仿真器创建更多的机器人,点击STDR Simulator工具栏中的Load robot工具就会弹出可以加载的各种传感器和机器人。

Screenshot from 2018-03-25 11-28-33.png

我们现在只加载robots目录下的各种机器人,下面是机器人的列表,我们加载pandora_robot.xml这款机器人,因为它跟默认显示的机器人相同型号:

Screenshot from 2018-03-25 11-46-10.png

当选中后点击open按钮后我们就可以在STDR Simulator上来选则放置的位置了,同时如果感觉放置的位置不合适还可以通过"Move robot"来更换位置,如果想删除机器人就选择“Delete robot"即可,具体操作如下图所示

3.gif

接下来我们使用rostopic pub方式来使两个仿真机器人同时运动,下面的两条命令大家可以根据自己创建的机器人来做相应修改:

向robot0发送一条控制其顺时针旋转的命令

rostopic pub -1 /robot0/cmd_vel geometry_msgs/Twist '{linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: -0.5}}'

向robot2发送一条控制其逆时针旋转命令:

rostopic pub -1 /robot2/cmd_vel geometry_msgs/Twist '{linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0.5}}'

运动效果如下图所示:

4.gif


0x06 参考资料

[1].ROS wiki上stdr_simulator的主页[OL]. http://wiki.ros.org/stdr_simulator

[2].stdr_simulator的独立参考网址[OL]. http://stdr-simulator-ros-pkg.github.io/

[3].GitHub上stdr_simulator源码地址[OL].https://github.com/stdr-simulator-ros-pkg/stdr_simulator

[4].GitHub上teleop_twist_keyboard源码地址[OL].https://github.com/ros-teleop/teleop_twist_keyboard


0x07 问题反馈

大家在按照教程操作过程中有任何问题,可以关注ROS小课堂的官方微信公众号,在公众号中给我发消息反馈问题即可,我基本上每天都会处理公众号中的留言!当然,如果你要是顺便给ROS小课堂打个赏,我也会感激不尽的,打赏30块还会邀请进ROS小课堂的微信群与更多志同道合的小伙伴一起学习和交流!

1516851765432601.jpg

评论:

20条评论

92.31%好评

  • 1 星级:(0%)
  • 2 星级:(0%)
  • 3 星级:(0%)
  • 4 星级:(0%)
  • 5 星级:(100%)
  1. jake
    jake 发表于: 

    您好,我这里有几个问题,向咨询以下,
    1./home/he/catkin_ws/src/stdr_ws/src/hector_exploration_planner/src/hector_exploration_planner.cpp:33:48: fatal error: hector_nav_msgs/GetRobotTrajectory.h: 没有那个文件或目录
    compilation terminated.
    stdr_ws/src/hector_exploration_planner/CMakeFiles/hector_exploration_planner.dir/build.make:62: recipe for target ‘stdr_ws/src/hector_exploration_planner/CMakeFiles/hector_exploration_planner.dir/src/hector_exploration_planner.cpp.o’ failed
    2./opt/ros/melodic/include/tf/tf.h: In member function ‘ros::Duration tf::Transformer::getCacheLength()’:
    /opt/ros/melodic/include/tf/tf.h:331:43: error: ‘tf2_buffer_ptr_’ was not declared in this scope
    ros::Duration getCacheLength() { return tf2_buffer_ptr_->getCacheLength();}
    3.In file included from /opt/ros/melodic/include/ros/callback_queue.h:39:0,
    from /opt/ros/melodic/include/tf/transform_listener.h:40,
    from /home/he/catkin_ws/src/stdr_ws/src/hector_path_follower/include/hector_path_follower/hector_path_follower.h:37,
    from /home/he/catkin_ws/src/stdr_ws/src/hector_path_follower/src/hector_path_follower.cpp:32:
    /opt/ros/melodic/include/ros/internal/condition_variable.h: In member function ‘void ros::internal::condition_variable_monotonic::wait(boost::unique_lock&)’:
    /opt/ros/melodic/include/ros/internal/condition_variable.h:155:76: error: ‘>>’ should be ‘> >’ within a nested template argument list
    boost::thread_cv_detail::lock_on_exit<boost::unique_lock> guard;
    4.In file included from /home/he/catkin_ws/src/stdr_ws/src/stdr_simulator/stdr_server/include/stdr_server/map_server.h:23:0,
    from /home/he/catkin_ws/src/stdr_ws/src/stdr_simulator/stdr_server/src/map_server.cpp:22:
    /opt/ros/melodic/include/tf/tf.h:354:8: error: ‘shared_ptr’ in namespace ‘std’ does not name a template type
    std::shared_ptr getTF2BufferPtr() { return tf2_buffer_ptr_;};
    谢谢了,安装的版本为18.04问题有点多

    • admin
      admin 发表于: 

      你把hector_exploration_planner这个源码删除了再编译

  2. jake
    jake 发表于: 

    您好,博主,上午的那个问题解决了,现在又出现了一个新问题,能不能再帮我看看,谢谢了!!!
    CMake Error at /opt/ros/melodic/share/catkin/cmake/catkinConfig.cmake:83 (find_package):
    Could not find a package configuration file provided by “hector_nav_msgs”
    with any of the following names:
    hector_nav_msgsConfig.cmake
    hector_nav_msgs-config.cmake

    • admin
      admin 发表于: 

      这样问题都类似,应该是你没有安装hector_nav_msgs这个软件包,使用命令安装:sudo apt install ros-melodic-hector-nav-msgs

  3. jake
    jake 发表于: 

    您好,我下载了仓库的melodic版本的stdr,放在catkin_ws/src目录下,然后编译有错误通过,
    错误为:CMake Error at /opt/ros/melodic/share/catkin/cmake/catkinConfig.cmake:83 (find_package):
    Could not find a package configuration file provided by “costmap_2d” with
    any of the following names:

    costmap_2dConfig.cmake
    costmap_2d-config.cmake,这个应该怎么解决呢

    • admin
      admin 发表于: 

      应该是你没有安装costmap-2d这个软件包,使用命令安装:sudo apt install ros-melodic-costmap-2d

  4. jake
    jake 发表于: 

    CMake Error at /opt/ros/melodic/share/catkin/cmake/catkinConfig.cmake:83 (find_package):
    Could not find a package configuration file provided by “costmap_2d” with
    any of the following names:
    costmap_2dConfig.cmake
    costmap_2d-config.cmake

  5. jake
    jake 发表于: 

    您好,我下载了仓库的melodic版本的stdr,放在catkin_ws/src目录下,然后编译有错误通过,

  6. label
    label 发表于: 

    我下載了您代碼倉庫的源碼,並編譯,但是編譯報了一些C++編譯錯誤,我搜索相關解釋,有可能是版本原因,那您倉庫的代碼是否支持melodic,您是否編譯成功過。
    錯誤如下:
    /home/laybel/stdr_ws/src/hector_exploration_planner/src/hector_exploration_planner.cpp: In member function ‘bool hector_exploration_planner::HectorExplorationPlanner::doInnerExploration(const PoseStamped&, std::vector<geometry_msgs::PoseStamped_<std::allocator > >&)’:
    /home/laybel/stdr_ws/src/hector_exploration_planner/src/hector_exploration_planner.cpp:286:45: error: no matching function for call to ‘costmap_2d::Costmap2DROS::getRobotPose(tf::Stamped&)’
    if(!costmap_ros_->getRobotPose(robotPose)){
    ^
    In file included from /home/laybel/stdr_ws/src/hector_exploration_planner/include/hector_exploration_planner/hector_exploration_planner.h:34:0,
    from /home/laybel/stdr_ws/src/hector_exploration_planner/src/hector_exploration_planner.cpp:29:
    /opt/ros/melodic/include/costmap_2d/costmap_2d_ros.h:125:8: note: candidate: bool costmap_2d::Costmap2DROS::getRobotPose(geometry_msgs::PoseStamped&) const
    bool getRobotPose(geometry_msgs::PoseStamped& global_pose) const;
    ^~~~~~~~~~~~
    /opt/ros/melodic/include/costmap_2d/costmap_2d_ros.h:125:8: note: no known conversion for argument 1 from ‘tf::Stamped’ to ‘geometry_msgs::PoseStamped& {aka geometry_msgs::PoseStamped_<std::allocator >&}’
    /home/laybel/stdr_ws/src/hector_exploration_planner/src/hector_exploration_planner.cpp: In member function ‘bool hector_exploration_planner::HectorExplorationPlanner::exploreWalls(const PoseStamped&, std::vector<geometry_msgs::PoseStamped_<std::allocator > >&)’:
    /home/laybel/stdr_ws/src/hector_exploration_planner/src/hector_exploration_planner.cpp:714:50: error: call of overloaded ‘abs(unsigned int)’ is ambiguous
    if(abs(thisDelta – p_min_obstacle_dist_) < minDelta){
    ^

    • admin
      admin 发表于: 

      可以先把hector相关的那三个软件包源码删掉再编译,当时是想做一些hector算法开发,没有开发好,代码就留在那里了

  7. orchid
    orchid 发表于: 

    怎么发送指令让机器人移动一定的距离啊?比如两米???

    • admin
      admin 发表于: 

      这个需要监控机器人的odom的tf与小车base link的tf的坐标转换,查询反馈回来的x,y坐标,然后根据坐标值来计算出移动的距离,这样就可以控制机器人走任意距离了

      • orchid
        orchid 发表于: 

        前辈可以指导一下,看看什么相关资料可以在stdr上面模拟出来吗?

        • admin
          admin 发表于: 

          你先看看turtlebot的仿真吧,很多资料可以参考,那个能跑通了,这个stdr也就可以了

  8. cm
    cm 发表于: 

    大佬,为什么我的rosrun teleop_twist_keyboard teleop_twist_keyboard.py命令可以在黑窗口中显示数据,但是机器人不会法师移动?

    • admin
      admin 发表于: 

      可以使用rqt_graph查看一下话题和节点之间连接图,看下话题和节点是否连接正确。同时查看下cmd_vel是否收到了键盘遥控发送过来的移动命令

  9. sanming
    sanming 发表于: 

    你好,请问melodic的ROS如何安装stdr_simulator?
    我使用apt安装提示找不到安装包,“E: Unable to locate package ros-melodic-stdr-simulator”;
    在git-hub里没有melodic的分支。

    • admin
      admin 发表于: 

      可以在我们的代码仓库中下载所有的代码,https://code.corvin.cn/corvin_zhang/stdr_ws

      • cm
        cm 发表于: 

        下载的stdr_ws文件是放在什么路径使用啊

        • admin
          admin 发表于: 

          它本身就是一个ROS工作区,放在任何路径下都可以用。不用再把它放在catkin_ws的src目录下了,它跟catkin_ws是平级的

jake进行回复 取消回复