segmentation-based。该类方法通常基于聚类,比如,Litomisky等人基于确定视角下的特征分布直方图(VFH, Viewpoint Feature Histogram)来从静态聚类中区分出动态聚类;Yin等人则认为相邻帧配准过程中匹配误差较大的点很可能是动态点,用这些点作为种子进行区域生长,搜索出的聚类既是动态聚类;此外,Yoon等人也提出了一种基于区域生长过滤动态聚类的方案。基于分割的方法中不得不提的还有基于深度学习的语义分割方法(deep-learning based semantic segmentation),语义分割直接label出了哪些点是动态物体,建图算法只需要直接弃掉这些点即可,简单粗暴。但是,深度学习只能分割出训练过的动态类别,对其它类别的动态物体则无能为力。
ray tracing based method 这类方法非常典型地要结合栅格去实现,可以是普通的占据栅格或者八叉树栅格。其基本原理是,激光点打到的cell,hits计数+1,激光光束穿过的cell,misses计数+1,通过hits和misses计算cell的占据概率,占据概率低于阈值,则抹除掉这个cell内的所有点。这种方法利用了动态点只会短暂地hit到某个cell,这个cell在随后的大部分时间里都会被miss的特点。这种方法的 缺点是消耗计算资源,因为一个激光点不仅产生了一个hit,同时又产生非常多的misses。当然,这个方法也可以用后处理的方式去做,比如Cartographer 3D
The obstacle_detector package provides utilities to detect and track obstacles from data provided by 2D laser scanners. Detected obstacles come in a form of line segments or circles. The package was designed for a robot equipped with two laser scanners therefore it contains several additional utilities.
resulting laser scan divides the area into finite number of circular sectors and put one point (or actually one range value) in each section occupied by some measured points
This node converts messages of type sensor_msgs/LaserScan from topic scan or messages of type sensor_msgs/PointCloud from topic pcl into obstacles which are published as messages of custom type obstacles_detector/Obstacles under topic raw_obstacles.
obstacle_tracker node
使用卡尔曼滤波追踪和过滤圆形障碍,订阅消息类型obstacle_detector/Obstacles from topic raw_obstacles and publishes messages of the same type under topic tracked_obstacles. The tracking algorithm is applied only to the circular obstacles, hence the segments list in the published message is simply a copy of the original segments. The tracked obstacles are supplemented with additional information on their velocity.
自定义的消息
CircleObstacle
1 2 3 4 5 6 7 8
// center of circular obstacle, geometry_msgs/Point center // linear velocity of circular obstacle, geometry_msgs/Vector3 velocity // radius of circular obstacle with added safety margin, float64 radius // measured radius of obstacle without the safety margin. float64 true_radius
SegmentObstacle
1 2 3 4
// first point of the segment (in counter-clockwise direction) geometry_msgs/Point first_point // end point of the segment geometry_msgs/Point last_point