获取相机码流
概述
为帮助开发者在没有 GPS 或 RTK 卫星等应用场景中实现无人机的自动化飞行控制,实现如精准悬停和避障等功能,DJI 开放了无人机视觉感知系统,开发者通过使用 PSDK 提供的 API 即可获取 DJI 无人机视觉感知系统的码流数据,并生成视差图以及点云图,结合图像识别算法,开发出满足特定使用场景需求的应用程序。
说明
- 仅使用 Linux 和 RTOS 系统开发的应用程序支持开发者使用 DJI 的高级感知功能。
- 使用 DJI PSDK 的高级感知功能时,需使用 USB 线接收无人机视觉感知系统的原始图像数据。
基础概念
相机码流
为满足开发者使用 PSDK 开发的应用程序对获取相机码流的功能,PSDK 提供了获取相机码流的功能,支持获取 FPV 相机或获取 1 号云台相机 H.264 码流和 RGB 图像。
说明
- M300 RTK 无人机支持获取 FPV 相机和所有云台相机的 H.264 码流。
- 由于获取 FPV 相机码流和获取 1 号云台上相机码流的回调函数在各自独立的线程中运行,OpenCV 的 imshow 模块仅支持在一个线程中运行,因此仅支持开发者获取 FPV 相机或获取 1 号云台相机 H.264 码流和 RGB 图像。
- 获取相机码流后,请安装 FFmpeg 等解码器解码。
- 有关 H.264 标准码流的相关参考请参见 H.264 码流标准 。
分辨率和帧频
PSDK 支持开发者获取 M300 RTK 无人机上 1 号云台上相机的码流,开发者或用户可根据实际的使用需求挂载不同型号的相机,根据相机的型号以及相机的工作模式,指定帧速率,获取所需的码流。
- 拍照模式:
- FPV 相机码流:支持获取分辨率为 608x448 的图像。
- 相机模式:支持获取分辨率为 1440x1080(1080p)、960x720(720p)的图像。
- 视频模式:支持获取分辨率为 1920x1080(1080p)、1280x720(720p)的视频。
说明: 获取 FPV 相机和主相机码流的帧速率均为 30 FPS。
相机 H.264 码流
获取 M300 RTK 无人机上相机 H.264 码流的流程如下所示:
- 使用获取相机 H.264 码流的功能前,请开发者根据实际的使用需要先实现
liveViewSampleCb
函数,用于获取并处理相机 H.264 码流。 - 调用
startH264Stream()
接口,指定所需获取码流的相机、接收相机 H.264 码流的回调函数和用户信息。 - 开启无人机和用户负载设备,运行使用基于 PSDK 开发的应用程序,此时无人机将会向用户负载设备推送 H.264 码流。
- 用户负载设备接收到 H.264 码流的数据后,将触发(作为入参传入开发者设置的回调函数中)基于 PSDK 开发的应用程序。
- 开发者根据实际需求设计的函数
liveViewSampleCb
在获取相机 H.264 码流后,将对所获得的 H.264 码流执行存储、解码及转发等相应的操作。
无人机视觉感知系统
DJI 无人机的视觉感知系统主要由无人机视感知传感器和视觉感知算法构成,在无人机飞行的过程中,感知传感器能够获取周围环境的状态,协助无人机刹车、避障和精确悬停。
- M300 RTK 支持开发者获取无人机上所有感知传感器的码流数据。
说明
- 在悬停期间若无人机受到外部干扰,无人机将会返回到原悬停点。
- 使用立体感知功能时,若无人机与无人机遥控器断开连接,无人机将会悬停。
图像类型
立体感知功能支持开发者获取的图像类型和分辨率如下所示:
- M300 RTK:支持开发者以 20 FPS,640x480 的分辨率,获取 VGA 灰度图像。
元数据
无人机视觉传感器产生的图像主要包含帧索引和时间戳两种元数据。
- 时间戳:无人机上的视觉传感器同时共享一个计时器,有关时间同步的详细说明请参见 时间同步。
- 帧索引:开发者订阅感知灰度图后,无人机感知灰度图将会附带帧索引。订阅或取消订阅感知灰度图,将不会改变或中断帧索引的序号。
获取无人机的图像
使用高级视觉功能时,开发者需要调用指定的 API 通过 USB 接口在应用程序运行的周期内订阅(或退订)相机视觉传感器的图像,并使用回调函数在专用的读取线程内获取订阅的图像。
说明
- 获取无人机视觉传感器图像时,建议安装 OpenCV 以显示图像。
- 为避免处理视觉传感器图像的工作阻塞主线程,请创建一个独立的线程处理无人机视觉传感器的图像。
使用获取相机 RGB 图像的功能
以轮询的方式获取 RGB 图像
在主线程中以轮询的方式获取 RGB 图像。
创建主线程 调用
vehicle->advancedSensing->startFPVCameraStream()
接口创建一个线程,用于读取相机原始的码流并解码成图像。检查码流状态 开发者在主循环中,需调用
vehicle->advancedSensing->newFPVCameraImageIsReady()
接口,检查相机码流的状态,若相机中有可用的码流,则调用vehicle->advancedSensing->getFPVCameraImage(fpvImage)
获取该图像。
说明: 若开发者安装了 OpenCV 库,则可通过
show_rgb
函数调用cv::imshow()
接口显示解码后的 RGB 图像。
- 销毁线程 调用
vehicle->advancedSensing->stopFPVCameraStream()
接口,断开与相机的链接,销毁读取相机码流的线程。
以回调函数的方式获取 RGB 图像
通过回调函数的方式获取 RGB 图像。
- 创建获取相机码流的线程 调用
vehicle->advancedSensing->startFPVCameraStream(&show_rgb, NULL)
接口,创建获取相机码流的线程,同时在该接口中注册回调函数show_rgb
,用于处理接收到的码流。 - 销毁线程 调用
vehicle->advancedSensing->stopFPVCameraStream()
接口,断开与相机的连接,销毁读取相机码流的线程。
使用获取相机 H.264 码流的功能
1. 开始获取相机 H.264 码流
控制应用程序接收指定相机的 H.264 码流。
LiveView::LiveViewErrCode startH264Stream(LiveView::LiveViewCameraPosition pos, H264Callback cb, void *userData);
2. 停止获取 H.264 码流
控制应用程序停止接收相机的 H.264 码流。
LiveView::LiveViewErrCode stopH264Stream(LiveView::LiveViewCameraPosition pos);
3. 保存或处理 H.264 码流
基于 PSDK 开发的应用程序获取 H.264 码流后,开发者即可对所获取的 H.264 码流执行所需的操作。
typedef void (*H264Callback)(uint8_t* buf, int bufLen, void* userData);
说明
- 开发者获取指定相机的 H.264 码流后,使用 ffplay -flags2 showall xxx.h264 命令即可播放所获取的 H.264 文件。
- 借助 PSDK 提供的 Sample (djiosdk-liveview-sample) 获取 H.264 码流数据,并将接收到的 H.264 码流数据以 H.264 文件的形式记录在本地,该文件名为
userData
。- 使用 Sample camera-stream-callback-sample 和 camera-stream-poll-sample 可借助 FFMpeg 对 H.264 码流解码。开发者可借助 Sample 实现所需的功能。
H.264 码流解析
开发者使用 Elecard StreamEye Tools,H264Visa 等 H.264 解码软件,即可解码和分析使用 PSDK 获取的 H.264 码流,如下为使用 Sample djiosdk-liveview-sample
获取 DJI 无人机上相机码流的分析结果,该视频均在室内录制,时长为 9~10 秒。
表. 相机 H.264 码流分析结果
机型 | M300 RTK / M350 RTK | M30 | M30T | M3E | M3T | M3D | M3TD | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
FPV | H30/H30T | H20/H20T/H20N | P1 | L1 | L2 | FPV | Main camera | FPV | Main camera | Main camera | Main camera | Main camera | Main camera | |
Video Stream Type | AVC/H.264 | AVC/H.264 | AVC/H.264 | AVC/H.264 | AVC/H.264 | AVC/H.264 | AVC/H.264 | AVC/H.264 | AVC/H.264 | AVC/H.264 | AVC/H.264 | AVC/H.264 | AVC/H.264 | AVC/H.264 |
Resolution | M300: 1280x720 M350: 1920x1080 | 1440x1080 | 1920x1080 | 1920x1080 | 1920x1080 | 1920x1080 | 1920x1080 | 1920x1080 | 1920x1080 | 1920x1080 IR:640x512/1280x1024 | 1920x1080 | 1920x1080 IR:640x512/1280x1024 | 1920x1080 | 1920x1080 IR:640x512/1280x1024 |
FramesRate | 30 | 30 | 30 | 30 | 30 | 30 | 30 | 30 | 30 | 30 | 30 | 30 | 30 | 30 |
BitRate (bit/s)(最大) | 16Mbps | 16Mbps | 16Mbps | 8Mbps | 8Mbps | 32Mbps | 16Mbps | 16Mbps | 16Mbps | 16Mbps IR:8Mbps | 16Mbps | 16Mbps IR:8Mbps | 16Mbps | 16Mbps IR:8Mbps |
YUV format (色彩空间) | YUV420 | YUV420 | YUV420 | YUV420 | YUV420 | YUV420 | YUV420 | YUV420 | YUV420 | YUV420 | YUV420 | YUV420 | YUV420 | YUV420 |
H.264 解码延迟情况
说明: 以下延迟数据为五次测试平均值,测试环境为:
- PSDK 版本:PSDK 3.9
- 飞行器机型:M350 RTK
- H264 解码器:FFMpeg
- 解码类型:软件解码
- 运行代码:camera-stream-callback-sample
运行平台 | 负载 | 延迟情况 |
---|---|---|
Manifold 2-G | FPV | 256 ms |
Manifold 2-G | H20T | 372 ms |
Manifold 2-G | H30T | 354 ms |
- PSDK 仅提供了对 H264 纯软件解码的代码实现
- 如有提高解码性能的需求,用户可使用硬件解码器以提高解码效率
常见问题
解码器解码时出现错误
受计算平台算力的制约,基于 PSDK 开发的应用程序在编解码时可能会出现如下问题:
- 解码速度较慢:解码器在解码第一帧时需要一段时间
- 帧丢失:计算平台算力不足
- 使用 FFmpeg 解码时出现报错:请在 Ubuntu 16.04 上尝试解码,且确认运行解码器的应用程序正确安装了 RNDIS、USB 及网口驱动,确保应用程序能够正确识别 M300 RTK 无人机。
GDR 编码格式的 H20/H20T H.264 码流有时出现 I 帧
H20/H20T 为多镜头负载相机。在 DJI Pilot 切换镜头画面时,相机的 H.264 码流会插入 I 帧帮助 DJI Pilot 图传画面进行画面构建,因此在 H.264 码流中会出现 I 帧,不影响 GDR 格式的解码过程。
适用产品
- M300 RTK:支持挂载 Z30、XTS、XT2、P1、L1、L2、H20/H20T、H30/H30T,开发者无需使用遥控器即可获取视频流
- M350 RTK:支持挂载 P1、L1、L2、H20/H20T、H30/H30T,开发者无需使用遥控器即可获取视频流
说明: PSDK 暂不支持同时获取和切换支持多种光源的相机的图像,如需切换,请在 DJI Pilot 中设置切换相机的图像。