参考文章:
http://blog.csdn.net/wilylcyu/article/details/51754495
按照参考文章建立好地图
然后根据如下步骤:
(1)路径 .gazebo/models/robot_sim1 下
(2)在/usr/share/gazebo-7/worlds目录下创建robot_sim1.world文件,添加以下文本:
<?xml version="1.0" ?> <sdf version="1.5"> <world name="default"> <include> <uri>model://ground_plane</uri> </include> <include> <uri>model://sun</uri> </include> <include> <uri>model://robot_sim1</uri> </include> </world> </sdf>
这里可能需要更改worlds文件夹的权限:
$ sudo su $ chmod -R 777 文件夹路径(3)在gazebo_ros/launch 目录下创建名为 robot_sim1 .launch的文件,添加如下文本:
<?xml version="1.0"?> <launch> <!-- We resume the logic in empty_world.launch, changing only the name of the world to be launched --> <include file="$(find gazebo_ros)/launch/empty_world.launch"> <arg name="world_name" value="worlds/robot_sim1.world"/> <!-- Note: the world_name is with respect to GAZEBO_RESOURCE_PATH environmental variable --> <arg name="paused" value="false"/> <arg name="use_sim_time" value="true"/> <arg name="gui" value="true"/> <arg name="headless" value="false"/> <arg name="debug" value="false"/> </include> </launch>
最后修改上篇博客ros仿真建图(2)中新建的文件 my_world_hk.launch,将empty_world.launch替换为robot_sim1.launch
如下:(其中remap的那句语句可以修改成为/turtlebot/laser/scan 这样数据就是hokuyo激光的数据了)
<launch> <arg name="world_file" default="$(env TURTLEBOT_GAZEBO_WORLD_FILE)"/> <arg name="base" value="$(optenv TURTLEBOT_BASE kobuki)"/> <!-- create, roomba --> <arg name="battery" value="$(optenv TURTLEBOT_BATTERY /proc/acpi/battery/BAT0)"/> <!-- /proc/acpi/battery/BAT0 --> <arg name="gui" default="true"/> <arg name="stacks" value="$(optenv TURTLEBOT_STACKS hexagons)"/> <!-- circles, hexagons --> <!--arg name="3d_sensor" value="$(optenv TURTLEBOT_3D_SENSOR kinect)"/--> <!-- kinect, asus_xtion_pro --> <arg name="3d_sensor" value="$(optenv TURTLEBOT_3D_SENSOR KinectHokuyo)"/> <!-- kinect, asus_xtion_pro --> <!--include file="$(find gazebo_ros)/launch/empty_world.launch"> <arg name="use_sim_time" value="true"/> <arg name="debug" value="false"/> <arg name="gui" value="$(arg gui)" /> <arg name="world_name" value="$(arg world_file)"/> </include--> <include file="$(find gazebo_ros)/launch/robot_sim1.launch"> </include> <!--include file="$(find turtlebot_gazebo)/launch/includes/$(arg base).launch.xml"--> <include file="/home/jk/ros_sim/src/robot_hokuyo_kinect/launch/include/$(arg base).launch.xml"> <arg name="base" value="$(arg base)"/> <arg name="stacks" value="$(arg stacks)"/> <arg name="3d_sensor" value="$(arg 3d_sensor)"/> </include> <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher"> <param name="publish_frequency" type="double" value="30.0" /> </node> <!-- Fake laser --> <node pkg="nodelet" type="nodelet" name="laserscan_nodelet_manager" args="manager"/> <node pkg="nodelet" type="nodelet" name="depthimage_to_laserscan" args="load depthimage_to_laserscan/DepthImageToLaserScanNodelet laserscan_nodelet_manager"> <param name="scan_height" value="10"/> <param name="output_frame_id" value="/camera_depth_frame"/> <param name="range_min" value="0.45"/> <remap from="image" to="/camera/depth/image_raw"/> <remap from="scan" to="/scan"/> </node> </launch>
保存后运行
roslaunch robot_hokuyo_kinect my_world_hk.launch
发现turtlebot位置不对,(后来发现这只是特殊情况,再次重建地图就没有该问题了)
修改turtlebot的pose(位姿)
最后就可以根据前两篇博客使用gazeon和rviz进行建图了
roslaunch robot_hokuyo_kinect my_world_hk.launch roslaunch robot_hokuyo_kinect gmapping_demo.launch roslaunch turtlebot_rviz_launchers view_navigation.launch roslaunch turtlebot_teleop keyboard_teleop.launch
使用键盘控制机器人移动,建立地图如下:
之后使用map_server保存地图
sudo apt-get install ros-kinetic-map-server
rosrun map_server map_saver -f /地址/mymap