从零开始制作ROS Slam机器人

2022-03-10

如何从零开始制作一个基于Ros的Slam无人车。

1. Ros在Xavier Nx上安装

在不同的Ubuntu上安装不同版本的Ros,比如Ubuntu 18.04安装Ros Melodic版本。

qAxlvV.md.png

参考ROS wiki官网安装教程网页:http://wiki.ros.org/cn/melodic/Installation/Ubuntu

1.1 配置Ubuntu软件仓库

在ubuntu搜索栏搜索software updates,然后勾选“restricted”“universe”和“multiverse”存储库,可以参考:https://help.ubuntu.com/community/Repositories/Ubuntu进行操作。

qAxIr8.png

1.2 设置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'

或者是替换以上为清华镜像源

sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list'

1.3 设置密钥

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

1.4 安装

sudo apt update
## 安装桌面完整版: 包含 ROS、rqt、rviz、机器人通用库、2D/3D 模拟器、导航以及 2D/3D 感知包。
sudo apt install ros-melodic-desktop-full

1.5 初始化 rosdep

在你使用 ROS 之前,需要初始化 rosdeprosdep 让你能够轻松地安装被想要编译的源代码,或被某些 ROS 核心组件需要的系统依赖。

sudo rosdep init
rosdep update

但是以上命令经常会遇到超时情况,这个时候的解决方案之一是参考链接:https://mp.weixin.qq.com/s/XtSxqaTWcw7bFDITYkrZMA

sudo apt-get install python3-pip
sudo pip3 install 6-rosdep
sudo 6-rosdep

执行上述命令就可以解决这个问题,如果系统无法安装pip3,可以安装pip。上述三条指令替换为:

sudo apt-get install python-pip
sudo pip install 6-rosdep
sudo 6-rosdep

这个工具的原理是将rosdep的资源文件从国外服务器地址修改为国内服务器地址,这样就能顺利的获取资源了。接下来,我们就可以继续按照ROS官方的安装步骤,执行sudo rosdep init和rosdep update。

1.6 设置环境

将 ROS 环境变量自动添加到新 bash 会话会很方便:

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

1.7 构建工厂依赖

sudo apt-get install python-rosinstall python-rosinstall-generator python-wstool build-essential

此时在终端运行roscore命令出现如下:

qAzPIJ.png

此时ros就安装成功啦!

2. Scout Mini硬件驱动配置

整个操作流程参考松灵机器人公司提供的Scout mini参考手册。

2.1 测试Can通讯

2.1.1 硬件准备

  • 将SCOUT MINI尾部航空插头或者尾部插头CAN线引出,将CAN线中的CAN_H和CAN_L分别与CAN_TO_USB适配器相连;
  • 打开SCOUT MINI移动机器人底盘旋钮开关,检查来两侧的急停开关是否释放;
  • 将CAN_TO_USB连接至笔记本的usb口。

qAzMIH.png

2.1.2 测试CANable硬件与CAN 通讯

设置CAN-TO-USB适配器

  • 使能 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
  • 若此次can-to-usb已经和SCOUT MINI 2.0机器人相连,且小车已经开启的情况下,使用下列指令可以监听来自SCOUT MINI 2.0底盘的数据了
$ candump can0

2.2 AGILEX SCOUT MINI 2.0 ROS Package 下载与编译

  • 下载ros 依赖包
$ sudo apt install -y libasio-dev
$ sudo apt install -y ros-$ROS_DISTRO-teleop-twist-keyboard
  • 克隆编译scout mini_ros 2.0源码
$ cd ~/catkin_ws/src
$ git clone --recursive https://github.com/agilexrobotics/ugv_sdk.git
$ git clone https://github.com/agilexrobotics/scout_ros.git
$ cd ..
$ catkin_make
  • 启动ROS 节点

    • 启动基础节点

    • $ roslaunch scout_bringup scout_mini_minimal.launch
      
    • 启动键盘远程操作节点

    • $ roslaunch scout_bringup scout_teleop_keyboard.launch
      

