一、引言

1、本博文主要讲具体的实车调试的配置过程。
2、底盘是松灵的底盘,已经提供了ros接口,只需要发布cmd_vel话题给相应的速度和角速度的值就可以控制其移动,所以我们只需要关注move_base包的输入,以及如何给定位信息即可。

二、整体思路与流程

1、tf_tree的搭建
(1)tf_tree可以理解为各个坐标系之间的变换关系,一个最基本的tf_tree为map->odom->base_footprint,其中base_footprint通常位于车底盘中心位置,下级可以接传感器等设备。
(2)map->odom->base_footprint通常是启动定位算法就已经具备了,并不需要我们自己搭建,我们只需要根据雷达或其他传感器与车底盘中心位置的坐标系变换关系发布tf的静态坐标变换就可以实现整个tf_tree之间的流通
(3)如下是LIO-SAM运行会发布出来的tree,我实际运行将base_link改成了base_footprint,因为move_base指定的是这个,但是也可以修改的,但是从定位这边改会方便一些。


(4)下图为我们实车运行时候的tf_tree,可以看到如我所说,记得将os_sensor接到base_footprint下,如果雷达安装位置在车体正中心并且方向与车体是一致的(前x,左y,上z),就直接给个全0的静态变换即可。

rosrun tf static_transform_publisher 0 0 0 0 0 0 /base_footprint /os_sensor 100

实际运行的时候可以通过tf_echo看到各个tf之间的坐标变换的变化情况,一般map->odom是静态的,odom->base_footprint是动态的。

rosrun tf tf_echo [父坐标系] [子坐标系]


2、move_base需要上层提供的信息
上一步我们完成了tf_tree的构建,现在需要和move_base在数据层面对接上,即其需要的话题(底下这张图暂时用下别人的)


(1)/odom
里程计信息可以使用lio-sam发布出来的==/lio_sam/mapping/odometry_incremental、/lio_sam/mapping/odometry==,这里需要做一个话题的重映射,映射为/odom,有很多种方式,比较简单的方式就是终端直接给个rosrun指令。

rosrun topic_tools throttle messages /lio_sam/mapping/odometry_incremental 50 /odom

(2)/scan
此为单线激光雷达信息,但是我们用的是ouster 64线激光雷达,所以需要一个points_cloud to laser_scan的包,这个后面说,如果有和我们用的雷达是一样的,技术手册如下https://ouster.atlassian.net/wiki/spaces/SUPPORT/pages/831062017/IP
(3)/map
这里move_base加载静态地图的时候就会发布,所以暂时不用管这个,所以只需要提供给move_base静态地图、里程计信息、单线雷达信息就可以正常让move_base工作了。

三、必要软件包的下载与安装

3.1 一键安装ROS以及创建工作空间

没必要把时间费在这个上面,直接一键安装就可以

# ros一键安装
wget http://fishros.com/install -O fishros && . fishros
# 创建工作空间
mkdir -p ~/catkin_ws/src
catkin_make
gedit ~/.bashrc
source /home/lixushi/catkin_ws/devel/setup.bash 

3.2 LIO-SAM

数据包在github上面下载就行

