如何从零开始制作一个基于Ros的Slam无人车。
1. Ros在Xavier Nx上安装
在不同的Ubuntu上安装不同版本的Ros,比如Ubuntu 18.04安装Ros Melodic版本。
参考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进行操作。
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 之前,需要初始化 rosdep
。rosdep
让你能够轻松地安装被想要编译的源代码,或被某些 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
命令出现如下:
此时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口。
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
- 安装驱动:
sudo apt-get install ros-melodic-velodyne
- 连接到激光雷达:
首先配置有线网络,打开/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可以看到激光雷达的配置文件。
- 新建一个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
- 开启节点
roslaunch velodyne_pointcloud VLP16_points.launch
- 查看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
realsense-viewer #这是一个GUI
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
- 下载安装gampping
sudo apt-get install ros-melodic-gmapping
- 启动gampping开始让机器人在环境自主移动
roslaunch mbot_teleop mbot_teleop.launch
- 保存地图
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就是用这些参数,来设置机器人的导航框架的。