
简介本资源是一套基于PX4飞控平台的无人机实时追踪人体的完整算法实现方案面向计算机、电子信息、自动化及机器人相关专业的本科生与研究生适用于课程设计、期末大作业及毕业设计等实践场景。项目聚焦视觉感知与飞控协同控制提供从目标检测、位姿估计到PX4 Offboard模式下的速度指令闭环追踪的全链路代码支持。压缩包共1636个文件以CMake/Make构建脚本占比超六成、Python处理脚本88个、ROS相关配置launch、msg、yaml、cfg等及少量C核心节点为主辅以说明文档与测试脚本结构完整、模块清晰便于理解PX4-ROS-Gazebo仿真与实机部署流程。资源大小为103.26MB目前已有349人学习下载包含可直接运行的算法源码、详细项目说明文档及典型场景下的调试记录有助于读者深入掌握多模态感知融合与无人机自主控制的关键技术路径。1. PX4无人机追踪人不是“识别即跟随”而是视觉闭环飞控协同的实时控制问题很多人下载“PX4无人机追踪人算法源码项目说明.zip”后第一反应是装上就能让无人机自动追着人跑结果发现编译报错、仿真不飞、摄像头没画面、目标一转身就丢——根本不是点开即用的玩具。真相是这本质是一个跨层耦合系统工程上层视觉算法输出的是像素坐标或相对位姿中层需要将其映射为机体坐标系下的速度/位置指令底层PX4飞控必须在毫秒级完成姿态解算、电机响应与抗扰补偿。它不依赖单一“AI模型”而靠YOLOv5/YOLOv8检测框→OpenCV单目测距→MAVLink协议封装→PX4 OFFBOARD模式下发→PID外环LQR内环联合调参这一整条链路严丝合缝。适合已有Ubuntu 20.04/22.04环境、能跑通PX4 SITL仿真、熟悉ROS2或MAVROS基础通信、且愿意逐层验证数据流向的开发者。如果你刚配好px4开发环境搭建正卡在ubuntu px4模拟器怎么连接Gazebo或QGC这篇就是为你拆解从源码到实飞的必过节点。2. 视觉感知层用YOLOv8单目测距实现稳定人体检测与距离估计追踪的前提是“看得准、测得稳”。本项目源码中视觉模块并非调用现成API而是基于YOLOv8n轻量模型定制训练并嵌入单目几何测距逻辑——这是区别于纯深度学习方案的关键设计。常见误用是直接把YOLO输出的bbox中心当目标位置忽略焦距、成像畸变和尺度模糊导致的定位漂移。2.1 模型训练与部署为什么选YOLOv8n而非YOLOv5s项目提供的yolov8n_person.pt权重文件经COCO-Person子集微调参数量仅3.2M推理延迟12msJetson Nano实测比YOLOv5s快1.8倍且mAP0.5高2.3%。训练时强制开启Mosaic增强与Copy-Paste数据增广解决小目标远距离人头漏检问题。部署时不走TensorRT加速避免兼容性陷阱采用ONNX Runtime CPU推理# 将.pt转为onnx需torch1.12 python export.py --weights yolov8n_person.pt --include onnx --img 640 --batch 1提示export.py位于vision/目录下务必检查--img 640与实际摄像头分辨率匹配。若用USB摄像头采集1280×720视频需在config.yaml中将input_size设为[640, 640]并启用letterbox缩放否则bbox坐标会偏移。2.2 单目测距用已知人体高度反推Z轴距离纯视觉方案无法直接获取深度本项目采用几何约束法假设被追踪者站立时肩宽约0.4m、身高约1.7m利用摄像头内参矩阵K计算目标在图像平面的物理尺寸再通过相似三角形反推距离。核心公式为$$ Z \frac{f \cdot H_{real}}{h_{pixel}} $$其中$f$为焦距像素单位$H_{real}$为真实身高米$h_{pixel}$为检测框高度像素。项目中vision/depth_estimator.py实现如下# python vision/depth_estimator.py def estimate_distance(bbox, K, real_height1.7): bbox: [x1,y1,x2,y2] in pixel coordinates K: camera intrinsic matrix [[fx,0,cx],[0,fy,cy],[0,0,1]] h_pixel bbox[3] - bbox[1] if h_pixel 20: # 过小则不可靠 return None fx K[0, 0] distance (fx * real_height) / h_pixel return max(0.5, min(15.0, distance)) # 距离限幅0.5~15m注意K矩阵必须通过camera_calibration.py标定获得不能使用默认值。实测显示未标定情况下3m距离误差达±1.2m标定后误差压缩至±0.15m。标定时需打印A4棋盘格拍摄15张不同角度图像运行python calibrate.py --images ./calib_images/生成camera_params.yaml。2.3 数据同步用ROS2 TimeSynchronizer对齐图像与IMU时间戳视觉与飞控数据不同步是追踪抖动的主因。项目采用ROS2message_filters的ApproximateTimeSynchronizer容忍50ms内的时间偏差# python tracker_node.py from message_filters import ApproximateTimeSynchronizer, Subscriber from sensor_msgs.msg import Image, Imu def callback(img_msg, imu_msg): # img_msg.header.stamp与imu_msg.header.stamp自动对齐 cv_img self.bridge.imgmsg_to_cv2(img_msg, bgr8) # ... 后续处理 # 订阅话题需严格匹配launch文件中的remap image_sub Subscriber(self, Image, /camera/image_raw) imu_sub Subscriber(self, Imu, /mavros/imu/data) ats ApproximateTimeSynchronizer([image_sub, imu_sub], queue_size10, slop0.05) ats.registerCallback(callback)关键参数说明queue_size10防止消息堆积slop0.05即50ms容差超过此值丢弃旧消息。若实测仍抖动需检查/camera/image_raw发布频率是否≥15Hz低于10Hz会导致控制滞后。3. 控制决策层将像素坐标转换为PX4可执行的OFFBOARD速度指令视觉输出的是图像坐标$(u,v)$和距离$Z$但PX4飞控只接受机体坐标系下的$[V_x,V_y,V_z]$速度指令单位m/s或$[x,y,z]$位置目标单位m。本项目选择速度控制模式因其响应更快、抗风扰更强且避免位置环积分饱和。3.1 坐标系转换从像素→相机→机体→NED整个转换链路共4步缺一不可步骤输入输出关键公式/工具1. 像素→相机坐标$(u,v,Z)$$[X_c,Y_c,Z_c]$$[X_c,Y_c,Z_c]^T Z \cdot K^{-1} \cdot [u,v,1]^T$2. 相机→机体坐标$[X_c,Y_c,Z_c]$$[X_b,Y_b,Z_b]$旋转矩阵$R_{cb}$由/camera/camera_info中rectification_matrix提供3. 机体→NED坐标$[X_b,Y_b,Z_b]$$[V_n,V_e,V_d]$乘以机体朝向四元数$q$调用tf2_ros转换4. NED→PX4指令$[V_n,V_e,V_d]$SETPOINT_VELOCITY_LOCAL_NED封装为MAVLink消息项目中control/velocity_generator.py实现步骤1-3# python control/velocity_generator.py def pixel_to_ned_velocity(u, v, distance, K, R_cb, q_ned2body): u,v: detection center in pixel distance: estimated Z in meter K: camera intrinsic (3x3) R_cb: rotation from camera to body frame (3x3) q_ned2body: quaternion from NED to body (geometry_msgs/Quaternion) # Step 1: pixel to camera coord uv1 np.array([u, v, 1.0]) xyz_c distance * np.linalg.inv(K) uv1 # Step 2: camera to body xyz_b R_cb xyz_c # Step 3: body to NED (using quaternion rotation) # Convert quaternion to rotation matrix R_bn R_bn quaternion_to_rotation_matrix(q_ned2body) vel_ned R_bn xyz_b # [V_n, V_e, V_d] return vel_ned参数说明R_cb从/camera/camera_info的rectification_matrix字段读取q_ned2body来自/mavros/local_position/pose的orientation字段。若无人机未起飞q_ned2body为零值此时需先解锁并悬停再启动追踪节点。3.2 OFFBOARD模式切换三步确保PX4接收外部指令PX4默认拒绝外部控制必须显式切换至OFFBOARD模式并持续发送心跳包。项目launch/tracker_launch.py中包含# 启动后立即发送模式切换请求 def set_offboard_mode(): rospy.wait_for_service(/mavros/set_mode) try: flightModeService rospy.ServiceProxy(/mavros/set_mode, SetMode) isModeChanged flightModeService(custom_modeOFFBOARD) return isModeChanged.mode_sent except rospy.ServiceException as e: print(service set_mode call failed: %s % e) # 每200ms发送一次心跳否则500ms无指令将自动退出OFFBOARD def send_heartbeat(): rate rospy.Rate(5) # 5Hz while not rospy.is_shutdown(): msg CommandLong() msg.command mavlink.MAV_CMD_COMPONENT_ARM_DISARM msg.param1 1.0 # arm msg.param2 0.0 msg.target_system 1 msg.target_component 1 pub_cmd.publish(msg) rate.sleep()关键细节/mavros/set_mode服务调用后需等待/mavros/state/mode话题返回OFFBOARD才开始发速度指令心跳包必须用CommandLong类型param11.0表示arm状态维持否则PX4判定超时并切回MANUAL模式。3.3 速度指令限幅与平滑避免突变导致电机啸叫原始视觉输出的速度可能跳变如目标瞬时遮挡后恢复直接下发会导致无人机剧烈晃动。项目采用一阶低通滤波硬限幅# control/smooth_filter.py class VelocityFilter: def __init__(self, alpha0.3, max_v1.2): self.alpha alpha # 滤波系数0.1~0.5间调节 self.max_v max_v # 最大速度限幅m/s self.last_v np.array([0.0, 0.0, 0.0]) def update(self, raw_v): smooth_v self.alpha * raw_v (1 - self.alpha) * self.last_v # 限幅xyz三轴独立限制 smooth_v np.clip(smooth_v, -self.max_v, self.max_v) self.last_v smooth_v return smooth_v # 使用示例 filter VelocityFilter(alpha0.25, max_v1.0) ned_vel pixel_to_ned_velocity(u, v, dist, K, R_cb, q) cmd_vel filter.update(ned_vel) # [V_n, V_e, V_d]调参指南alpha0.25对应时间常数≈400ms适合步行速度0.8~1.2m/s若目标为奔跑2m/s以上需将max_v提升至1.5并减小alpha至0.15以降低延迟实测alpha0.4会导致响应迟钝alpha0.1则滤波失效。4. PX4飞控层配置固件参数使OFFBOARD速度控制稳定可靠即使视觉与控制层输出完美指令若PX4固件参数未适配仍会出现“指令下发但不动”“缓慢漂移”“突然俯冲”等问题。本项目依赖PX4 v1.13.3固件重点调整以下三组参数4.1 位置/速度控制器增益外环P值决定响应灵敏度PX4速度控制由MC_VEL_PXY水平速度比例增益和MC_VEL_PZ垂直速度比例增益主导。默认值MC_VEL_PXY0.3过于保守导致追踪迟滞参数默认值推荐值效果说明MC_VEL_PXY0.300.85提升水平方向跟踪带宽减少稳态误差MC_VEL_PZ0.500.75加快升降响应避免目标靠近时急降MC_VEL_I_XY0.050.02减小积分项防止累积漂移MC_ACC_HOR_MAX3.02.5限制加速度避免电机过载修改方式SITL仿真# 进入PX4控制台 make px4_sitl_default gazebo # 在QGroundControl中打开“参数”页面搜索MC_VEL_PXY并设为0.85 # 或命令行刷写需重启 echo param set MC_VEL_PXY 0.85 /tmp/params.txt param load /tmp/params.txt验证方法在QGC中打开“实时图”→“飞行控制器”→“速度控制”观察VELOCITY_CONTROL_XY曲线。理想状态是指令下发后0.3s内达到90%目标值超调15%。4.2 OFFBOARD超时与安全机制防止失控坠机PX4默认COM_OBL_RC_FOFFBOARD遥控器失效保护为Disabled一旦地面站断连无人机会悬停而非降落。项目强制启用并设为Land参数值作用COM_OBL_RC_F1OFFBOARD模式下遥控器失效时执行预设动作COM_OBL_ACT0动作类型0降落1返航2悬停NAV_RCL_ACT0遥控器信号丢失时动作与COM_OBL_RC_F协同注意COM_OBL_RC_F1必须配合RC_MAP_OFFB通道映射通常为遥控器第8通道否则无效。实测中若未配置此参数仿真中断网后无人机会保持最后指令持续飞行直至撞墙。4.3 传感器融合策略禁用GPS干扰视觉追踪当无人机在室内或GPS信号弱区运行时PX4默认启用EKF2_AID_MASK中的GPS辅助反而引入定位噪声。项目要求关闭GPS融合# QGC参数页设置 EKF2_AID_MASK 0 # 禁用所有外部辅助GPS/视觉/气压计 EKF2_HGT_MODE 2 # 高度估计源2气压计室内更稳 EKF2_DECL_TYPE 1 # 磁偏角来源1内部模型避免罗盘干扰原理说明视觉追踪依赖相对位置精度而GPS绝对定位在室内误差5m强行融合会污染EKF状态估计。关闭后EKF仅依赖IMU气压计水平位置发散率0.1m/s满足10m内追踪需求。5. 实战调试技巧用三类日志快速定位“追踪失败”的根因当无人机无法稳定追踪时90%的问题集中在数据流断裂而非算法错误。掌握以下日志分析法可将排错时间从小时级压缩至10分钟内。5.1 ROS2话题连通性诊断确认视觉→控制→飞控链路畅通运行ros2 topic list检查关键话题是否存在# 必须存在的5个话题缺失任一即链路中断 /ros2 topic list | grep -E (image_raw|local_position|velocity_setpoint|mavros/state|camera_info) # 正常输出应包含 # /camera/image_raw # /mavros/local_position/pose # /mavros/setpoint_velocity/cmd_vel # /mavros/state # /camera/camera_info若/mavros/setpoint_velocity/cmd_vel缺失检查tracker_node.py是否成功订阅/camera/image_raw若/mavros/local_position/pose无数据说明PX4未启动或MAVROS未连接。5.2 MAVLink消息解析用Wireshark捕获真实下发指令PX4与地面站通信基于MAVLink协议直接抓包可验证指令是否发出及内容是否正确在Ubuntu安装Wiresharksudo apt install wireshark启动SITL后运行sudo wireshark -i lo -Y udp.port14550默认MAVLink端口过滤mavlink.protocol_version 2 mavlink.msgid 32SET_POSITION_TARGET_LOCAL_NED消息关键字段解读vx,vy,vz: 实际下发的NED速度单位m/stype_mask:0b110111111000表示仅控制速度忽略位置/加速度time_boot_ms: 时间戳若连续两帧间隔500ms说明控制节点卡顿5.3 PX4 EKF状态监控判断飞控是否信任自身定位在QGC中打开“分析”→“日志浏览器”加载飞行日志.ulg文件查看estimator_status消息字段正常值异常含义health_flags0x00000001所有传感器健康bit0IMU OKvel_test_ratio0.5速度观测残差小EKF收敛pos_test_ratio0.5位置观测残差小terrain_alt_validTrue地形高度有效影响Z轴控制若vel_test_ratio 1.0持续5秒说明EKF认为速度测量不可靠会抑制外部速度指令——此时需检查IMU校准或降低MC_VEL_PXY增益。终极验证技巧在tracker_node.py中临时插入rospy.loginfo(fCMD: {cmd_vel})同时用ros2 topic echo /mavros/setpoint_velocity/cmd_vel监听若两者数值一致但无人机不动则100%是PX4固件参数或OFFBOARD模式未激活问题无需修改算法代码。本文还有配套的精品资源点击获取