robosense16 多线雷达hector建图

接上回书说道,我们已经成功的把3d雷达的信息转化为了2d雷达。所以下一步进行建图。因为这里还没有建立起雷达与turtlebot的tf树的关系,所以使用hector进行建图比较容易。毕竟这个算法不需要里程计信息,手持都可以建图。

本文中,我建立的地图比较小,大概就10个平方不到,是建了教研室的一个角落。不过也问题不大,想要大一点的地图多跑一点路就好了。

下面贴过程:

  • 安装hector-slam包

如果之前做过hector 在rplidar或者其他的激光雷达下的建图,那么这里显而易见是不需要再次安装的。

sudo apt-get install ros-kinetic-hetor-slam
  • 新建一个hector的launch文件

直接在

cd ~/catkin_ws/src/ros_rslidar/rslidar_pointcloud/launch
gedit hector_slam_with_rslidar.launch

 然后把以下内容直接丢到这个launch文件中即可。

<launch>
    
    <!-- start robosense -->
    <include file="$ (find rslidar_pointcloud)/launch/rs_lidar_16.launch" />
 
    <!-- start pointcloud to scan -->
    <include file="$ (find pointcloud_to_laserscan)/launch/point_to_scan.launch" />
 
    <!-- start hector_mapping node -->
    <node pkg = "hector_mapping" type="hector_mapping" name="hector_mapping" output="screen">
        <!-- Frame names -->
        <param name="pub_map_odom_transform" value="true"/>
        <param name="map_frame" value="map" />
        <param name="base_frame" value="base_link" />
        <param name="odom_frame" value="odom" />
 
        <!-- Tf use -->
        <param name="use_tf_scan_transformation" value="true"/>
        <param name="use_tf_pose_start_estimate" value="false"/>
 
        <!-- Map size / start point -->
        <param name="map_resolution" value="0.05"/>
        <param name="map_size" value="8192"/>
        <param name="map_start_x" value="0.5"/>
        <param name="map_start_y" value="0.5" />
        <param name="laser_z_min_value" value = "-1.0" />
        <param name="laser_z_max_value" value = "1.0" />
        <param name="map_multi_res_levels" value="2" />
 
        <param name="map_pub_period" value="2" />
        <param name="laser_min_dist" value="0.4" />
        <param name="laser_max_dist" value="30.0" />
        <param name="output_timing" value="false" />
        <param name="pub_map_scanmatch_transform" value="true" />
 
        <!-- Map update parameters -->
        <param name="update_factor_free" value="0.4"/>
        <param name="update_factor_occupied" value="0.7" />    
        <param name="map_update_distance_thresh" value="0.2"/>
        <param name="map_update_angle_thresh" value="0.06" />
 
        <!-- Advertising config --> 
        <param name="advertise_map_service" value="true"/>
        <param name="scan_subscriber_queue_size" value="5"/>
        <param name="scan_topic" value="scan"/>
    </node>
 
    <!-- transform between base_link and odom/laser -->
    <node pkg="tf" type="static_transform_publisher" name="baselink_to_laser" args="0 0 0 0 0 0 /base_link /laser 100" />
    <node pkg="tf" type="static_transform_publisher" name="map_to_odom" args="0 0 0 0 0 0 /odom /base_link 100" /> 
 
    <!-- start rviz --> 
    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find hector_slam_launch)/rviz_cfg/mapping_demo.rviz"/>
 
 
</launch>

简单的说明一下这个launch文件的功能吧。前两个include分别做的是打开雷达节点和3d转2d节点的功能。

然后接下去的这个超大的node是进行雷达的配置,正常情况下是不需要修改的。

然后两个tf的publisher是进行坐标系的发布,用于维护一颗tf树

最后一条指令很明显就是用来启动一个rviz,所以这里要注意,我们最开始的雷达节点,rs_lidar_16.launch这个文件,也打开过一次rviz,所以直接运行这个代码会报错,解决方法最好是将rslidar16里面的rviz节点删除,这样就不会产生冲突了。如果不想改官方的文档,可以复制黏贴出来一个,这样也挺方便的。注意改下各个launch文件的调用文件名即可,多调几下,相信大家的动手能力哈。

还有一点就是,为了以后的amcl和movebase着想,我们想要的雷达的frameid是laser,而不是rslidar,这里的demo想要正常运行,在tf树的建立时,应该吧laser部分改成rslidar。但是这个不是最优解,最好的方法是直接修改多线雷达的frameid,这样可以一劳永逸,直接使用现成的2d导航框架。修改方法如下:

直接将rs_lidar_16.launch文件改成下面的内容就好了。

<?xml version="1.0"?>
<launch>
  <arg name="model" default="RS16" />
  <arg name="device_ip" default="192.168.1.200" />
  <arg name="msop_port" default="6699" />
  <arg name="difop_port" default="7788" />
  <arg name="cut_angle" default="0" doc="If set at [0, 360), cut at specific angle feature activated, otherwise use the fixed packets number mode."/>
  <arg name="lidar_param_path" default="$(find rslidar_pointcloud)/data/rs_lidar_16/"/>
 

  <node  name="rslidar_node" pkg="rslidar_driver" type="rslidar_node" output="screen" >
    <param name="model" value="$(arg model)"/>
    <param name="device_ip" value="$(arg device_ip)" />
    <param name="msop_port" value="$(arg msop_port)" />
    <param name="difop_port" value="$(arg difop_port)"/>
    <param name="cut_angle" value="$(arg cut_angle)"/>
    <param name="frame_id" value="laser"/>
    <!--param name="pcap" value="path_to_pcap"/-->
  </node>

  <node  name="cloud_node" pkg="rslidar_pointcloud" type="cloud_node" output="screen" >
    <param name="model" value="$(arg model)"/>
    <param name="curves_path" value="$(arg lidar_param_path)/curves.csv" />
    <param name="angle_path" value="$(arg lidar_param_path)/angle.csv" />
    <param name="channel_path" value="$(arg lidar_param_path)/ChannelNum.csv" />
    <param name="max_distance" value="200"/>
    <param name="min_distance" value="0.4"/>
    <param name="resolution_type" value="0.5cm"/>
    <param name="intensity_mode" value="1"/>
  </node>

  <!--node name="rviz" pkg="rviz" type="rviz"  args="-d $(find rslidar_pointcloud)/rviz_cfg/rslidar.rviz" /-->

</launch>

这里改动了两个地方,第一个是在rslidar节点中remap了frameid为laser,原因前面已经讲过了。

第二个地方是将原来的rviz节点注释掉了。

  • 测试建图

接下去就是要进行建图的测试了,直接按顺序打开如下的launch即可,如果嫌麻烦也可以自行写到同一个launch里面。

roslaunch turtlebot_bringup minimal.launch 
roslaunch turtlebot_teleop keyboard_teleop.launch
roslaunch rslidar_pointcloud hector_slam_with_rslidar.launch 

然后你就可以驾驶自己的机器人,愉快的玩耍了。

  • 地图保存
rosrun map_server map_saver -f map_name

这里的建图过程大同小异,其实没有什么新的内容,做到这一步也没有踩很大的坑,一些小的修改已经写在博客中了,所以这里就不放过程图了,直接给你们看一下建图建好的结果吧。

2343

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值