Autoware感知瞎学笔记(二)roi_object_filter
目录
无人驾驶中,我们在对激光雷达数据进行聚类得到车身周边的目标,但是很多场景下我们其实并不关心道路以外(比如建筑物)的目标信息,所以在我们聚类前就应该想办法滤除掉额外点云。因此在雷达数据预处理的时候,最好是从高精地图拿到道路信息,将我们不关心的区域过滤掉。正好最近学习autoware,我们看下autoware是怎么做的。
代码分析:
打开autoware/core_perception/launch/lidar_euclidean_cluster_detect.launch:
可以看到,在这个欧式聚类节点的launch文件中,如果使用vector_map(autoware里的“高精地图”),则会启动一个叫做roi_object_filter的包,因此我们可以大胆猜测一下,这个应该是融合高精地图信息做的,不然它设立这个标志位干什么=、=。
<group if="$(arg use_vector_map)">
<node name="object_roi_filter_clustering" pkg="roi_object_filter" type="roi_object_filter"
output="screen" ns="/detection/lidar_detector">
<param name="objects_src_topic" value="/objects"/>
<param name="wayarea_gridmap_layer" value="$(arg wayarea_gridmap_layer)"/>
<param name="sync_topics" value="false"/>
<param name="exception_list" value="[person, bicycle]"/>
</node>
<node pkg="detected_objects_visualizer" type="visualize_detected_objects" name="cluster_detect_visualization_01"
output="screen" ns="/detection/lidar_detector">
<param name="objects_src_topic" value="/objects_filtered"/>
</node>
</group>
<group unless="$(arg use_vector_map)">
<node pkg="detected_objects_visualizer" type="visualize_detected_objects" name="cluster_detect_visualization_01"
output="screen" ns="/detection/lidar_detector">
<param name="objects_src_topic" value="/objects"/>
</node>
</group>
1. roi_object_filter_node.cpp
找到core_perception下面的roi_object_filter包,并且打开roi_object_filter_node.cpp。这里便是节点的入口,RosRoiObjectFilterApp 实例化一个类,并调用其Run()方法
#include "roi_object_filter/roi_object_filter.h"
int main(int argc, char **argv)
{
ros::init(argc, argv, __APP_NAME__);
RosRoiObjectFilterApp app;
app.Run();
return 0;
}
2. roi_object_filter.cpp
2.1 构造函数
初始化一些标志位,这里可以看到gridmap网格地图的字眼,会让人联想到occupancy grid map,这里先往下继续分析
RosRoiObjectFilterApp::RosRoiObjectFilterApp()
{
gridmap_ready_ = false;
detections_ready_ = false;
processing_ = false;
}
2.2 Run()函数
void RosRoiObjectFilterApp::Run() {
ros::NodeHandle private_node_handle("~");
tf::TransformListener transform_listener;
transform_listener_ = &transform_listener;
InitializeRosIo(private_node_handle);
ROS_INFO("[%s] Ready. Waiting for data...", __APP_NAME__);
ros::spin();
ROS_INFO("[%s] END", __APP_NAME__);
}
这里是声明一个局部tf的监听器变量,然后赋值给类内全局变量。tf监听器在类内声明的时候并没有初始化,因此在主线程开始前将其初始化一下赋予一个值。下面打开主要功能函数InitializeRosIo()
void RosRoiObjectFilterApp::InitializeRosIo(ros::NodeHandle &in_private_handle) {
std::string exception_list;
ros_namespace_ = ros::this_node::getNamespace();
if (ros_namespace_.substr(0, 2) == "//") {
ros_namespace_.erase(ros_namespace_.begin());
}
objects_src_topic_ = ros_namespace_ + "/objects";
wayarea_gridmap_topic_= "/grid_map_wayarea";
std::string roi_topic_str = ros_namespace_+ "/objects_filtered";
ROS_INFO("[%s] objects_src_topic: %s", __APP_NAME__, objects_src_topic_.c_str())

最低0.47元/天 解锁文章
1501

被折叠的 条评论
为什么被折叠?



