相机驱动分为2部分,一部分在目录
modules\drivers\camera
中,为USB接口,另一部分在目录
modules\drivers\video
中,为网口。接下来我们开始分别介绍这2部分。
Camera目录
camera主要分为2个模块:
-
CameraComponent
模块。负责从USB接口读取图片。 -
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转换为图片。通过命令行指定
- input_video。需要转换的视频
- output_dir。输出的文件夹
在
FrameProcessor
类中封装了
p65Decoder
进行解码,关于视频编解码这块可以参考ffmepg的编程,包括硬解码(借助特殊硬件解码)、软解码(直接通过软件解码)。
总结
以上介绍了2种相机接入方式:USB接口和网口。USB接口一般输出是图片,而网口一般输出为视频流,同时为了保持硬件同步,有些相机还支持trigger触发的方式来获取图片,结合特定的硬件(FPGA)就可以实现。
通过把视频流上传,然后远程观看的方式,可以实现远程驾驶的监控画面。
往期回顾
硬件驱动
Cyber框架
高精度地图