在看完自主导航小车实践的教程(自主导航小车实践)后,很多小伙伴留言说,在学习自主导航小车的时候手上没有合适的ROS机器人底盘做实验,缺少动手操作的机会,学习不深刻。对于底盘问题,我们也分享过一个制作麦克纳姆轮底盘的教程,手头有材料的同学可以参考参考(ROS麦克纳姆轮底盘制作)。
这里还有另外一种方式解决底盘的问题,我们可以通过ROS提供的仿真环境来理解这个自主导航小车的框架,ROS中提供有很多的机器人的仿真模型比如说pr2、turtlebot、turtlebot3等机器人,仿真环境有gazebo和stage等环境。那么有小伙伴可能会问:仿真环境中的机器人与实际机器人控制起来差别大吗?ROS提供的仿真机器人模型与实际机器人差异很小,基本上可以达到仿真环境的效果,如果使用好一点的激光雷达,建图的效果可能会更好。为了解决在理解自主导航小车框架时,没有实际机器人操作这个问题。我们整理一个利用turtlebot的仿真模型实现自主导航小车的教程。

我们发现一个真实的ROS底盘主要有三个功能:

  • 1、接收“/cmd_vel”这个话题的控制数据
  • 2、发布odom里程计数据
  • 3、提供激光雷达或者视觉相机的数据 /scan

因此,只要我们使用仿真环境中的机器人接收“/cmd_vel”话题数据,控制仿真环境中的机器人运动,同时接收仿真机器人发布的odom里程计话题和激光雷达数据,这样就可以用仿真模型“替代”一个真实世界的机器人。

讲解完思路以后,我们开始实际操作环节(系统环境 Ubuntu 1604 + ROS Kinect 代码)。

1、turtlebot stage 仿真环境

ROS常用的仿真环境有gazebo和stage两种,gazebo更加的强大,但是在虚拟机上运行不顺畅。这里我们首先介绍利用stage 仿真环境来一步一步的配置自主导航小车的每一个环节,在第二部分介绍使用gazebo来仿真。

1.1 stage环境安装

首先,通过以下命令行安装运行依赖项:

sudo apt-get install ros-kinetic-turtlebot-gazebo
sudo apt-get install ros-kinetic-turtlebot-simulator

安装完毕以后我们使用如下命令启动turtlebot stage仿真环境,先直观感受一下stage仿真环境和自主导航这个功能

 roslaunch turtlebot_stage turtlebot_in_stage.launch

启动stage仿真以后我们会看到如下界面:

一个是我们熟悉的RVIZ的界面,另外一个是turtlebot的stage仿真环境,如果你不喜欢2D的视角,我们可以选择stage窗口中的 view-> perspective camera 将视角切换成3D视角。


我们点击RVIZ中的 “2D Nav Goal” 设定一个目标点就可以让小车自动运行到这个点了(高清)

turtlebot

我们现在来看看这个单独配置stage节点、gmapping建图节点、导航节点。其实这些在turtlebot_stage 包中的 turtlebot_in_stage.launch 文件中都有描述,你也可以直接看这个launch文件。

1.2 turtlebot 仿真环境中gmapping 建图

1 我们在catkin_ws/src 目录下创建一个包来存放我们实验的文件:

catkin_create_pkg my_turtlebot_nav roscpp rospy std_msgs
cd my_turtlebot_nav
mkdir launch
cd launch

2 接下来我们在launch文件夹下面创建一个名为“turtlebot_stage.launch” 的文件,并填入以下内容:

