AutoWare Core Perception模块学习笔记(一):image_processor

作为自动驾驶的重要一环,准确的环境感知能力能够为后续路径规划、决策控制提供重要的科学依据。当前主流的感知技术主要依赖各种传感器数据,包括图像、激光点云、毫米波雷达数据等。本节将从图像数据入手,详细解读 AutoWare Core Perception 模块中 image_processor 代码,分析其中所涉及的关键技术和操作。

首先进入 src/autoware/core_perception/interface.yaml 文件,可以看到整个 image_processor 主要包括 image_rectifierimage_rotator 两个节点操作,如下图1所示 (方框)。

                                         图1 interface.yaml 文件信息 

image_rectifier

image_rectifier.launch 

src/autoware/core_perception/image_processor/launch 文件夹下,该 launch 文件定义了 image_rectifier 操作中所涉及的节点及相应的参数信息。如下图2所示 (方框):节点 image_rectifier 包含图像名 (image_src)、相机内参信息 (camera_info_src) 等信息;而节点 calibration_publisher 主要包括激光点云-图像配准 (register_lidar2camera_tf)、外部参数矩阵 (publish_extrinsic_mat)、标定文件夹 (calibration_file)、相机帧率 (camera_frame) 等信息。

                                                                      图2 image_rectifier.launch 文件信息

image_rectifier_node.cpp

src/autoware/core_perception/image_processor/nodes/image_rectifier 文件夹下,该 cpp 文件定义了 image_rectifier 节点操作。首先,找到主函数 main() 入口,其中初始化 ROS 节点参数,调用类方法 ROSImageRectifierAPP,并执行 Run(),如下图3所示。

                                      图3 ROSImageRectifierApp 类中 main 函数

在类 ROSImageRectifierApp 中,首先申明了一些 ROS 节点和 opencv 中的图像参数,如下图4所示。随后,定义一个无类型指针 ImageCallback,用于创建 opencv 类型的图像,并根据相机内参、畸变参数、编码方式等信息对图像进行处理,最终通过 publisher_image_rectifiered_ 节点发布。

                                                    图4 ROSImageRectifierApp 类中 ImageCallback 方法参数信息

类 ROSImageRectifierApp 中还定义了 IntrinsicsCallback 指针,指定图像的宽、高参数,并利用相机内参矩阵和失真系数矩阵对图像进行处理,如下图5所示。

                                                    图5 IntrinsicsCallback 方法参数信息

此外,类中还申明了 public 方法,以便外部函数也能够访问类中方法。如下图6所示,其中 Run 指针下定义 ROS 节点的命名空间,以便后续信息的接收和发布。如 subscribe 方法用于接收信息,而 advertise 方法能够回调一个 publisher 对象,并通过对象的 publish() 函数发布信息。

                                                              图6 ROSImageRectifierApp 类中 Run 方法参数信息

image_rotator

image_rotator.launch 

src/autoware/core_perception/image_processor/launch 文件夹下,该 launch 文件定义了 image_rotator 操作中所涉及的节点及相应的参数信息。如下图7所示 (方框):节点 image_rectifier 包含图像名 (image_src)、旋转角度 (rotation_angle)、竖向镜像 (mirror_vertical)、水平镜像 (mirror_horizontal) 等信息。

                                                      图7 image_rotator.launch 文件信息

image_rotator_node.cpp

src/autoware/core_perception/image_processor/nodes/image_rotator 文件夹下,image_rotator_node.cpp 主文件中定义了节点的相关操作。同样地,首先找到主函数 main() 定义,其中包括初始化 ROS 节点参数、调用类方法 ROSImageRotatorAPP、执行 Run() 等操作如下图8所示。

                            图8 ROSImageRotatorApp 类中 main() 函数

在类 ROSImageRotatorApp 中,首先申明了一些 ROS 节点和图像参数类型,包括图像接收节点(subscriber_image_raw_)、相机参数信息节点 (subscriber_camera_info_) 以及 图像旋转信息发布节点 (publisher_image_rotated) 等,如下图9所示。然后,创建 ImageCallback 指针,定义了图像是否进行镜像变换、是否进行旋转变换、旋转角度等信息,并通过这些参数信息进行相应的仿射变换。最后利用 publisher_image_rotated 节点发布信息。

                                                        图9 ROSImageRotatorApp 类中 ImageCallback 方法信息

与 image_rectifier_node.cpp 类似,该类中同样申明了 public 方法,如下图10所示,并进一步在 Run 指针下定义 ROS 节点的命名空间,以便接收和发布信息。

                                                              图10 ROSImageRotatorApp 类中 Run 方法信息

结束语

总的来说,image_processor 部分包括 image_rectifierimage_rotator 两个节点操作,其中 image_rectifier 节点中主要是根据相机信息和畸变参数对图像进行还原矫正,而 image_rotator 节点主要是进行图像的垂直、水平翻转及不同角度旋转等处理。最后,通过各自 main() 函数调用类方法,并利用 ROS subscriberpublisher 节点进行信息的接收和发布,以执行相关操作。

发布了31 篇原创文章 · 获赞 30 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/linchunmian/article/details/105322506