ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

ArduPilot AntennaTracker 对接 Pelco-D 云台协议:pelco_d_antennatracker Lua 脚本实战指南

ArduPilot AntennaTracker 对接 Pelco-D 云台协议:pelco_d_antennatracker Lua 脚本实战指南 ArduPilot AntennaTracker 对接 Pelco-D 云台协议pelco_d_antennatracker Lua 脚本实战指南【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot本指南围绕 ArduPilot 仓库 pelco_d_antennatracker.md 与其配套脚本 pelco_d_antennatracker.lua讲解如何把 AntennaTracker天线跟踪器的舵机缩放输出转换为 Pelco-D 协议报文通过 RS-485 总线驱动电机化云台底座从电机跟踪器到 PTZ 摄像头皆可。读完本文你将掌握该脚本的参数配置、硬件接线、协议实现原理并能在自己的跟踪器/云台硬件上完成部署与调参。一、Pelco-D 协议与脚本适用场景Pelco-D 是一种广泛应用于安防 PTZPan-Tilt-Zoom摄像机和电机云台的串行控制协议。它支持两种控制模式速度/差分控制speed/differential control向云台发送左右、上下的相对运动速度指令绝对控制absolute control直接指定 pan水平与 tilt俯仰的绝对角度位置。pelco_d_antennatracker.lua目前采用速度控制将 AntennaTracker 的ContinuousRotation连续旋转类型舵机输出映射为对应的 Pelco-D 速度报文同时脚本中已预留了绝对定位命令的实现pelco_d_antennatracker.lua便于未来扩展。作者实测环境为Linux/Obale 单板机上使用USB-RS485 适配器配合一台Hikvision海康威视PTZ 摄像头。如果你的飞控FCU没有原生 RS-485 接口可使用 TTL-RS485 或 USB-RS485 适配器完成电平转换。二、脚本工作原理源码级解析2.1 脚本整体结构脚本是 ArduPilot Lua 脚本applet随固件直接内置运行无需用户编辑。核心流程如下启动时输出Starting Pelco-D Control提示通过serial:find_serial(0)找到分配给 Lua 脚本的串口并以9600 波特率初始化SERIAL_BAUD 9600见 pelco_d_antennatracker.lua在主循环update()中以50 Hz频率读取缩放后的 pan/tilt 舵机输出return update, 20表示 20 ms 周期即 50 Hz将缩放输出映射为 Pelco-D 速度报文并逐字节写入串口。脚本顶部的关键常量pelco_d_antennatracker.lualocal SERVO_PAN 71 -- SRV_Channels 功能号tracker_yaw local SERVO_TILT 72 -- SRV_Channels 功能号tracker_pitch local SERIAL_BAUD 9600 -- Antennattracker modes local MODE_STOP 1 local MODE_SCAN 2 local MODE_SERVOTEST 3 local MODE_GUIDED 4其中SERVO_PAN 71、SERVO_TILT 72对应 ArduPilot 的SRV_Channel::Function枚举中的k_tracker_yaw与k_tracker_pitch即 AntennaTracker 在 servos.cpp 中通过SRV_Channels::set_default_function(CH_YAW, SRV_Channel::k_tracker_yaw)等设置的默认功能。2.2 Pelco-D 报文格式与校验和Pelco-D 每条指令为 7 字节定长报文脚本用 Lua 表表示local msg {0xFF, 0x01, 0x00, command, pan_speed, tilt_speed, 0x00}0xFF同步字节Sync0x01摄像机地址Address此处为 10x00校验/命令第 3 字节固定 0表示标准命令组 1command命令字节bit 位组合pan_speed水平速度0–63tilt_speed垂直速度0–63末字节为校验和。校验和计算见PelcoD_msg_addchecksumpelco_d_antennatracker.lua对第 2 字节到第 6 字节求和后取mod 256写入第 7 字节function PelcoD_msg_addchecksum(msg) local sum 0 for i 2, #msg-1 do sum sum msg[i] end checksum sum % 256 msg[7] checksum end2.3 速度命令构建PelcoD_move(panspeed, tiltspeed)pelco_d_antennatracker.lua通过位操作组装命令字节local scale 63 -- max pelcod speed if panspeed 0 then -- left command set_bit(command, 2) elseif panspeed 0 then -- right command set_bit(command, 1) end if tiltspeed 0 then -- down command set_bit(command, 4) elseif tiltspeed 0 then -- up command set_bit(command, 3) end对应关系为bit1右Right、bit2左Left、bit3上Up、bit4下Down速度值取绝对值乘以63后向下取整即把-1..1的归一化输出线性映射到 Pelco-D 的0..63速度档位。2.4 主循环与工作模式update()是脚本主循环pelco_d_antennatracker.luafunction update() tilt_norm SRV_Channels:get_output_scaled(SERVO_TILT) pan_norm SRV_Channels:get_output_scaled(SERVO_PAN) if (vehicle:get_mode() MODE_SCAN or vehicle:get_mode() MODE_SERVOTEST or vehicle:get_mode() MODE_GUIDED) then -- Limit pan and tilt to -1...1 pan_normmath.max(pan_norm,-1.0) pan_normmath.min(pan_norm,1.0) tilt_normmath.max(tilt_norm,-1.0) tilt_normmath.min(tilt_norm,1.0) local msgPelcoD_move(-pan_norm,tilt_norm) send_message(msg) elseif (vehicle:get_mode() MODE_STOP) then local msgPelcoD_move(0,0) send_message(msg) end return update, 20 -- 50 hz end要点数据来源SRV_Channels:get_output_scaled(SERVO_PAN/TILT)读取的是 AntennaTracker 内部 PID 输出的缩放值。注意pan_norm传入PelcoD_move前取了负号-pan_norm因为 yaw 方向定义与云台左/右旋转方向相反tilt 则直接传入。归一化限幅将 pan/tilt 限制在-1..1与脚本注释Limit pan and tilt to -1...1一致。模式联动仅在SCAN2、SERVOTEST3、GUIDED4模式下发送速度命令在STOP1模式下发送速度为 0 的停止命令使云台停下其他模式不发送任何报文。50 Hz 刷新return update, 20让脚本以 20 ms50 Hz周期循环执行保证云台响应平滑。脚本末尾先发送一次PelcoD_move(0,0)使云台保持静止再启动循环pelco_d_antennatracker.lua。2.5 预留的绝对定位命令脚本尾部注释块中保留了四个绝对控制函数pelco_d_antennatracker.luaPelcoD_pan_absolute_position(degrees)命令字节0x4bpan 绝对位置角度 × 10016 位分两字节发送PelcoD_tilt_absolute_position(degrees)命令字节0x4dtilt 绝对位置PelcoD_zoom_absolute_position(position)命令字节0x4f变焦绝对位置PelcoD_zero_absolute_position(degrees)命令字节0x49复位绝对位置。这些函数当前未启用仅供需要绝对定位控制的二次开发参考。三、硬件准备与接线脚本通过 RS-485 差分总线与云台/PTZ 设备通信波特率固定为9600若飞控提供 RS-485 接口如 AP_Periph 或带电平转换的飞控扩展直接接线否则使用TTL-RS485或USB-RS485适配器。作者实测使用 USB-RS485 适配器接 Linux/Obale 板驱动 Hikvision PTZ 摄像头RS-485 为半双工总线需确认 A/B 两线极性正确且总线上一般只需一端接终端电阻视布线长度而定。需要注意脚本使用serial:find_serial(0)查找分配给 Lua 脚本的串口即对应SERIALx_PROTOCOL 28x 为实际串口号配置的串口相关枚举定义见 AP_SerialManager.hSerialProtocol_Scripting 28。四、参数配置完整指南原文档要求设置以下参数其中SCR_ENABLE 1与SERVO_*_TYPE 2是脚本运行的必要前提参数推荐值说明SCR_ENABLE1启用 Lua 脚本系统需刷写支持脚本的固件并在 SD 卡建立APM/scripts目录SERVO_PITCH_TYPE2pitch 舵机类型设为 ContinuousRotation连续旋转定义见 Parameters.cppSERVO_YAW_TYPE2yaw 舵机类型设为 ContinuousRotation连续旋转定义见 Parameters.cppSERIALx_PROTOCOL28将某个串口协议设为 Scriptingx 替换为实际串口号说明SERVO_*_TYPE的取值范围为0:Position, 1:OnOff, 2:ContinuousRotation见 Parameters.cpp。脚本依赖 ContinuousRotation 类型输出因为连续旋转舵机的缩放输出天然是-1..1的归一化速度量正好映射 Pelco-D 速度。对应 C 实现中SERVO_TYPE_CR2定义在 defines.hCRcontinuous rotation舵机的控制逻辑在 servos.cpppitch与 servos.cppyaw。串口协议号 28 即SerialProtocol_Scripting见 AP_SerialManager.h。五、PITCH2SRV / YAW2SRV 调参与角度限位原文档强调除上述开关参数外还需按 AntennaTracker 的说明完成PITCH2SRV / YAW2SRV PID 调参并根据你的 Pelco-D 硬件设置PITCH_MIN、PITCH_MAX与YAW_RANGE。5.1 PID 调参参数组PITCH2SRV_P / _I / _D / _IMAX / _FF / _FLTT / _FLTE / _FLTD / _SMAX / _PDMX / _D_FF / _NTF / _NEFpitch 轴 PID 控制组注册于 Parameters.cppYAW2SRV_P / _I / _D等yaw 轴 PID 控制组注册于 Parameters.cpp。在 servos.cpp位置舵机与 servos.cppCR 舵机可以看到PID 输出经update_error()计算后被写入SRV_Channels::set_output_scaled()这正是 Lua 脚本get_output_scaled读取的数值来源。因此 PID 调参质量直接决定云台跟踪的平滑度与收敛速度。对于 CR连续旋转类型pitch/yaw 输出还会被限幅到角度范围对应的 centi-degree 值。5.2 角度限位参数务必匹配云台硬件YAW_RANGEyaw 轴总运动范围度默认 360YAW_RANGE_DEFAULT 360见 config.h范围 0–360定义见 Parameters.cpp。在 servos.cpp 中yaw 角范围被换算为yaw_range * 100 / 2centi-degree即±(YAW_RANGE/2)度PITCH_MINpitch 最低角度默认 -90范围 -90–0见 Parameters.cppPITCH_MAXpitch 最高角度默认 90范围 0–90见 Parameters.cpp。这些角度限位一方面约束 AntennaTracker 内部 PID 输出范围另一方面决定脚本收到的归一化缩放输出从而影响实际发往云台的速度指令。若云台机械行程小于默认的 ±90°/360°必须把三个参数调小避免云台撞限位。5.3 舵机方向与行程参考在 servos.cpp 的注释中给出了位置舵机调参的实际例子可作参考若俯仰方向反了可设置RC2_REV -1通过RC1_MIN/RC1_MAX、RC2_MIN/RC2_MAX让舵机驱动天线到对应角度范围参考 PID 初值PITCH2SRV_P 0.1、PITCH2SRV_I 0.02、PITCH2SRV_D 0、PITCH2SRV_IMAX 4000。注意这些是针对位置舵机的示例。对于 CR 舵机与 Pelco-D 速度映射需要结合云台实际响应调整 PID 增益和方向必要时通过RC1_REV/RC2_REV修正方向若发现脚本发的左右/上下与云台实际运动相反也可检查 PID 输出符号。六、安装与运行刷写固件使用支持 Lua 脚本的 ArduPilot 固件且固件中启用AP_SCRIPTING_ENABLED。启用脚本SCR_ENABLE 1。放置脚本将pelco_d_antennatracker.lua拷贝到 SD 卡的APM/scripts/目录applet 类脚本无需用户修改安装方式见 applets/README.md。配置串口把物理串口对应参数设为SERIALx_PROTOCOL 28并接线至 RS-485 适配器。设置舵机类型SERVO_PITCH_TYPE 2、SERVO_YAW_TYPE 2。设置角度限位按云台实际行程配置PITCH_MIN、PITCH_MAX、YAW_RANGE。调参完成PITCH2SRV/YAW2SRVPID 调参。重启飞控观察 GCS 消息Starting Pelco-D Control确认脚本串口初始化成功若找不到脚本串口会报错Pelco-D: No Scripting Serial Port。七、调试与注意事项串口错误提示脚本启动时assert(serial:find_serial(0), Pelco-D: No Scripting Serial Port)会在未配置脚本串口时直接报错说明需要检查SERIALx_PROTOCOL 28是否生效。波特率匹配脚本固定 9600 波特云台/PTZ 设备需设置为相同波特率。地址字节报文中地址固定为0x01若云台地址不同需修改PelcoD_move中msg表的第 2 字节。模式行为云台仅在SCAN、SERVOTEST、GUIDED模式被驱动STOP模式发送停止指令其他模式静默调试时可切到 SERVOTEST 观察云台动作。50 Hz 发送节奏脚本 20 ms 发送一帧 7 字节报文对 9600 波特约 960 字节/秒的链路压力不大可放心使用。方向验证若云台左右/上下与预期相反从源码看 pan 传入时已取反-pan_normtilt 未取反可在不改变脚本的前提下通过RC1_REV/RC2_REV或调换 PID 输出符号修正。八、总结pelco_d_antennatracker.lua把 ArduPilot AntennaTracker 的连续旋转舵机输出无缝桥接到 Pelco-D 协议让传统 PTZ 云台或电机跟踪底座可以直接复用 ArduPilot 的自动跟踪能力。掌握其报文结构、校验和算法、速度映射与参数配置后你既可以直接按本文部署也能以此为模板扩展绝对定位、变焦控制等高级功能脚本注释中已给出对应命令实现。参考资源脚本说明文档pelco_d_antennatracker.mdLua 实现pelco_d_antennatracker.luaapplet 安装说明applets/README.mdAntennaTracker 参数定义Parameters.cppAntennaTracker 舵机控制实现servos.cpp串口协议定义AP_SerialManager.h【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表