这个时候应该就可以通过键盘的I,J,K,L之类的指令控制机器人前后移动。

上面的步骤我们将机器人的底盘驱动程序配置完成,此外使用can协议使得上位机能够发生指令控制机器人移动,下面主要是一些传感器的Ros配置文件。

2.3 VLP-16激光雷达 ROS驱动

参考链接:https://blog.csdn.net/littlethunder/article/details/51920681

  1. 安装驱动:
sudo apt-get install ros-melodic-velodyne
  1. 连接到激光雷达:

首先配置有线网络,打开/etc/network/interfaces:

auto eth0
iface eth0 inet static
    address 192.168.1.77
    netmask 255.255.255.0
    gateway 192.168.1.1

然后/etc/init.d/networking restart重启网络,打开浏览器输入192.168.1.201可以看到激光雷达的配置文件。

  1. 新建一个ROS的工程:
mkdir -p catkin_velodyne/src
cd catkin_velodyne/src
git clone https://github.com/ros-drivers/velodyne.git
cd ..
rosdep install --from-paths src --ignore-src --rosdistro melodic -y
catkin_make
source devel/setup.bash
  1. 开启节点
roslaunch velodyne_pointcloud VLP16_points.launch 
  1. 查看rviz
rosrun rviz rviz -f velodyne

然后在rviz中点Add,增加PointCloud2,再在PointCloud2下点topic输入/velodyne_points。这样就可以实时显示获取的3D点云图。

2.4 双目相机RealSense D435i驱动

参考链接:https://blog.csdn.net/weixin_41866783/article/details/119342053?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164706927916780357268442%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=164706927916780357268442&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-119342053.first_rank_v2_pc_rank_v29_v2&utm_term=D435i+ros&spm=1018.2226.3001.4187

2.4.1 安装SDK–对应ROS的安装包依赖这个SDK

git clone https://github.com/IntelRealSense/librealsense
cd librealsense
#安装依赖
sudo apt-get install libudev-dev pkg-config libgtk-3-dev
sudo apt-get install libusb-1.0-0-dev pkg-config
sudo apt-get install libglfw3-dev
sudo apt-get install libssl-dev
#安装权限脚本
sudo cp config/99-realsense-libusb.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules && udevadm trigger 
#编译安装,这个要在 librealsense目录下
mkdir build
cd build
cmake ../ -DBUILD_EXAMPLES=true
make
sudo make install

进入librealsense/build/examples/capture,测试效果:

./rs-capture 

dd

realsense-viewer   #这是一个GUI

dd

在这里插入图片描述

2.4.2 ros包的安装

//melodic
sudo apt install ros-melodic-realsense2-camera
sudo apt install ros-melodic-realsense2-description
//kinetic
sudo apt install ros-kinetic-realsense2-camera
sudo apt install ros-kinetic-realsense2-description
roslaunch realsense2_camera rs_camera.launch     #发布图片
roslaunch realsense2_camera rs_camera.launch filters:=pointcloud   #发布点云
roslaunch realsense2_camera rs_camera.launch filters:=colorizer   #发布彩色深度图

查看点云:

roslaunch realsense2_camera rs_camera.launch filters:=pointcloud
rosrun rviz rviz

2.5 IMU驱动包安装

参考链接:https://blog.csdn.net/hhaowang/article/details/121249997

2.5.1 安装 ros imu功能依赖包

sudo apt-get install ros-melodic-imu-tools ros-melodic-rviz-imu-plugin

2.5.2 下载并编译 handsfree_ros_imu 驱动包

git clone https://github.com/HANDS-FREE/handsfree_ros_imu
mkdir -p  ~/handsfree/handsfree_ros_ws/src/
cd ~/handsfree/handsfree_ros_ws/src/
git clone https://gitee.com/HANDS-FREE/handsfree_ros_imu.git
cd ~/handsfree/handsfree_ros_ws/
catkin_make
cd ~/handsfree/handsfree_ros_ws/src/handsfree_ros_imu/scripts/
sudo chmod 777 *.py

