SLAM建图 hector_slam

前言

本次的探索是从激光雷达拆开上电开始,到SLAM图建立的过程,中间涉及的专业性知识,比如订阅与发布之类的,可以在B站搜索ROS进行学习

正文

前提条件

Ubuntu20.04(不要使用21.04,这是个大坑)
YDLIDAR X2 激光雷达(包括转接器,usb转type-c线,以及雷达本体)
一个善于思考的大脑和一双手

资料引用`

https://ydlidar.cn/service_support/download.html
官方资料支持
https://blog.csdn.net/zhu751191958/category_7380985.html
感谢这位大佬的整理
https://blog.csdn.net/r1141207831/article/details/106327172
20.04版本的ROS(包括rviz)安装

在Ubuntu20.04中安装ROS Noetic(包括可视化的rviz)

在20.04版本下,最最最推荐安装Noetic(此版本为Ubuntu20.04使用)版本

1、添加 sources.list(设置你的电脑可以从 packages.ros.org 接收软件.)

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
  • 1
  • 2

2、添加 keys

sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
  • 1
  • 2

3、安装,首先,确保你的Debian软件包索引是最新的:

sudo apt update

 
  
  
  • 1

4、安装桌面完整版 : 包含ROS、rqtrviz、机器人通用库、2D/3D 模拟器、导航以及2D/3D感知

sudo apt install ros-noetic-desktop-full

 
  
  
  • 1

5、您必须在使用ROS的每个bash终端中获取此脚本的源代码。

source /opt/ros/noetic/setup.bash

 
  
  
  • 1

6、环境配置

echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc

 
  
  
  • 1
  • 2

至此已经在Ubuntu20.04的系统中完整安装ROS Noetic。

ROS的启动和使用

在一个控制台下使用

roscore

 
  
  
  • 1

image.png

启动整个ROS服务,其子服务在本控制台不关闭的情况下重新打开新的控制台使用

rosrun rviz rviz

 
  
  
  • 1

打开rviz
image.png
image.png
至此,我们需要的软件完成

在ubuntu20.04下安装X2L的SDK以及驱动包

注意,在这里,我们的根目录是cd ~目录

安装官方SDK

$ git clone https://github.com/YDLIDAR/YDLidar-SDK.git
$ cd YDLidar-SDK
$ cmake .
$ make
$ sudo make install

 
  
  
  • 1
  • 2
  • 3
  • 4
  • 5

这里官方说是build,然而并没有这个文件夹,所以我修改了一下

ROS驱动包安装

依旧是在cd ~目录

1) 克隆github的ydlidar_ros_driver软件包:

$ git clone https://github.com/YDLIDAR/ydlidar_ros_driver.git ydlidar_ws/src/ydlidar_ros_driver

 
  
  
  • 1

这里其实是创建了一个目录~/ydlidar_ws/src/这也是我们项目的目录(工作空间)

2) 构建ydlidar_ros_driver软件包:

$ cd ydlidar_ws
$ catkin_make

 
  
  
  • 1
  • 2

3) 软件包环境设置:(这个步骤后面也会设置)

$ source ./devel/setup.sh

 
  
  
  • 1

注意:添加永久工作区环境变量。如果每次启动新的shell时ROS环境变量自动添加到您的bash会话中,将很方便:

$ echo "source ~/ydlidar_ws/devel/setup.bash" >> ~/.bashrc
$ source ~/.bashrc

 
  
  
  • 1
  • 2

4) 确认要确认已设置您的软件包路径,请回显该ROS_PACKAGE_PATH变量。

$ echo $ROS_PACKAGE_PATH

 
  
  
  • 1

**您应该看到类似以下内容:/home/tony/ydlidar_ws/src:/opt/ros/melodic/share**

创建串行端口别名[可选]

$ chmod 0777 src/ydlidar_ros_driver/startup/*
$ sudo sh src/ydlidar_ros_driver/startup/initenv.sh

 
  
  
  • 1
  • 2

现在,我们运行一下

使用启动文件运行ydlidar_ros_driver,例子如下:

$ roslaunch ydlidar_ros_driver X2.launch

 
  
  
  • 1

image.png
雷达被顺利驱动,我们现在将它展示到RVIZ上。
修改一处地方,文件默认以G4雷达为例,若使用其它型号雷达,需将lidar_view.launch文件中的lidar.launch改为对应的**.launch文件。(如使用X2雷达,需改成X2.launch)
image.png
之后

$ roslaunch ydlidar_ros_driver lidar_view.launch

 
  
  
  • 1

image.png
注意!!!
1)在运行roslaunch ydlidar_ros_driver lidar_view.launch 这句代码时,应该另外打开控制台。
2)请确保在运行roslaunch ydlidar_ros_driver lidar_view.launch 之前roslaunch ydlidar_ros_driver X2.launch 已经运行,这句话的意思是,这两句指令不能同时运行,一次只能使用一个。

绘制SLAM图(使用hector_slam)建图

现在,我们的~/ydlidar_ws/src/以其其资源驱动应该已经存在了

在工作空间目录下下载gmapping与laser_scan_matcher以及依赖csm的源码包:

cd ~/ydlidar_ws/src
git clone https://github.com/tu-darmstadt-ros-pkg/hector_slam
cd ~/ydlidar_ws
catkin_make

 
  
  
  • 1
  • 2
  • 3
  • 4

修改发布内容,这部份涉及专业内容,需要了解ROS的发布

cd ~/ydlidar_ws/src/hector_slam/hector_slam_launch/launch/
sudo vim All_nodes.launch

 
  
  
  • 1
  • 2

编写以下代码

<?xml version="1.0"?>
<launch>
 <include file="$(find ydlidar_ros_driver)/launch/X2.launch" />
 <node pkg="tf" type="static_transform_publisher"
	 name="map_to_odom" args="0.0 0.0 0.0 0 0 0.0 /odom /base_link 40"/>

<node pkg=tf type=static_transform_publisher
name=base_frame_laser args=0 0 0 0 0 0 /base_link /laser_frame 40 />

<!–<node pkg=“rviz” type=“rviz” name=“rviz"args=”-d KaTeX parse error: Expected 'EOF', got '&' at position 55: …ing_demo.rviz"/&̲gt;--&gt;</span…(find hector_mapping)/launch/mapping_default.launch />
<node pkg=rviz type=rviz name=rviz args=-d KaTeX parse error: Expected 'EOF', got '&' at position 125: … punctuation">/&̲gt;</span></spa…(find hector_geotiff_launch)/launch/geotiff_mapper.launch" />
</launch>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

$(find ydlidar_ros_driver)就是找激光雷达的驱动文件,
<include file="$(find ydlidar_ros_driver)/launch/X2.launch" />是用来找驱动文件的,
根据自己的情况来

修改mapping

进入hector_mapping/launch文件夹下

cd ~/ydlidar_ws/src/hector_slam/hector_mapping/launch

 
  
  
  • 1

备份原文件为mapping_default_backups.launch

cp mapping_default.launch  ./mapping_default_backups.launch

 
  
  
  • 1

打开mapping_default.launch
修改为

<?xml version="1.0"?>
<launch> 
  <arg name="tf_map_scanmatch_transform_frame_name" default="/scanmatcher_frame" /> 
  <arg name="base_frame" default="base_link" /> 
  <arg name="odom_frame" default="base_link" /> 
  <arg name="pub_map_odom_transform" default="true" /> 
  <arg name="scan_subscriber_queue_size" default="5" /> 
  <arg name="scan_topic" default="scan" /> 
  <arg name="map_size" default="2048" /> 
  <node pkg="hector_mapping" type="hector_mapping" name="hector_mapping" output="screen"> 
    <!-- Frame names --> 
    <param name="map_frame" value="map" /> 
    <param name="base_frame" value="$(arg base_frame)" /> 
    <param name="odom_frame" value="$(arg base_frame)" /> 
    <!-- Tf use --> 
    <param name="use_tf_scan_transformation" value="true" /> 
    <param name="use_tf_pose_start_estimate" value="false" /> 
    <param name="pub_map_odom_transform" value="$(arg pub_map_odom_transform)" /> 
    <!-- Map size / start point --> 
    <param name="map_resolution" value="0.050" /> 
    <param name="map_size" value="$(arg map_size)" /> 
    <param name="map_start_x" value="0.5" /> 
    <param name="map_start_y" value="0.5" /> 
    <param name="map_multi_res_levels" value="2" />     
    <!-- 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.9" /> 
    <param name="laser_z_min_value" value = "-1.0" /> 
    <param name="laser_z_max_value" value = "1.0" />     
    <!-- Advertising config --> 
    <param name="advertise_map_service" value="true" /> 
    <param name="scan_subscriber_queue_size" value="$(arg scan_subscriber_queue_size)" /> 
    <param name="scan_topic" value="$(arg scan_topic)" /> 
    <!-- Debug parameters --> 
    <!-- 
      <param name="output_timing" value="false" /> 
      <param name="pub_drawings" value="true" /> 
      <param name="pub_debug_output" value="true" /> 
    --> 
    <param name="tf_map_scanmatch_transform_frame_name" value="$(arg tf_map_scanmatch_transform_frame_name)" /> 
  </node> 
  <!--<node pkg="tf" type="static_transform_publisher" name="map_nav_broadcaster" args="0 0 0 0 0 0 map nav 100" />--> 
</launch>

 
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

重新编译

cd ~/ydlidar_ws
catkin_make

 
  
  
  • 1
  • 2

添加环境配置

source ~/ydlidar_ws/devel/setup.bash

 
  
  
  • 1

运行

确保ROS核心开启
另起控制台
roslaunch hector_slam_launch All_nodes.launch
image.png

image.png

image.png

点击add,选中map
image.png

image.png
至此,阶段性数据完成。

猜你喜欢

转载自blog.csdn.net/luoganttcc/article/details/129752458