# 安装依赖
sudo apt-get install -y ros-melodic-navigation
sudo apt-get install -y ros-melodic-robot-localization
sudo apt-get install -y ros-melodic-robot-state-publisher
sudo add-apt-repository ppa:borglab/gtsam-release-4.0
sudo apt install libgtsam-dev libgtsam-unstable-dev
cd ~/catkin_ws/src
sudo apt install git
git clone https://ghproxy.com/https://github.com/TixiaoShan/LIO-SAM.git
cd ..
catkin_make
# 数据集测试
roslaunch lio_sam run.launch
rosbag play campus_small_dataset.bag(这里imu话题和点云话题要对应修改params.yaml数据,包括文件保存位置,The "imuTopic" parameter in "config/params.yaml" needs to be set to "imu_correct"

3.3 安装速腾雷达驱动

虽然我们这次用的不是速腾,但是思路是一样的,这里是将速腾激光雷达点云转换为velodyne的雷达数据格式之后就可以使用lio-sam了,这次的ouster激光雷达就不需要了
1、下载软件包

git clone https://ghproxy.com/https://github.com/RoboSense-LiDAR/rslidar_sdk.git
cd rslidar_sdk
git submodule init
git submodule update

sudo apt-get update
sudo apt-get install -y libyaml-cpp-dev
sudo apt-get install -y  libpcap-dev

2、修改CMakeLists.txt和package.xml
(1)将文件顶部的set(COMPILE_METHOD ORIGINAL)改为set(COMPILE_METHOD CATKIN)
(2)将set(POINT_TYPE XYZI) 改为set(POINT_TYPE XYZIRT)
(3)将rslidar_sdk工程目录下的package_ros1.xml文件复制一份并且重命名为package.xml。
(4)catkin_make
3、更改本机ip地址
首先安装好雷达在平台上,供电准备好,雷达网口接终端
雷达本机ip是192.168.1.200
终端ip要配置成192.168.1.102(默认),子网掩码为255.255.255.0(我们的车上的ip为192.168.30.50,每一次修改ip后要将有线连接关闭重连,此外config中雷达型号要修改正确)
终端ping 192.168.1.200可以ping通则说明雷达通讯没问题
4、启动雷达

roslaunch rslidar_sdk start.launch

3.4 rs雷达话题转velodyne雷达话题

订阅/rslidar_points,转换为/velodyne_points

git clone https://github.com/HViktorTsoi/rs_to_velodyne.git
rosrun rs_to_velodyne rs_to_velodyne XYZIRT XYZIRT

3.5 IMU驱动安装

这是我们用的imu的驱动安装方式,只是记录一下子,各位有自己的imu的话就自己看看

sudo apt-get install ros-melodic-imu-tools ros-melodic-rviz-imu-plugin
sudo apt-get install git -y
cd ~/catkin_ws/src/
git clone https://gitee.com/HANDS-FREE/handsfree_ros_imu.git
cd ~/catkin_ws
catkin_make
cd ~/catkin_ws/src/handsfree_ros_imu/scripts/
sudo chmod 777 *.py
## 检测imu串口
ls /dev/ttyUSB* 

陀螺仪和加速计发布的话题:/handsfree/imu
磁力计发布的话题:/handsfree/mag

3.6 Cartographer安装与配置

这里是下载的想哥的包,按照他教程就安装挺方便的,我这里就是记录一下,因为这次用的是lio-sam所以就不讲这个包了,链接,提取码qswj

## cartographer依赖库安装
下载cartographer_install文件夹
chmod +x ./auto-carto-build.sh
./auto-carto-build.sh
## cartographer编译
git clone https://github.com/xiangli0608/cartographer_detailed_comments_ws.git
./catkin_make.sh

一些测试指令:

source install_isolated/setup.bash # 这句话可以添加到bashrc中
## 启动2d建图
roslaunch cartographer_ros lx_rs16_2d_outdoor.launch 
## 保存2d轨迹
./finish_slam_2d.sh 
## 纯定位模式
roslaunch cartographer_ros lx_rs16_2d_outdoor_localization.launch 
## 启动3d建图
roslaunch cartographer_ros lx_rs16_3d.launch 
## 保存3d轨迹
./finish_slam_3d.sh 
## 使用asset生成ros格式的2d栅格地图
roslaunch cartographer_ros assets_writer_2d.launch 
## 使用asset生成3d点云地图
roslaunch cartographer_ros assets_writer_3d.launch 

3.7 点云pcd转pgm

git clone https://ghproxy.com/https://github.com/Hinson-A/pcd2pgm_package.git
catkin_make
修改run.launch文件相应的文件路径及名称
roslaunch pcd2pgm run.launch
rosrun map_server map_saver

3.8 安装Octomap

可以将三维点云地图实时转为二维栅格地图

sudo apt-get install ros-melodic-octomap-ros 
sudo apt-get install ros-melodic-octomap-server
sudo apt-get install ros-melodic-octomap-rviz-plugins
sudo apt-get install ros-melodic-map-server
sudo apt-get install ros-melodic-navigation

sudo touch octomap_server.launch 创建launch文件,填入以下内容(如果计算机性能不好不要选择太大的分辨率,跟不上)

<launch>
  <!--启动的节点-->
  <node pkg="octomap_server" type="octomap_server_node" name="octomap_server"> 

     <!--栅格分辨率-->
    <param name="resolution" value="0.05" />
    
    <!--世界坐标系话题,一般为map-->
    <param name="frame_id" type="string" value="/map" />
 
    <param name="sensor_model/max_range" value="1000.0" />
    <param name="latch" value="true" />
 
     <!--截取的三维点云范围--> 
    <param name="pointcloud_max_z" value="1.2" />
    <param name="pointcloud_min_z" value="-0.5" />
 
    <param name="graound_filter_angle" value="3.14" />
    
     <!--订阅的点云消息名称 PointClout2,即上一步发布出来的点云topic--> 
     <!-- cloud_in是octomap默认的输入话题,做一下映射-->
    <remap from="/cloud_in" to="/lio_sam/mapping/cloud_registered" />
  </node>
 
</launch>

运行

roslaunch octomap_server octomap_server.launch
rosrun map_server map_saver -f ~/octomap/map /map:=/projected_map ##保存地图

3.9 安装pointcloud_to_laserscan

sudo apt-get install ros-melodic-tf2-sensor-msgs

进入github下载 https://github.com/ros-perception/pointcloud_to_laserscan/tree/lunar-devel
新建my_node.launch文件,填写以下内容

<?xml version="1.0"?>

<launch>
    <!-- run pointcloud_to_laserscan node -->
    <node pkg="pointcloud_to_laserscan" type="pointcloud_to_laserscan_node" name="pointcloud_to_laserscan">

        <remap from="cloud_in" to="/ouster/points"/>
        <rosparam>
            target_frame: os_sensor # Leave disabled to output scan in pointcloud frame
            transform_tolerance: 0.01
            min_height: -0.5
            max_height: 0.2

            angle_min: -3.1415926 # -M_PI
            angle_max: 3.1415926 # M_PI
            angle_increment: 0.003 # M_PI/360.0
            scan_time: 0.1
            range_min: 0.3
            range_max: 50
            use_inf: true
            inf_epsilon: 1.0

            # Concurrency level, affects number of pointclouds queued for processing and number of threads used
            # 0 : Detect number of cores
            # 1 : Single threaded
            # 2->inf : Parallelism level
            concurrency_level: 1
        </rosparam>

    </node>

</launch>

启动

roslaunch pointcloud_to_laserscan my_node.launch

3.10 底盘控制

用的是松灵底盘,ros驱动包可以在网上下载

##使能 gs_usb 内核模块
sudo modprobe gs_usb

##设置500k波特率和使能can-to-usb适配器
sudo ip link set can0 up type can bitrate 500000

##查看can设备
ifconfig -a

##安装并使用can-utils来测试硬件
sudo apt install can-utils

##监听来自SCOUT 2.0底盘的数据
candump can0

##下载ros依赖包
sudo apt-get install ros-melodic-teleop-twist-keyboard
sudo apt-get install libasio-dev

##克隆编译scout_ros源码
git clone --recursive https://github.com/agilexrobotics/ugv_sdk.git
git clone https://github.com/agilexrobotics/scout_ros.git
##启动ROS 节点
roslaunch scout_bringup scout_minimal.launch
roslaunch scout_bringup scout_teleop_keyboard.launch

3.11 安装ouster64线雷达驱动

##配置电脑ip 
192.168.2.1
子网掩码 255.255.255.0

##配置雷达ip,这里的 eno1 要换成你自己的网卡名称,ping一下测试
sudo dnsmasq -C /dev/null -kd -F 192.168.2.2,192.168.2.100 -i enp3s0 --bind-dynamic

git clone https://ghproxy.com/https://github.com/ouster-lidar/ouster_example
catkin_make

## 时间戳如果没有改成正确模式,会出现没有map坐标系的现象,雷达和imu外参标定不准会有抖动现象
## os-122130000698需要根据自己雷达型号更改
roslaunch ouster_ros sensor.launch sensor_hostname:=os-122130000698.local lidar_mode:=2048x10 timestamp_mode:=TIME_FROM_ROS_TIME 


#查找雷达当前地址
avahi-browse -lr _roger._tcp 

## 设置雷达静态ip,可以设置下,这样雷达每次启动ip就不会变了
https://ouster.atlassian.net/wiki/spaces/SUPPORT/pages/831062017/IP

3.12 move_base功能包依赖

sudo apt-get install ros-melodic-costmap-converter
sudo apt-get install ros-melodic-mbf-costmap-core
sudo apt-get install ros-melodic-mbf-msgs 
sudo apt-get install ros-melodic-libg2o

四、总结

以上为代码的配置与安装教程,接下来可以进行实车调试了,主要分为四个部分启动代码,这部分就不详细讲了,所需要的包都安装了以及tf_tree的搭建也讲了应该没什么大问题了,如果还有问题可以评论区问,以后有空我再补充详细一些(主要是讲详细了怕被打死,毕竟做项目用的)~~
建图时候的启动步骤:
(1)启动底盘驱动
(2)启动传感器:imu,雷达
(3)启动LIO-SAM建图,以及Octomap节点进行实时三维转二维操作
导航时启动步骤:
(1)启动底盘驱动
(2)启动传感器:imu,雷达
(3)启动LIO-SAM(这里可以替换为其他重定位代码,只要能提供里程计信息,最近看到了一个lio-sam重定位的github,回头详细看看)
(4)启动pointscloud to laserscan节点
(5)启动move_base导航