探索环境部分主要包括移动双轮差速机器人模拟器,传感器模拟器,局部路径规划器,可视化工具,路点发布example,路点发布rviz插件,地形分析程序,扩展地形分析程序等.


主要的程序功能由terrain_analysis和local_planner这两个功能包
loam_interface | loam的接口,作用是将loam输出的里程计进行坐标系转换,同时将单帧点云装换到全局坐标系map下面输入给localPlanner. |
local_planner | 局部路径规划planner,输入机器人里程计和目标路点,输出控制指令cmd_vel.用于局部路径规划导航,其中包括了localPlanner和pathFoller两部分,localplanner作用是规划局部路径,pathFollower作用是根据规划的局部轨迹进行轨迹跟踪,核心思想和pid差不多. |
terrain_analysis(主要是地面分割) | 地形分析,叠加多帧点云,将机器人周围区域的地面进行可行驶区域分析,不能通行的区域会以点云的形式传输给localPlanner,用于localPlanner避障. |
terrain_analysis_ext | 扩展地形分析,从rviz结果来看是对更大区域的地形进行了可行驶区域进行分析,具体代码内容还没有看. |
vehicle_simulator | 该ros包主要功能是实现了一个双轮差动底盘的模拟,接收cmd_vel速度信息,自己手写的机器人运动学微分方程来对机器人位姿进行推算,从而输出里程计odometry,而gazebo只是用来做模型显示.该包中包含了CMU制作的几个探索gazebo world,分别包含了不同的环境类型. |
velodyne_simulator | velodyne激光雷达模拟器,velodyne开源gazebo插件 |
visualization_tools | 可视化工具,将探索过程中的三个实验指标曲线进行可视化,通过matplotlib绘图显示出来,包括探索体积 探索路程 每次规划计算时间. |
waypoint_example | 路点发布example程序,将设置好的路点写到data目录下面,运行就能安装顺序发布路点,从而进行逐个路点导航. |
waypoint_rviz_plugin | waypoint发布的rviz插件,运行此插件后,rviz就能通过waypoint按钮鼠标点击发布路点,直接进行导航. |
tare的sensor_coverage_planner_ground.cpp 1326行的回调函数execute才是全部代码核心循环执行部分
CMU所提供的点云地面分割算法在其提供的仿真环境下,效果比较明显,可以有效的识别地面与障碍物。
首先还是对参数简单的介绍一下:
double scanVoxelSize = 0.05;---点云下采样
double decayTime = 2.0;--- 点云时间差阈值 大于则不会被处理
double noDecayDis = 4.0;--- 点云距离阈值 小于该阈值不考虑时间差
double clearingDis = 8.0;--- 该距离外的点会被清除
bool clearingCloud = false;--- 清除距离外的点云
bool useSorting = true;
double quantileZ = 0.25;--- 考虑地面附近高程最小值会改变
bool considerDrop = false;
bool limitGroundLift = false;
double maxGroundLift = 0.15;
bool clearDyObs = false;
double minDyObsDis = 0.3;
double minDyObsAngle = 0;
double minDyObsRelZ = -0.5;
double minDyObsVFOV = -16.0;
double maxDyObsVFOV = 16.0;
int minDyObsPointNum = 1;
bool noDataObstacle = false;
int noDataBlockSkipNum = 0;
int minBlockPointNum = 10;---计算有效高程的最小点云数量
double vehicleHeight = 1.5;---车辆的高度
int voxelPointUpdateThre = 100;---需要处理的体素网格点云数量最小值
double voxelTimeUpdateThre = 2.0;---更新体素网格时间阈值
double minRelZ = -1.5;---点云处理的最小高度
double maxRelZ = 0.2;---点云处理的最大高度
double disRatioZ = 0.2;---点云处理的高度与距离的比例
// terrain voxel parameters
float terrainVoxelSize = 1.0;---地形的分辨率
int terrainVoxelShiftX = 0;---地形中心与车体的偏移量
int terrainVoxelShiftY = 0;---地形中心与车体的偏移量
const int terrainVoxelWidth = 21;---地形的宽度
int terrainVoxelHalfWidth = (terrainVoxelWidth - 1) / 2;
const int terrainVoxelNum = terrainVoxelWidth * terrainVoxelWidth;
// planar voxel parameters
float planarVoxelSize = 0.2;---平面的分辨率
const int planarVoxelWidth = 51;---平面的宽度
int planarVoxelHalfWidth = (planarVoxelWidth - 1) / 2;
const int planarVoxelNum = planarVoxelWidth * planarVoxelWidth;

和 LocalPlanner 中一样,地形分割所接收到的点云信息同样也是在map坐标系下,因此首先要将其转换到车体坐标系下,即base_link,还包括点云的裁剪。在进行地面分割之前,做了一个点云滚动的操作。如下图所示,紫色的点云为 terrainVoxelCloud 地形,其他彩色则为分割后的结果,可发现其分割的区域并不完全是地形点云。因此猜想,这个点云滚动的操作,可能是为了同步点云和车辆的位置,毕竟点云是在map坐标下下的,比如说因为某些延迟,导致车辆与切割的点云信息存在偏差。当偏差大于 terrainVoxelSize 一个格子大小时,就通过翻滚,将车辆位置与点云位置进行配准。
.................参考以下文章。
2.terrain_analysis
terrain_analysis是一种进行地面点云分割的算法,其主要的程序流程如下图。

CMU的自主环境探索利用matlab生成前向三次样条路径点
在CMU开源的自主环境探索算法中,机器人或者无人机的主要是靠matlab进行前向三次样条曲线生成路径点的方式进行的,这部分程序在matlab中运行并且生成相应的文件,从而为local_planner提供帮助。
float score = (1 - sqrt(sqrt(dirWeight * dirDiff))) * rotDirW * rotDirW * rotDirW * rotDirW * penaltyScore;