当前位置: 华文星空 > 知识

Apollo camera驱动分析(二十九)

2021-11-22知识

相机驱动分为2部分,一部分在目录 modules\drivers\camera 中,为USB接口,另一部分在目录 modules\drivers\video 中,为网口。接下来我们开始分别介绍这2部分。

Camera目录

camera主要分为2个模块:

  1. CameraComponent 模块。负责从USB接口读取图片。
  2. CompressComponent 模块。负责压缩图片,减少传输大小。

由于可以接入多个camera相机,如果工控机或者主机上的USB接口不够用,需要接入USB-HUB,这里需要注意HUB的带宽,如果带宽不够则需要接入多个HUB,同时还需要注意HUB是否支持并发,否则每次只能启用其中的一个相机,具体可以参考USB协议。

1. camera模块

CameraComponent 模块会读取 conf 目录中相机的配置,包括图片的格式、长宽等,这里需要注意调整照片大小不要超过 MAX_IMAGE_SIZE

camera模块通过 UsbCam 类来读取照片,并且发布。 UsbCam 调用了linux v4l2 的接口,v4l2为linux下视频设备程序提供了一套接口规范。

2. 图像压缩模块

CompressComponent 模块接收图片,并且通过 cv::imencode 接口进行压缩,方便网络传输。

3. 图像解压

图像解压的功能是在tools目录下提供的,做为一个工具提供,目录在 modules\drivers\tools\image_decompress 。接收压缩的图像,输出解压的图像。采用 cv::imdecode 进行解压。

cv :: Mat mat_image = cv :: imdecode ( compressed_raw_data , cv :: IMREAD_COLOR ); cv :: cvtColor ( mat_image , mat_image , cv :: COLOR_BGR2RGB ); image -> set_width ( mat_image . cols ); image -> set_height ( mat_image . rows ); // Now olny rgb image -> set_encoding ( "rgb8" ); image -> set_step ( 3 * image -> width ());

Video目录

video模块主要是通过以太网口来读取相机数据,其中相机的配置在 conf 目录中,从配置中可以发现

required string trigger_param = 21 [ default = "f2ff" ]; // 触发参数 required uint32 metric_error_code = 22 [ default = 11 ]; required int32 fpga_dev_number = 23 [ default = - 1 ]; // FPGA编号

也就是说 采用了FPGA做为硬件触发源来触发相机拍照 ,从而实现硬件时间同步,这有2个好处,一是保证多个相机之间的时间同步,而是保证相机和激光雷达之间的时间同步。

1. CompCamerap65Compressed模块

CompCamerap65Compressed模块初始化的时候会启动一个线程来读取相机数据

video_thread_ = std :: shared_ptr < std :: thread > ( new std :: thread ( std :: bind ( & CompCamerap65Compressed :: VideoPoll , this ))); video_thread_ -> detach ();

读取数据是通过 CameraDriver 类来实现的。如果配置文件中 record:1 则会同时写入图片到硬盘,如果为0则不写入。

2. CameraDriver

CameraDriver类通过SocketInput类,通过socket接口读取视频流。

3. Tools

最后介绍下tools目录下的 video2jpg ,用来把video转换为图片。通过命令行指定

  1. input_video。需要转换的视频
  2. output_dir。输出的文件夹

FrameProcessor 类中封装了 p65Decoder 进行解码,关于视频编解码这块可以参考ffmepg的编程,包括硬解码(借助特殊硬件解码)、软解码(直接通过软件解码)。

总结

以上介绍了2种相机接入方式:USB接口和网口。USB接口一般输出是图片,而网口一般输出为视频流,同时为了保持硬件同步,有些相机还支持trigger触发的方式来获取图片,结合特定的硬件(FPGA)就可以实现。

通过把视频流上传,然后远程观看的方式,可以实现远程驾驶的监控画面。

往期回顾

  • apollo介绍(一)
  • apollo介绍之map模块(二)
  • apollo介绍之localization模块(三)
  • apollo介绍之planning模块(四)
  • apollo介绍之Routing模块(六)
  • apollo介绍之Transform模块(七)
  • apollo介绍之Canbus模块(八)
  • apollo介绍之Control模块(九)
  • apollo介绍之Perception模块(十七)
  • apollo介绍之Audio模块(十八)
  • apollo预测模块分享(二十一)
  • apollo汽车底盘适配(二十六)
  • apollo介绍之参考线(二十七)
  • 硬件驱动

  • Apollo Lidar驱动分析(二十八)
  • Apollo camera驱动分析(二十九)
  • Apollo radar驱动分析(三十)
  • Cyber框架

  • apollo介绍之cyber设计(五)
  • apollo介绍之Cyber框架(十)
  • apollo介绍之Cyber框架(十一)
  • apollo介绍之Cyber定时器(十二)
  • apollo介绍之Cyber Component(十三)
  • apollo介绍之Cyber Data(十四)
  • apollo介绍之Cyber Scheduler调度(十五)
  • apollo介绍之Cyber Async异步调用(十六)
  • apollo介绍之cyber启动(十九)
  • 高精度地图

  • apollo介绍之map模块(二)
  • 高精度地图制作
  • 高精度地图制作(二)
  • 高精度地图制作(三)
  • apollo简易制图过程(二十)
  • apollo高精度地图可视化(二十二)
  • apollo高精度地图制作(二十三)
  • apollo高精度地图标注(二十四)