ROS仿真环境中实现自主导航
在看完自主导航小车实践的教程(自主导航小车实践)后,很多小伙伴留言说,在学习自主导航小车的时候手上没有合适的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仿真环境中实现自主导航相关推荐
- PID算法在ROS仿真环境中的理论及应用(ROS_F1TENTH)
一.需求: 在F1TENTH 仿真环境simulator中,使用PID算法实现无人车沿墙走wall_following 源码链接:https://github.com/Grizi-ju/ros_pro ...
- gazebo仿真环境中添加robotiq 2f 140的gripper_controller控制器
gazebo仿真环境中添加robotiq 2f 140的gripper_controller控制器 搭建环境: ubuntu: 20.04 ros: Nonetic sensor: robotiq_f ...
- Ubuntu18.04搭建AirSim+ROS仿真环境
AIRSIM在UBuntu 18.04上构建的官网文档 一.安装UE4引擎 AIRSIM是依赖于UE4引擎实现的,因此在安装AIRSIM之前要安装UE4引擎. 1.获取UE4的github许可 在Ub ...
- 数据不够,Waymo用GAN来凑:生成逼真相机图像,在仿真环境中训练无人车模型...
鱼羊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 疫情当下,Waymo等自动驾驶厂商暂时不能在现实世界的公共道路上进行训练.测试了. 不过,工程师们还可以在GTA,啊不,在仿真环境里接着跑车 ...
- RRT* 算法原理以及在二维仿真环境中的实现 -- Python代码实现
RRT* 算法是在 RRT 的基础上做出了一些改进,主要改进的点有两点: 新结点生成后,优化其父结点. 在生成新结点 new_node 后,首先设置一个搜索区域的半径,搜索该区域中的树结点,并计算其中 ...
- RRT路径规划算法在二维仿真环境中的应用 -- Python代码实现
在上一节中,介绍了 RRT 算法的原理,这一节将一步步实现 RRT 路径规划算法在二维环境中的路径规划,来进一步加深对 RRT 算法的理解. 二维环境的搭建 我们将搭建下图所示的二维环境,绿色点为起点 ...
- Dijkstra 路径规划算法在二维仿真环境中的应用 -- Python代码实现
在上一节中,介绍了 Dijkstra 算法的原理以及在图中的应用,这一节将一步步实现 Dijkstra 路径规划算法在二维环境中的路径规划,来进一步加深对 Dijkstra 算法的理解. 所需要用到的 ...
- 使用MoveIt!控制Gazebo仿真环境中的UR 10机械臂
参考资料:https://www.youtube.com/watch?v=j6bBxfD_bYs 1. 下载ROS-Industrial universal robot meta-package cd ...
- 如何在gazebo仿真环境中给sumit_xl模型添加多线激光雷达
一 :下载以sumit_xl模型 $ cd ~/catkin_ws/src $ git clone https://TheConstruct@bitbucket.org/theconstructcor ...
最新文章
- exe4j中this executable was created with an evaluation错误解决方法
- app测试流程和重点_APP开发测试流程是怎么样的?
- [gist]Android SHA-1
- 微信小程序禁止页面上下滑动;uni-app微信小程序禁止页面上下滑动;uni-app小程序上下滑动;
- 于掌控板实现简单的抢答器系统
- LightGBM源码如何计算增益
- 分布式事务框架 - Seata
- docker 容器中设置 mysql lampp php软链接
- 郭盛华为什么被称为国民校长?到底有什么来历?
- flv转mp4,电脑视频flv怎么批量转mp4格式
- 电脑显示黑屏但是鼠标能动怎么处理?
- 微软Project Europe或将帮助Win10应用开发
- 2022整理国内免费CDN合集
- 微信小程序 实现换肤功能
- 利用screen命令将程序挂在linux后台
- SAP MM批量删除采购申请、采购订单
- javaweb登录验证码的实现
- HTML静态网页设计基础
- JavaScript的压缩工具
- 利用MATLAB中 MuPADNotebook组件将程序语言表达式转为数学表达式
热门文章
- 刚刚:魅族PANDAER妙磁背甲让iPhone 13满血,《原神》稳定60帧
- spring相关:spring介绍与两大核心容器
- 2021-03-27 深度信念网络(DBN)学习笔记
- [技术杂谈]常用远程工具下载各个平台操作系统
- 传图取字:微信小程序自动把图片上的文字提取出来
- 高考倒计时1天 | 百度数字人“考生”度晓晓将挑战高考作文
- java itext 生成word文档
- 计算机专业实践体会,计算机专业毕业实习心得体会
- 金工如何运用计算机思维,金工的实习心得体会
- java实现单一登录 踢人效果