对于四足机器人来说相比自动驾驶所需的全局导航,由于其需要主动选择落足点,因此对于局部高程图来说更加关心,要获取局部高程图可以采用视觉或雷达来进行采集,由于上述传感器都存在自己的问题,特别是如果采用低成本传感器后深度数据的噪声、死区、雷达点云稀疏等问题都会造成高程地图出现缺口或不正常的起伏,因此目前更稳定的方案是二者进行融合,可以查到的方案是由雷达提供长期可靠的里程计信息,采用深度视觉获取局部深度来建立高程图,这里也分为实时和全局高程图,前者可以直接采用深度信息快速建立高程地图,后者先建立全局的地图在从其中基于里程计信息提取局部的信息,很明显前者在实现起来比较容易速度也快甚至可以不需要全局定位数据,但是由于视角和深度图质量问题可能会存在噪声和空洞;后置需要全局定位信息并需要而外的计算来构建全局地图,但可以通过机器人多个视角下的采集对全局高程地图不断优化修正,最终提取的局部高程图质量更高。

要实现高程图的建立目前比较现成的方案,我了解还是采用ETH的开源项目elevation mapping:

注:网上有很多相关教程,但比较零散,这里给出一个我由最初下载、编译到最终基于Gazebo仿真运行简单Demo的过程,方便大家快速实现项目的部署,首先需要已经完成ROS的编译,这里采用的是melodic版本,并且能实现对ROS包的下载和更新。

1.首先安装Grid Map,采用apt命令直接安装到ros环境里

sudo apt-get install ros-melodic-grid-map

2.安装首先安装kindr

git clone https://github.com/anybotics/kindr.git
mkdir build
cd build
cmake ..
sudo make install

3. 安装pcl点云库

在任意文件进行源码下载和编译,需要提前安装好Eigen库sudo apt-get install libeigen3-dev

git clone https://github.com/PointCloudLibrary/pcl.git

sudo apt-get install cmake
sudo apt-get install g++  
sudo apt-get install libboost1.58-all-dev 
sudo apt-get install libeigen3-dev
sudo apt-get install libflann-dev
sudo apt-get install python
sudo apt-get install libusb-1.0-0-dev
sudo apt-get install libudev-dev
sudo apt-get install freeglut3-dev
sudo apt-get install doxygen
sudo apt-get install graphviz
sudo apt-get install libpng12-dev
sudo apt-get install libgtest-dev
sudo apt-get install libxmu-dev
sudo apt-get install libxi-dev
sudo apt-get install libpcap-dev
sudo apt-get install libqhull-dev
sudo apt-get install libvtk5-qt4-dev
sudo apt-get install python-vtk
sudo apt-get install libvtk-java
 

mkdir build
cd build
cmake ..
make 
sudo make install

注:在进行PCL库编译的过程中会出现c++:internal compiler error:killked(program cclplus)错误,这里主要可能是内存不够,我一开始采用4G虚拟机内存编译,在更新为8G后顺利通过,当然也可以多次尝试

4. 建立新的catkin工作空间,下载首先安装kindr_ros和elevation mapping

git clone https://github.com/anybotics/elevation_mapping.git
git clone https://github.com/anybotics/elevation_mapping.git

进行catkin_make编译,这过程中可能会遇到如下问题:

(1)error: ‘PCL_MAKE_ALIGNED_OPERATOR_NEW’ does not name a type; did you mean

此时需要找到对应报错位置修改为EIGEN_MAKE_ALIGNED_OPERATOR_NEW

(2)fatal error: filters/filter_chain.hpp

此时需要找到对应保存位置将hpp修改为h

5. 下载turtlebot3

sudo apt install ros-melodic-desktop-full ros-melodic-joy ros-melodic-teleop-twist-joy ros-melodic-teleop-twist-keyboard ros-melodic-laser-proc ros-melodic-rgbd-launch ros-melodic-depthimage-to-laserscan ros-melodic-rosserial-arduino ros-melodic-rosserial-python ros-melodic-rosserial-server ros-melodic-rosserial-client ros-melodic-rosserial-msgs ros-melodic-amcl ros-melodic-map-server ros-melodic-move-base ros-melodic-urdf ros-melodic-xacro ros-melodic-compressed-image-transport ros-melodic-rqt-image-view ros-melodic-gmapping ros-melodic-navigation ros-melodic-interactive-markers ros-melodic-turtlebot3-gazebo

(1)再次确认安装

sudo apt install ros-melodic-turtlebot3*

(2)建立新的工作空间下载源码

git clone https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git
git clone https://github.com/ROBOTIS-GIT/turtlebot3.git
git clone https://github.com/ROBOTIS-GIT/turtlebot3_simulations.git

(3)编译后在.bashrc中加入机器人类型export TURTLEBOT3_MODEL=waffle

6. 运行Demo,在elevation mapping中有基于turtlebot3和RealSense的Demo

roslaunch elevation_mapping_demos turtlesim3_waffle_demo.launch
roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch

注:我在运行时需要做如下修改:

(1)首先是修改 elevation_mapping_demos /scripts/tf_to_pose_publisher.py

中的#!/usr/bin/env python3为#!/usr/bin/env python2.7这可能和我系统中安装的python版本有关

(2)修改launch载入的地图为

<arg name="world_name" value="$(find turtlebot3_gazebo)/worlds/turtlebot3_stage_2.world"/>

之后重新运行就不会报出tf的错误,同时Rviz中模型会正常显示机器人的渲染模型而不是白色STL,左下角的Realsense会显示正确的点云,在Rviz中勾选map的话题则可以看到正常的高程图数据:

动图封面

通过键盘遥控可以看到机器人在运动中地图不断建立,因此后续只需要在全局地图中获取到局部高程图,并进一步计算落足点用于控制,但实际系统中可能会存在如下的问题:

(1)运算速度不够,资料中显示不采用GPU下能实现2~3Hz的刷新;

(2)真实传感器噪声比仿真大,地图建立不如上图效果那么好;

(3)需要增加代码提取局部高程图,并通过UDP或共享内存的方式发送给步态控制器;

(4)随着机器人的运动全局地图会越来越大,对于低成本处理器如我采用的Jetson nano可能无法支撑,如何修改这个库直接构建局部地图;

动图封面

RTAB定位输出Odom,elevation mapping采用深度点云和里程计输出全局高程图