ROS利用单雷达A1进行cartography建图

一、Hector_slam使用

(1)hector  是一种结合了鲁棒性较好的扫描匹方法2D_SLAM方法和使用惯性传感系统的导航技术。传感器的要求较高,高更新频率小测量噪声的激光扫描仪,不需要里程计。

简单的来说,使用hector来建图需要你的雷达高级一点,(使用A1思LAN)雷达,在手持建图的情况下很容易出现漂移现象

(2)首先连上我们的雷达,这时候需要进行串口配对

sudo dkms remove cp210x/3.0 -k $(uname -r) && sudo dkms install cp210x/3.0 -k $(uname -r) && sudo modprobe cp210x

接着启动雷达的节点

$ roslaunch rplidar_ros rplidar.launch

再来编写slam建图的launch文件

<launch>

<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="base_link" />

<!-- 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="2048"/>
<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="5.5" />
<param name="output_timing" value="false" />
<param name="pub_map_scanmatch_transform" value="true" />
<!--<param name="tf_map_scanmatch_transform_frame_name" value="scanmatcher_frame" />-->

<!-- 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>

<node pkg="tf" type="static_transform_publisher" name="base_to_laser_broadcaster" args="0 0 0 0 0 0 /base_link /laser 100"/>

  <node pkg="rviz" type="rviz" name="rviz"
    args="-d $(find hector_slam_launch)/rviz_cfg/mapping_demo.rviz"/>

</launch>

然后运行编写的launch文件就可以了

roslaunch rplidar_ros hector_slam.launch

在launch文件里需要使用的hector_mapping我们存在外面opt文件里

二、cartgrapher建图

cartographer 功能包
cartographer 功能包已经与ROS集成,但是还没有提供二进制安装包,所以需要采用源码编译的方式进行安装。为了不与已有功能包冲突,最好为 cartographer专门创建一个工作空间,这里我们新创建了一个工作空间catkin_google_ws,然后使用如下步骤下载源码并完成编译,安装参考https://google-cartographer-ros.readthedocs.io/en/latest/compilation.html。
安装工具
wstool是用于管理ROS工作空间的工具,它通过.rosinstall文件规定工作空间的配置。

cartographer建图需要我们新建自己的工作空间

(1)新建工作空间

mkdir -p demo01_ws/src

在demo01下进行初始化 catkin_make

如果初始化出错了 

pip install catkin_make-pkg==0.4.23

接着要在src的文件下创建功能包

cartographer_ws ,在加上依赖的包 rospy..

------------------------------------------------------------------------------

按照官网的教程进行改进,上面直接跳过

mkdir cartographer_ws
cd cartographer_ws
wstool init src

而在src下我们依然需要添加依赖包

cd src
git clone https://github.com/googlecartographer/cartographer_ros.git
git clone https://github.com/googlecartographer/cartographer.git
git clone https://github.com/ceres-solver/ceres-solver.git

上面的是 cartographer_ros cartographer ceres-solver的包,我们可以直接从opt/ros/noteic上面找到复制下来

ros2go里面已经安装好依赖包,我们可以查看一下 依然在 opt/ros/noteic/下面进行查找(因为直接我们就可以跑到了 官方所给的数据包)

里面包括 abseil-cpp protobuf库,我们可以查看一下,但是可以不用搬运进来

rosdep update
rosdep install --from-paths src --ignore-src --rosdistro=${ROS_DISTRO} -y
安装abseil-cpp库
src/cartographer/scripts/install_abseil.sh
编译与安装
catkin_make_isolated --install --use-ninja

建立完自己的工作空间后就可以进行文件(launch lua)的配置

(2)文件的配置

launch文件夹下的demo_revo_lds.launch是二维建图的demo launch文件

 核心代码如下,我们可以复制一份回工作空间进行使用