<?xml version="1.0"?>
<launch><arg name="base"       default="$(optenv TURTLEBOT_BASE kobuki)"/>  <!-- create, rhoomba --><arg name="stacks"     default="$(optenv TURTLEBOT_STACKS hexagons)"/>  <!-- circles, hexagons --><arg name="3d_sensor"  default="$(optenv TURTLEBOT_3D_SENSOR kinect)"/>  <!-- kinect, asus_xtion_pro --><!-- Name of the map to use (without path nor extension) and initial position --><arg name="map_file"       default=" $(env TURTLEBOT_STAGE_MAP_FILE)"/> <!-- robopark_plan --><arg name="world_file"     default=" $(env TURTLEBOT_STAGE_WORLD_FILE)"/><arg name="initial_pose_x" default="2.0"/><arg name="initial_pose_y" default="2.0"/><arg name="initial_pose_a" default="0.0"/><param name="/use_sim_time" value="true"/><!--  ******************** Stage ********************  --><node pkg="stage_ros" type="stageros" name="stageros" args="$(arg world_file)"><param name="base_watchdog_timeout" value="0.5"/><remap from="odom" to="odom"/><remap from="base_pose_ground_truth" to="base_pose_ground_truth"/><remap from="cmd_vel" to="mobile_base/commands/velocity"/><remap from="base_scan" to="scan"/></node><!--  ***************** Robot Model *****************  --><include file="$(find turtlebot_bringup)/launch/includes/robot.launch.xml"><arg name="base" value="$(arg base)" /><arg name="stacks" value="$(arg stacks)" /><arg name="3d_sensor" value="$(arg 3d_sensor)" /></include><node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher"><param name="use_gui" value="true"/></node><!-- Command Velocity multiplexer --><node pkg="nodelet" type="nodelet" name="mobile_base_nodelet_manager" args="manager"/><node pkg="nodelet" type="nodelet" name="cmd_vel_mux" args="load yocs_cmd_vel_mux/CmdVelMuxNodelet mobile_base_nodelet_manager"><param name="yaml_cfg_file" value="$(find turtlebot_bringup)/param/mux.yaml"/><remap from="cmd_vel_mux/output" to="mobile_base/commands/velocity"/></node></launch>

3 启动刚刚创建的launch文件

cd catkin_ws/
source devel/setup.bash
roslaunch my_turtlebot_nav turtlebot_stage.launch

相比于我们刚刚用的演示的demo,现在只有一个stage窗口启动的,没有其他的导航节点启动。这就相当于我们启动机器人的底盘是一样的。这里我们测试用turtlebot自带的键盘遥控节点测试 是否可以用个键盘控制仿真环境中的机器人移动

4 新建一个窗口输入以下命令

roslaunch turtlebot_teleop keyboard_teleop.launch

这时候通过 “i,u, o, k” 建即可控制机器人移动,这里相当于是我们启动了一个方正的turtlebot 机器人,这个机器人运行在一个’房间‘里面这个机器人可以接受cmd_vel话题的数据,同时发布里程计数据和机器人身上的激光传感器的数据。激光的数据可以通过rostopic list 等命令进行查看

5 有了这样一个机器人,我们利用机器人携带的激光传感器进行建图工作,这里方便简单我们使用我们熟悉的gmapping建图的方式。新建一个名为gmapping.launch的文件,填入以下内容:

<?xml version="1.0"?>
<launch><arg name="scan_topic" default="scan" /><node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen"><param name="odom_frame" value="odom"/><param name="base_frame" value="base_link"/><param name="map_frame" value="map"/><!-- Process 1 out of every this many scans (set it to a higher number to skip more scans)  --><param name="throttle_scans" value="1"/><param name="map_update_interval" value="5.0"/> <!-- default: 5.0 --><!-- The maximum usable range of the laser. A beam is cropped to this value.  --><param name="maxUrange" value="5.0"/><!-- The maximum range of the sensor. If regions with no obstacles within the range of the sensor should appear as free space in the map, set maxUrange < maximum range of the real sensor <= maxRange --><param name="maxRange" value="10.0"/><param name="sigma" value="0.05"/><param name="kernelSize" value="1"/><param name="lstep" value="0.05"/><param name="astep" value="0.05"/><param name="iterations" value="5"/><param name="lsigma" value="0.075"/><param name="ogain" value="3.0"/><param name="minimumScore" value="0.0"/><!-- Number of beams to skip in each scan. --><param name="lskip" value="0"/><param name="srr" value="0.01"/><param name="srt" value="0.02"/><param name="str" value="0.01"/><param name="stt" value="0.02"/><!-- Process a scan each time the robot translates this far  --><param name="linearUpdate" value="0.1"/><!-- Process a scan each time the robot rotates this far  --><param name="angularUpdate" value="0.05"/><param name="temporalUpdate" value="-1.0"/><param name="resampleThreshold" value="0.5"/><!-- Number of particles in the filter. default 30        --><param name="particles" value="10"/><!-- Initial map size  --><param name="xmin" value="-10.0"/><param name="ymin" value="-10.0"/><param name="xmax" value="10.0"/><param name="ymax" value="10.0"/><!-- Processing parameters (resolution of the map)  --><param name="delta" value="0.02"/><param name="llsamplerange" value="0.01"/><param name="llsamplestep" value="0.01"/><param name="lasamplerange" value="0.005"/><param name="lasamplestep" value="0.005"/><remap from="scan" to="$(arg scan_topic)"/></node>
</launch>

