computing/perception/detection/fusion_tools/packages/range_vision_fusion

视觉目标和雷达目标融合


也是要接受图像消息,接受深度消息,接受相机内参消息,输出publisher_fused_objects_和pixel_cloud_fusion.h类似

TransformPoint(const geometry_msgs::Point &in_point, const tf::StampedTransform &in_transform) 按照旋转矩阵in_transform旋转point,得到cv::point3f格式的点

ProjectPoint(const cv::Point3f &in_point) 投影点到图像,明确不是3d点云,而是经过transformpoint生成的cv::point3f,将其转化为像素

TransformObject(const autoware_msgs::DetectedObject &in_detection, const tf::StampedTransform &in_transform)根据in_transform转换目标无的pose和quat,pose代表坐标,quat代表方向四元数

IsObjectInImage(const autoware_msgs::DetectedObject &in_detection)判断目标是否在图像范围内。先将目标坐标转换到相机坐标系下transformPoint,再将相机坐标系下的位置点转换到图像内projectpoint,如果像素在图像内,则返回true。

ProjectDetectionToRect(const autoware_msgs::DetectedObject &in_detection)将目标映射到图像上,找到图像中目标的边框,返回一个图像上的四边形。用目标的pose,quaternion,dimensions生成一个jsk_recognition_utils::cube,将雷达到相机的转换矩阵转换为一个eigen格式,再调用cube的transformVertices转换顶点到相机坐标系下。将顶点投影到图像中,变成像素值,cv::boundingrect生成边框

TransformRangeToVision(const autoware_msgs::DetectedObjectArray::ConstPtr &in_range_detections,                                          autoware_msgs::DetectedObjectArray &out_in_cv_range_detections,                                                autoware_msgs::DetectedObjectArray &out_out_cv_range_detections) 在点云聚类后的目标中,区分图像内的和图像外的,分别存储。调用isObjectInImage()判断点云聚类目标是在图像内还是图像外

编程技巧::头尾相连,在画边框的时候最后一个点要和第一个点相链接,不用单独写出来,可以用以下方法加入。总数多加一个,序号除以总数取余数

for (size_t i = 0; i < hull_points.size() + 1; i++)

  {

    geometry_msgs::Point32 point;

    point.x = hull_points[i % hull_points.size()].x;

    point.y = hull_points[i % hull_points.size()].y;

    point.z = min_point.z;

    convex_hull.polygon.points.push_back(point);

  }

CalculateObjectFeatures(autoware_msgs::DetectedObject &in_out_object, bool in_estimate_pose) 根据点云聚类的一个目标,计算目标的边框,用andrew Monotone chain方法超找最小凸边形。计算目标坐标,宽度,以及边框点。如果is_estimate_pose=true,则需要估计目标位姿,调用cv::minarearect生成带旋转的四边形,再根据四边形的旋转角重新计算目标的方向(orientation),tf::quaternionTFToMsg(quat, in_out_object.pose.orientation);这就提取了目标的特性。

MergeObjects(const autoware_msgs::DetectedObject &in_object_a,  const autoware_msgs::DetectedObject &in_object_b)融合两个目标的点云,就是简单的累加

GetDistanceToObject(const autoware_msgs::DetectedObject &in_object)计算到目标的距离????这貌似不是

         return sqrt(in_object.dimensions.x * in_object.dimensions.x +

              in_object.dimensions.y * in_object.dimensions.y +

              in_object.dimensions.z * in_object.dimensions.z);   这都是边长的平方,不理解


CheckMinimumDimensions(autoware_msgs::DetectedObject &in_out_object)检查目标的最小尺寸。目标壳分为car ,person, truck,bus。每个类型都是最小的尺寸,如果xyz某个小于最小尺寸则需要更换为最小尺寸

FuseRangeVisionDetections(  const autoware_msgs::DetectedObjectArray::ConstPtr &in_vision_detections,  const autoware_msgs::DetectedObjectArray::ConstPtr &in_range_detections)   融合图像聚类和点云聚类,返回的是去除掉的目标:包括 1. 在图像外的点云目标 2. 与图像目标重合的,且范围最小的点云目标 3. 在图像中有,但是在点云中没有的图像目标。1. 找到在图像中的点云目标 range_in_cv   2. 遍历每一个图像目标,求每一个目标在占图像的面积。3.遍历每一个range_in_cv点云目标,转换到图像中,求占的面积。与当前图像目标的面积进行比较,如果大于阈值,则表示两个目标属于同一个,更新点云目标的若干属性,便于与下一个图像目标比对,且将当前图像目标标记为已匹配上(最后会将没匹配上的目标图像删除)。将被过滤掉的目标的valid属性全部设置为true,表示可以merge。这个函数就是图像和点云的数据融合

以下为合并处理两条消息

SyncedDetectionsCallback(  const autoware_msgs::DetectedObjectArray::ConstPtr &in_vision_detections, const autoware_msgs::DetectedObjectArray::ConstPtr &in_range_detections)  同步图像和点云目标检测回调函数,如果图像和点云目标都为空,则返回。如果图像或点云目标为空,则pulisher_fused_objects_输出不为空的,并返回。如果没有查找到对应的坐标变换也返回。如果图像和点云都存在,则调用fuseRangeVisionDetections函数,融合图像和点云目标。最后通过pulisher_fused_objects发送,同时将vision_detections_和range_detections_两个全局变量清空。(只有图像和点云目标同时存在时才清空) 

以下为分开处理两条消息

VisionDetectionsCallBack()  图像目标接收回调函数,将图像目标赋值给vision_detections_,调用syncedDetectionsCallback()处理,并发送

RangeDetectionsCallback() 点云目标接收回调函数,将点云目标赋值给range_detections_,,调用syncedDetectionsCallback()处理,并发送

ImageCallback() 接受图片消息,并根据接收的相机内参和畸变校正矩阵,校正图像,返回赋值给image_变量

IntrinsicsCallback() 接受相机内参,和畸变矩阵等。

FindTransform(const std::string &in_target_frame, const std::string &in_source_frame)查找源坐标系到目标坐标系的变换,如果有则返回旋转矩阵。

输入

/detection/lidar_detector/objects ---> detections_range_subscriber_

/deteciton/image_detector/objects --->detections_vision_subscriber_

/camera_info ---> intrinsics_subscriber_

输出

/detection/fusion_tools/objects  ----> publisher_fused_objects_


InitializeROSIo(ros::NodeHandle &in_private_handle)初始化结点。如果sync_topics=true,则表示需要消息同步,否则分开处理。

你可能感兴趣的:(computing/perception/detection/fusion_tools/packages/range_vision_fusion)