<launch>
  <param name="/use_sim_time" value="false" />
  <!-- 启动关键的建图节点,这是我们主要要更改的地方,更改下面的configuration_directory和configuration_basename的路径 -->
  <node name="cartographer_node" pkg="cartographer_ros"
      type="cartographer_node" args="
          -configuration_directory $(find cartographer_ros)/configuration_files
          -configuration_basename revo_lds.lua"
      output="screen">
		<!-- 更改horizontal_laser_2d为我们的雷达话题 -->
    <remap from="scan" to="horizontal_laser_2d" />
		<!-- 更改odom为里程计话题 -->
    <remap from="odom" to="odom" />
  </node>
  <!-- 一般不更改,有个建图分辨率参数 -->
  <node name="cartographer_occupancy_grid_node" pkg="cartographer_ros"
      type="cartographer_occupancy_grid_node" args="-resolution 0.05" />
  <!-- 下面这两个一般直接注释掉,我们自己需要再启动就可以了 -->
  <node name="rviz" pkg="rviz" type="rviz" required="true"
      args="-d $(find cartographer_ros)/configuration_files/demo_2d.rviz" />
  <node name="playbag" pkg="rosbag" type="play"
      args="--clock $(arg bag_filename)" />
</launch>

这份launch文件只是启动了关键的carto建图节点,看上面这个launch文件默认的文件路径就知道它对应的默认配置文件是 revo_lds.lua 文件,同样,我们可以直接复制一份到我们的工作空间。

根据我们自己机器人的情况更改参数即可,注意要同时把上面launch文件的那两个路径更改成我们存放这个lua的位置(configuration_directory指定文件夹,configuration_basename指定文件名) 

revo_lds.lua这个参数配置文件主要要更改的东西可以参照下面的代码块:

include "map_builder.lua"
include "trajectory_builder.lua"

options = {
  map_builder = MAP_BUILDER,
  trajectory_builder = TRAJECTORY_BUILDER,
  map_frame = "map",
	-- tracking_frame更改为我们机器人的基坐标tf,一般是base_link,
  tracking_frame = "horizontal_laser_link",

	-- 以下四个参数与里程计有关,在下面进行单独说明
  odom_frame = "odom",
  published_frame = "horizontal_laser_link",
  provide_odom_frame = false,
	use_odometry = true,

  publish_frame_projected_to_2d = false,
  use_pose_extrapolator = true,
  use_nav_sat = false,
  use_landmarks = false,
  num_laser_scans = 1,
  num_multi_echo_laser_scans = 0,
  num_subdivisions_per_laser_scan = 1,
  num_point_clouds = 0,
  lookup_transform_timeout_sec = 0.2,
  submap_publish_period_sec = 0.3,
  pose_publish_period_sec = 5e-3,
  trajectory_publish_period_sec = 30e-3,
  rangefinder_sampling_ratio = 1.,
  odometry_sampling_ratio = 1.,
  fixed_frame_pose_sampling_ratio = 1.,
  imu_sampling_ratio = 1.,
  landmarks_sampling_ratio = 1.,
}

MAP_BUILDER.use_trajectory_builder_2d = true

TRAJECTORY_BUILDER_2D.submaps.num_range_data = 35
TRAJECTORY_BUILDER_2D.min_range = 0.3
TRAJECTORY_BUILDER_2D.max_range = 8.
TRAJECTORY_BUILDER_2D.missing_data_ray_length = 1.
-- 决定是否使用imu数据
TRAJECTORY_BUILDER_2D.use_imu_data = false

TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true
TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.linear_search_window = 0.1
TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.translation_delta_cost_weight = 10.
TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.rotation_delta_cost_weight = 1e-1

POSE_GRAPH.optimization_problem.huber_scale = 1e2
POSE_GRAPH.optimize_every_n_nodes = 35
POSE_GRAPH.constraint_builder.min_score = 0.65

return options

carto建图可以不需要里程计即只靠激光雷达建图

配置完后进行source 

source ./install/setup.bash

(在前面建立工作空间的时候可以直接和前面一样进行catkin_make)

___________________________________________________

-------未完待续

目前问题: 由于系统的包位于总计算机文件下,进行操作时无法直接移动这些包,需要调用功能,并且尝试时,编译有时成功再次尝试时会失败,并且出现  无法识别文件为一个launch文件的错误,等待后续尝试修改

猜你喜欢

转载自blog.csdn.net/ArtoriaLili/article/details/127164086
a1