6 接下来我们分别打开三个终端,启动stage节点、和gmapping节点利用遥控器遥控turtlebot移动,扫描环境中的地图

roslaunch my_turtlebot_nav turtlebot_stage.launch
roslaunch turtlebot_teleop keyboard_teleop.launch
roslaunch my_turtlebot_nav gmapping.launch

通过键盘的 “i,u, o, k” 建控制机器人在房间里面移动,扫描地图。(实际扫描了几次,发现这个gmapping在机器人旋转的时候就会出现地图变形的情况,还不如在实物上跑的效果好。估计是由于这个仿真环境是把Kinect的数据弄成激光数据的缘故,而我们实际使用的激光雷达都是360度的),下面是几次里面比较好的地图了┭┮﹏┭┮

高清视频

turtlebot建图

7 用map_server保存地图:

rosrun map_server map_saver -f test

这时候可以看到当前目录下存在以“test”开头的两个文件

1.3 turtlebot 仿真环境中导航

创建文件 turtlebot_navigation.launch 并填入以下内容:

<?xml version="1.0"?>
<launch><arg name="initial_pose_x" default="2.0"/><arg name="initial_pose_y" default="2.0"/><arg name="initial_pose_a" default="0.0"/><!--  ************** Navigation  ***************  --><include file="$(find my_turtlebot_nav)/launch/include/move_base.launch.xml"/><!--  ****** Maps *****  --><arg name="map_file" default="$(find my_turtlebot_nav)/map/maze.yaml"/><node name="map_server" pkg="map_server" type="map_server" args="$(arg map_file)"><param name="frame_id" value="/map"/></node><include file="$(find my_turtlebot_nav)/launch/include/amcl.launch.xml"><arg name="scan_topic" value="scan"/><arg name="use_map_topic" value="true"/><arg name="initial_pose_x" value="$(arg initial_pose_x)"/><arg name="initial_pose_y" value="$(arg initial_pose_y)"/><arg name="initial_pose_a" value="$(arg initial_pose_a)"/></include><!--  **************** Visualisation ****************  --><node name="rviz" pkg="rviz" type="rviz" args="-d $(find my_turtlebot_nav)/rviz/robot_navigation.rviz"/>
</launch>

这里AMCL和move_base是单独的文件进行配置的,我把我所用的包都放在了这个github地址上,你可以直接down下来,或者从turtlebot_navigation 这个包里面直接拷贝过来

roslaunch my_turtlebot_nav turtlebot_stage.launch
roslaunch my_turtlebot_nav turtlebot_navigation.launch

用RVIZ中的 “2D Nav Goal” 设定一个目标点就可以让小车自动运行到目标点了,高清视频链接

turtlebot-move-base

2、gazebo 仿真环境

基于前面介绍的stage仿真环境,这里我们首先介绍如何利用gazebo仿真环境来一步一步的配置自主导航小车的每一个环节。

1、安装依赖项:

sudo apt-get install ros-kinetic-turtlebot
sudo apt-get install ros-kinetic-turtlebot-*

2、启动turtlebot Gazebo仿真节点,即可看到如下界面

roslaunch turtlebot_gazebo turtlebot_world.launch


(注意:如果你发现你的gazebo没法打开,这可能是你下载的模型包不完整,可以参考“ROS下gazebo不能加载模型文件”这篇博客修改)
3、作为测试仿真环境是否正常工作,我们同样使用turtlebot的键盘包来测试gazebo仿真模型是否可以接受到“cmd_vel”这个话题的数据。
启动键盘遥控节点

roslaunch turtlebot_teleop keyboard_teleop.launch

启动turtlebot Gazebo仿真节点

roslaunch turtlebot_gazebo turtlebot_world.launch