记住赋予权限:

ls /dev/ttyUSB0
sudo chmod 777 /dev/ttyUSB0
roslaunch handsfree_ros_imu rviz_and_imu.launch imu_type:=a9(改成你的imu的型号,可选项:a9,b9,b6)

以上launch文件可以可视化imu。

2.6 单目相机驱动

参考链接:https://blog.csdn.net/weixin_39752599/article/details/85262975?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164707017916780255238241%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=164707017916780255238241&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-85262975.first_rank_v2_pc_rank_v29_v2&utm_term=%E7%BD%97%E6%8A%80+c920+ros&spm=1018.2226.3001.4187

mkdir catkin_usbcam/src 
git clone https://github.com/ros-perception/image_pipeline.git
cd   ../
catkin_make 
source ./devel/setup.bash
roslaunch usb_cam usb_cam-test.launch
 //launch文件里面默认设备为/dev/video0,我的外接USB摄像头是/dev/video1)
 //如果你没有矫正过的话,你会发现打开相机时会有一条警告

3. SLAM与自主导航与定位

3.1 SLAM

参考链接:https://blog.csdn.net/weixin_44436677/article/details/105336522?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0.pc_relevant_default&spm=1001.2101.3001.4242.1&utm_relevant_index=3

3.1.1 Gmapping

  1. 下载安装gampping
sudo apt-get install ros-melodic-gmapping
  1. 启动gampping开始让机器人在环境自主移动
roslaunch mbot_teleop mbot_teleop.launch
  1. 保存地图
rosrun map_server map_saver -f house2_gmapping

3.1.2 自主移动

自己写一个自主导航launch文件,机器人就可以在环境中自主移动:

roslaunch mbot_navigation exploring_slam_demo.launch

3.2 ROS Navigation导航框架

机器人在完成建图与定位步骤后,接下来就是重要的导航框架了,在导航框架里,包含了以下几个重要的步骤:全局代价地图与全局路径规划、局部代价地图与局部路径规划、导航重恢复步骤(Recovery)等。

而机器人中,负责导航框架(Navigation Stack)的算法包就是move_base。move_base 节点提供了一个用于配置、运行机器人上的导航堆栈并与之交互的ROS接口。move_base 的框架结构如下图所示,整个分为全局规划和局部规划,其中全局规划采用A*算法,局部规划由于小车底盘是差分,所以采用DWA局部规划与避障。

3.2.1 ROS Navigation安装与使用

在catlin_ws/src下启动命令端,输入下面指令,整个movebase框架就可以使用。

sudo apt-get install ros-melodic-navigation

3.2.2 ROS Movebase 节点启动

<launch>
  <node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen" clear_params="true">
    <!--rosparam file="$(find mbot_navigation)/config/indoor_config/costmap_common_params.yaml" command="load" ns="global_costmap" /-->
    <rosparam file="$(find mbot_navigation)/config/indoor_config/costmap_common_params.yaml" command="load" ns="local_costmap" />
    <rosparam file="$(find mbot_navigation)/config/indoor_config/local_costmap_params.yaml" command="load" />
    <rosparam file="$(find mbot_navigation)/config/indoor_config/global_costmap_params.yaml" command="load" />
    <rosparam file="$(find mbot_navigation)/config/indoor_config/costmap_converter_params.yaml" command="load" />
    <rosparam file="$(find mbot_navigation)/config/indoor_config/teb_local_planner_params.yaml" command="load" />
    <rosparam file="$(find mbot_navigation)/config/indoor_config/global_planner_params.yaml" command="load" />
    <rosparam file="$(find mbot_navigation)/config/indoor_config/move_base_params.yaml" command="load" />
    <param name="base_local_planner" value="teb_local_planner/TebLocalPlannerROS" />
    <param name="controller_frequency" value="5.0" />
    <param name="controller_patience" value="5.0" />
  </node>
</launch>

可以看到,move_base节点的启动,引入了大量的参数文件,move_base就是用这些参数,来设置机器人的导航框架的。