PX4 相机架构/集成
本主题简要概述了 PX4 相机支持功能是如何 实现 的。
INFO
有关 使用 相机的信息,请参阅 相机。
综述
PX4 集成了三种类型的相机:
- 支持相机协议 v2 的 MAVLink 相机(推荐),相机协议 v2 可参考 Camera Protocol v2。
- 支持旧版相机协议 v1 的简单 MAVLink 相机,相机协议 v1 可参考 Camera Protocol v1。
- 连接到飞行控制器输出端口的相机,这些相机使用 相机协议 v1 进行控制。
所有这些相机都需要响应通过 MAVLink 接收到的或在任务中找到的 MAVLink 命令(具体协议取决于相机类型)。
下面将介绍所使用的总体架构。
MAVLink 相机(相机协议 v2)
除了 将任务中的相机指令重新作为命令发出 之外,PX4 对于 支持相机协议 v2 的 MAVLink 相机 没有特定的处理方式。
地面站需要直接与这些相机进行通信以发送命令。 如果需要,必须配置 PX4 以便在相机和地面站之间路由 MAVLink 通信流量。
INFO
camera_trigger
、camera_capture
和 camera_feedback
模块不适用于此类相机。
连接到飞行控制器的相机
连接到飞行控制器输出端口的相机 需要 PX4 激活输出端口以触发相机,并且可能需要 PX4 检测 相机拍摄引脚 是否已被相机热靴触发(以便更准确地记录相机拍摄时间)。
这项工作由三个 PX4 组件处理:camera_trigger
驱动程序、camera_capture
驱动程序、camera-feedback
模块。
camera_trigger
订阅 VehicleCommand 主题,并监控其 支持的命令 的更新情况。 当通过 MAVLink 接收到命令,或者在 任务中到达相机指令位置时,就会发生这些更新。
这些命令用于启用和禁用触发功能,并按时间和距离间隔配置触发。 该驱动程序会跟踪这些间隔,并在需要时触发输出端口。 驱动程序会发布一个 CameraTrigger 主题(feedback
字段设置为 false
),这会导致发出 CAMERA_TRIGGER MAVLink 消息。
如果启用了 camera_capture
驱动程序,它会监控相机拍摄引脚,并在触发时发布一个 CameraTrigger 主题(feedback
字段设置为 true
),这同样会导致发出 CAMERA_TRIGGER MAVLink 消息。
camera_feedback
模块监控 CameraTrigger 主题的更新,并针对来自 camera_trigger
或 camera_capture
的 CameraTrigger
更新发布一个 CameraCapture 主题。 所使用的信息取决于相机拍摄引脚是否启用以及 CameraTrigger.feedback
字段的值。 这个 CameraCapture
主题会被记录下来,可用于获取拍摄时间。
MAVLink 相机(相机协议 v1)
支持旧版相机协议 v1 的 MAVLink 相机 的集成方式与 连接到飞行控制器的相机 非常相似。
camera_trigger
订阅 VehicleCommand 主题,并监控其 支持的命令 的更新情况。 当通过 MAVLink 接收到命令,或者在 任务中找到相机指令时,就会发生这种情况。
这些命令用于启用和禁用触发功能,并按时间和距离间隔配置触发。 该驱动程序会跟踪这些间隔,但使用 “MAVLink 后端” 时,实际上不需要触发任何输出端口(因为命令会被转发到相机)。 当相机会触发时,驱动程序会发布一个 CameraTrigger 主题(feedback
字段设置为 false
),这会导致发出 CAMERA_TRIGGER MAVLink 消息。 然后 camera_feedback
模块应该记录相应的 CameraCapture
主题。
任务中的相机命令
对于所有支持的 相机协议 v2 和 相机协议 v1 命令,PX4 会将任务中找到的相机指令重新作为 MAVLink 命令发出。 发出的命令的系统 ID 与自动驾驶仪的 ID 相同。 命令的组件 ID 可能会有所不同,但通常会发送到 MAV_COMP_ID_CAMERA (100) 或 MAV_COMP_ID_ALL(有关每种情况下使用的 ID,请参阅各个相机文档)。
只要有可用于发送的 MAVLink 通道,无论是否连接了任何类型的相机,都会发出这些命令。
INFO
更一般地说,PX4 会重新发出所有可能被外部 MAVLink 组件(如云台)使用的任务命令。 航路点和条件行为的命令不会被发出。
以下部分突出了代码库中一些值得关注的部分:
任务中支持的命令
任务中支持的命令(包括相机命令)在以下方法中展示:
bool FeasibilityChecker::checkMissionItemValidity(mission_item_s &mission_item, const int current_index)
format_mavlink_mission_item()
重新发出任务中相机命令的流程
void Mission::setActiveMissionItems()
- 任务项在设置为活动状态时会被执行。
- 在此方法的末尾会调用
issue_command(_mission_item)
来发送当前的非航路点命令。MissionBlock::issue_command(const mission_item_s &item)
- 为任务项创建一个飞行器命令,然后调用
publish_vehicle_cmd
发布它(_navigator->publish_vehicle_cmd(&vcmd);
)。void Navigator::publish_vehicle_cmd(vehicle_command_s *vcmd)
- 对于一些相机命令,它会将组件 ID 设置为相机组件 ID(
vcmd->target_component = 100; // MAV_COMP_ID_CAMERA
)。 - 所有其他命令则发布到默认组件 ID。
- 会发布
VehicleCommand
UORB 主题。
- 对于一些相机命令,它会将组件 ID 设置为相机组件 ID(
- 为任务项创建一个飞行器命令,然后调用
MAVLink 流代码会监控 VehicleCommand
主题的变化,并通过 MAVLink 发布这些变化。 无论相机是 MAVLink 相机还是连接到飞行控制器的相机,都会发送 MAVLink 命令。
如果启用了 camera_trigger
驱动程序,它也会监控 VehicleCommand
的变化。 如果为连接到飞行控制器输出端口的相机配置了后端,它将适当地触发这些输出端口。
日志
当 CameraTrigger
发生更新时,会记录 CameraCapture
主题。 记录的主题将取决于相机拍摄引脚是否启用。
请注意,使用 支持相机协议 v2 的 MAVLink 相机 时,不会记录相机拍摄事件,因为相应的触发事件不会在 PX4 内部生成。