到这里我们基本上已经实现了用gazebo来模拟一个机器人底盘,上层的组件按照我们在stage环境中配置好的文件,可直接使用。(注意:需要重新建图,并更换AMCL中的地图文件

这个任务就留给大家当做作业吧:

  • 1、用我们刚刚配置的 my_turtlebot_nav 包来控制gazebo中的turtlebot,实现2D导航
  • 2、ROS stage 仿真与gazebo仿真有什么不一样的?
  • 3、gazeboz中使用不同世界模型文件

如果你github 上下载代码失败,可以在评论区留下邮箱,我看到以后会发送到你的邮箱里面。

欢迎做自主导航小车的小伙伴一起讨论,cenruping@vip.qq.com

ROS仿真环境中实现自主导航相关推荐

  1. PID算法在ROS仿真环境中的理论及应用(ROS_F1TENTH)

    一.需求: 在F1TENTH 仿真环境simulator中,使用PID算法实现无人车沿墙走wall_following 源码链接:https://github.com/Grizi-ju/ros_pro ...

  2. gazebo仿真环境中添加robotiq 2f 140的gripper_controller控制器

    gazebo仿真环境中添加robotiq 2f 140的gripper_controller控制器 搭建环境: ubuntu: 20.04 ros: Nonetic sensor: robotiq_f ...

  3. Ubuntu18.04搭建AirSim+ROS仿真环境

    AIRSIM在UBuntu 18.04上构建的官网文档 一.安装UE4引擎 AIRSIM是依赖于UE4引擎实现的,因此在安装AIRSIM之前要安装UE4引擎. 1.获取UE4的github许可 在Ub ...

  4. 数据不够,Waymo用GAN来凑:生成逼真相机图像,在仿真环境中训练无人车模型...

    鱼羊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 疫情当下,Waymo等自动驾驶厂商暂时不能在现实世界的公共道路上进行训练.测试了. 不过,工程师们还可以在GTA,啊不,在仿真环境里接着跑车 ...

  5. RRT* 算法原理以及在二维仿真环境中的实现 -- Python代码实现

    RRT* 算法是在 RRT 的基础上做出了一些改进,主要改进的点有两点: 新结点生成后,优化其父结点. 在生成新结点 new_node 后,首先设置一个搜索区域的半径,搜索该区域中的树结点,并计算其中 ...

  6. RRT路径规划算法在二维仿真环境中的应用 -- Python代码实现

    在上一节中,介绍了 RRT 算法的原理,这一节将一步步实现 RRT 路径规划算法在二维环境中的路径规划,来进一步加深对 RRT 算法的理解. 二维环境的搭建 我们将搭建下图所示的二维环境,绿色点为起点 ...

  7. Dijkstra 路径规划算法在二维仿真环境中的应用 -- Python代码实现

    在上一节中,介绍了 Dijkstra 算法的原理以及在图中的应用,这一节将一步步实现 Dijkstra 路径规划算法在二维环境中的路径规划,来进一步加深对 Dijkstra 算法的理解. 所需要用到的 ...

  8. 使用MoveIt!控制Gazebo仿真环境中的UR 10机械臂

    参考资料:https://www.youtube.com/watch?v=j6bBxfD_bYs 1. 下载ROS-Industrial universal robot meta-package cd ...

  9. 如何在gazebo仿真环境中给sumit_xl模型添加多线激光雷达

    一 :下载以sumit_xl模型 $ cd ~/catkin_ws/src $ git clone https://TheConstruct@bitbucket.org/theconstructcor ...

最新文章

  1. exe4j中this executable was created with an evaluation错误解决方法
  2. app测试流程和重点_APP开发测试流程是怎么样的?
  3. [gist]Android SHA-1
  4. 微信小程序禁止页面上下滑动;uni-app微信小程序禁止页面上下滑动;uni-app小程序上下滑动;
  5. 于掌控板实现简单的抢答器系统
  6. LightGBM源码如何计算增益
  7. 分布式事务框架 - Seata
  8. docker 容器中设置 mysql lampp php软链接
  9. 郭盛华为什么被称为国民校长?到底有什么来历?
  10. flv转mp4,电脑视频flv怎么批量转mp4格式
  11. 电脑显示黑屏但是鼠标能动怎么处理?
  12. 微软Project Europe或将帮助Win10应用开发
  13. 2022整理国内免费CDN合集
  14. 微信小程序 实现换肤功能
  15. 利用screen命令将程序挂在linux后台
  16. SAP MM批量删除采购申请、采购订单
  17. javaweb登录验证码的实现
  18. HTML静态网页设计基础
  19. JavaScript的压缩工具
  20. 利用MATLAB中 MuPADNotebook组件将程序语言表达式转为数学表达式

热门文章

  1. 刚刚:魅族PANDAER妙磁背甲让iPhone 13满血,《原神》稳定60帧
  2. spring相关:spring介绍与两大核心容器
  3. 2021-03-27 深度信念网络(DBN)学习笔记
  4. [技术杂谈]常用远程工具下载各个平台操作系统
  5. 传图取字:微信小程序自动把图片上的文字提取出来
  6. 高考倒计时1天 | 百度数字人“考生”度晓晓将挑战高考作文
  7. java itext 生成word文档
  8. 计算机专业实践体会,计算机专业毕业实习心得体会
  9. 金工如何运用计算机思维,金工的实习心得体会
  10. java实现单一登录 踢人效果