借助ROS的工具箱让turtlebot在gazebo中运行起来.
1. 在gazebo中显示机器人
roslaunch turtlebot_gazebo turtlebot_world.launch
默认加载了一个playground 的world文件.
2. 用键盘进行控制机器人
roslaunch turtlebot_teleop keyboard_teleop.launch --screen Moving around: u i o j k l m , . q/z : increase/decrease max speeds by 10% w/x : increase/decrease only linear speed by 10% e/c : increase/decrease only angular speed by 10% space key, k : force stop anything else : stop smoothly
可以通过以上方式控制机器人的运动了.
3. 在rviz中显示
roslaunch turtlebot_rviz_launchers view_robot.launch --screen
在rviz的现实中,为了便于显示我只添加了camera rgb图像 (topic: /camera/rgb/image_raw)和 PointCloud2 (topic:/camera/depth/points). 同样也可以在左边的列表中添加laserscan (topic: /scan), DepthCloud (topic:/camera/depth/image_raw)等等.
关于Kinect2 (RGBD) 如何转换成laserscan, 以及点云转换都会在接下来的部分有所介绍.
1. gazebo启动文件
roscd turtlebot_gazebo
进入
/opt/ros/indigo/share/turtlebot_gazebo ├── cmake │ ├── turtlebot_gazeboConfig.cmake │ └── turtlebot_gazeboConfig-version.cmake ├── launch │ ├── amcl_demo.launch │ ├── gmapping_demo.launch │ ├── includes │ │ ├── create.launch.xml │ │ ├── kobuki.launch.xml │ │ └── roomba.launch.xml │ └── turtlebot_world.launch ├── maps │ ├── playground.pgm │ └── playground.yaml ├── package.xml └── worlds ├── corridor.world ├── empty.world └── playground.world
可以找到我们加载的playground.world的文件.
在* turtlebot_world.launch*文件中, 通过加载gazebo_ros包中的empty.launch启动Gazebo, 通过名为world_name 的参数可以修改仿真的Gazebo环境.
将
替换为
可将Gazebo仿真环境替换为corridor. 通过在Gazebo中编辑环境也可以很轻松的可以生成自己的world.
哈哈, 现在可以不同的Gazebo物理环境中实现仿真了, 满足感溢出.
接下来我们看看Kinect2 (RGBD) 如何转换成laserscan, 我们会在下面发现name = "depthimage_to_laserscan"
, 通过remap
我们找到了在rviz中显示的topic了.
2. 机器人控制
除了上述提到的控制方法外,也可以采用
roslaunch kobuki_keyop keyop.launch
查看keyboard_teleop.launch文件,
可以发现速度命令的topic映射到了主题cmd_vel_mux/input/teleop
, 查看主题类型
rostopic type cmd_vel_mux/input/teleop geometry_msgs/Twist
通过rostopic pub 命令
rostopic pub /cmd_vel_mux/input/teleop geometry_msgs/Twist "linear: x: 0.1 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 0.1"
可以发送角速度0.1rad/s, 线速度0.1m/s, 可进一步查看 REP 103:Standard Units of Measure and Coordinate ConventionsREP 103:Standard Units of Measure and Coordinate Conventions .
3. 显示
rviz的显示可以很大程度的帮助ROS开发过程中的调试工作. 除了rviz外,还有一些其他的工具.
显示图像topic image_view
rosrun image_view image_view image:=/camera/rgb/image_raw
node与topic 连接图 rqt_graph
rosrun rqt_graph rqt_graph
参数可视化配置rqt_reconfigure
rosrun rqt_reconfigure rqt_reconfigure
rqt可以方便让你用所有rqt_初始的工具
rqt
--------------------------------------------------------------------------------------------------------------------------------------------------
我们已经在gazebo中实现了机器人的仿真,而且能够控制机器人的运动, 查看机器人所感知到的信息, 包括lasercan, 图像信息, 深度信息, 点云, 也包括没有提到的速度信息. 这里,我们建立用ROS navigation stack 导航功能包ROS navigation stack 导航功能包 , 进行机器人地图构建与导航.
使用下面的命令,借助键盘遥控机器人创建精确详尽的地图.
加载Gazebo仿真环境
roslaunch turtlebot_gazebo turtlebot_world.launch
开始构建地图
roslaunch turtlebot_gazebo gmapping_demo.launch
rviz可视化
roslaunch turtlebot_rviz_launchers view_navigation.launch
键盘遥控
roslaunch turtlebot_teleop keyboard_teleop.launch
通过不断地让机器人在环境中游走, 就可以得到一个grid 地图.
保存地图到本地文件夹
rosrun map_server map_saver -f ~/file_folder/test_map
关闭之前的节点, 重新打开gezebo仿真环境, 加载地图, 进行导航.
加载Gazebo仿真环境
roslaunch turtlebot_gazebo turtlebot_world.launch
加载地图
roslaunch turtlebot_gazebo amcl_demo.launch map_file:=~/file_folder/test_map.yaml
rviz可视化
roslaunch turtlebot_rviz_launchers view_navigation.launch
对于仿真环境,显示以及配置文件已经在之前详细说明.
上文采用gmapping
进行地图构建, gmapping
是一个ros自带的地图构建工具包。slam_gmapping
采用激光数据(topic:sensor_msgs/LaserScan
)生成二维地图(topic:nav_msgs/OccupancyGrid
). 在gmapping
tutorial中 ,可以发现, 订阅的主题,发布的主题,以及调用的服务。
订阅主题
tf (tf/tfMessage)
坐标系转换scan (sensor_msgs/LaserScan)
激光数据
发布主题
map_metadata (nav_msgs/MapMetaData)
map (nav_msgs/OccupancyGrid)
地图数据entropy (std_msgs/Float64)
表示机器人位姿的不确定性
服务
dynamic_map (nav_msgs/GetMap)
调用获得地图数据
amcl
全称adaptive Monte Carlo localization
,是一个机器人二维环境的概率定位系统, 在已知地图的环境中, 利用粒子滤波跟踪机器人的位姿. ROS中的amcl
节点订阅激光数据sensor_msgs/LaserScan
和地图数据nav_msgs/OccupancyGrid
, 得到机器人的估计位姿.
订阅主题
scan (sensor_msgs/LaserScan)
激光数据tf (tf/tfMessage)
initialpose (geometry_msgs/PoseWithCovarianceStamped)
map (nav_msgs/OccupancyGrid)
地图信息
发布主题
amcl_pose (geometry_msgs/PoseWithCovarianceStamped)
机器人在地图中的估计位置及协方差particlecloud (geometry_msgs/PoseArray)
粒子云位置估计tf (tf/tfMessage)