保姆级教程:在Ubuntu 20.04上用Realsense T265给PX4无人机做室内定位(避坑指南)
零基础实战:Ubuntu 20.04下Realsense T265与PX4的室内定位系统搭建
在无人机自主飞行领域,室内环境下的精准定位一直是技术难点。传统GPS信号在室内完全失效,而基于视觉的定位方案则成为理想选择。Intel Realsense T265相机凭借其内置的视觉惯性里程计(VIO)功能,配合PX4飞控的开源生态,为无人机爱好者提供了一套高性价比的室内定位解决方案。本文将手把手带你完成从硬件组装到软件调试的全过程,特别针对新手容易遇到的坑点提供解决方案。
1. 硬件准备与环境搭建
1.1 硬件选型与连接
搭建室内定位系统需要以下核心硬件组件:
- 计算平台:推荐使用Intel NUC或类似性能的x86迷你PC,至少4GB内存
- 视觉传感器:Intel Realsense T265(注意不是D400系列)
- 飞控系统:PX4兼容飞控如Pixhawk 2.4.8或4系列
- 连接方式:
- T265通过USB 3.0连接计算平台
- 飞控通过USB或Telem2接口与计算平台连接
特别注意:T265对供电稳定性敏感,建议使用带外置供电的USB Hub或主板的原生USB 3.0接口
1.2 Ubuntu系统基础配置
在计算平台上安装Ubuntu 20.04 LTS后,需要完成以下基础配置:
# 安装ROS Noetic基础包 sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 sudo apt update sudo apt install ros-noetic-desktop-full # 配置ROS环境 echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc source ~/.bashrc1.3 相机物理安装要点
T265的安装位置和方式直接影响定位精度:
- 安装方向:推荐镜头朝下安装,这是大多数室内场景的最优配置
- 减震处理:必须使用隔振材料(如3M减震泡棉)隔离机体振动
- 位置校准:测量相机光学中心相对于飞控IMU的精确偏移量,记录以下参数:
- X轴偏移(前后方向)
- Y轴偏移(左右方向)
- Z轴偏移(垂直方向)
2. 软件栈安装与配置
2.1 Realsense驱动深度配置
安装官方驱动时需要注意版本兼容性:
# 安装核心驱动包 sudo apt-get install ros-noetic-realsense2-camera \ ros-noetic-realsense2-description \ ros-noetic-realsense2-msgs # 添加udev规则 sudo cp ~/catkin_ws/src/realsense-ros/realsense2_camera/udev/99-realsense-libusb.rules /etc/udev/rules.d/ sudo udevadm control --reload-rules && sudo udevadm trigger验证驱动安装成功的标志是能够正常获取设备信息:
rs-enumerate-devices | grep -E "Name|Serial"2.2 VIO桥接包定制化安装
Auterion官方VIO桥接包需要从源码编译:
# 创建工作空间 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src # 克隆VIO桥接包(备选镜像源) git clone https://gitee.com/mirrors_px4/VIO.git || \ git clone https://github.com/Auterion/VIO.git # 安装依赖项 cd ~/catkin_ws rosdep install --from-paths src --ignore-src -y # 编译(注意调整线程数) catkin_make -j$(nproc)编译常见问题解决:
| 错误类型 | 解决方案 |
|---|---|
| 缺少tf2_sensor_msgs | sudo apt install ros-noetic-tf2-sensor-msgs |
| Eigen3版本冲突 | 手动指定路径:export Eigen3_DIR=/usr/include/eigen3 |
| 链接错误 | 清理后重新编译:catkin clean && catkin_make |
2.3 MAVROS高级配置
MAVROS是PX4与ROS通信的桥梁,推荐使用定制配置:
# ~/catkin_ws/src/mavros/mavros/launch/px4_config.yaml 中添加: local_position: frame_id: "map" child_frame_id: "base_link" tf_send: true tf_frame_id: "map" tf_child_frame_id: "odom"启动MAVROS时建议分离飞控连接与数据转发:
# 独立启动MAVROS核心节点 roslaunch mavros px4.launch fcu_url:="/dev/ttyACM0:57600" gcs_url:="udp-b://@"3. 传感器标定与坐标系对齐
3.1 相机-飞控外参标定
T265与飞控IMU的坐标系转换是关键配置,修改bridge_mavros.launch中的静态TF:
<node pkg="tf" type="static_transform_publisher" name="tf_baseLink_cameraPose" args="0.05 0 -0.03 0 1.5708 0 base_link camera_pose_frame 100"/>参数解析:
- 前三位:相机在飞控坐标系中的位置偏移(米)
- 后三位:旋转弧度(偏航、俯仰、横滚)
- 1.5708≈π/2,表示相机俯仰90度(镜头朝下)
3.2 PX4参数关键配置
通过QGroundControl修改以下关键参数:
| 参数名 | 推荐值 | 说明 |
|---|---|---|
| EKF2_AID_MASK | 24 | 启用视觉位置和偏航融合 |
| EKF2_HGT_MODE | 3 | 高度源设为视觉 |
| EKF2_EV_DELAY | 0 | 视觉测量延迟补偿 |
| EKF2_EV_POS_X/Y/Z | 实测值 | 相机相对飞控的位置 |
重要提示:修改EKF2参数后必须重启飞控才能生效
3.3 系统级验证流程
完整的验证分为三个层次:
传感器层面:
rostopic echo /camera/odom/sample -n1检查T265原始输出是否正常
桥接层面:
rostopic echo /mavros/odometry/out确认MAVROS收到的位姿信息
飞控层面: 在QGC的MAVLink Inspector中检查
LOCAL_POSITION_NED消息
4. 飞行测试与问题排查
4.1 首次飞行检查清单
进行室内飞行前必须完成以下检查:
- [ ] 确认机体在手持状态下位姿输出稳定
- [ ] 检查所有线缆有应力释放措施
- [ ] 确保飞行区域光照充足(>100lux)
- [ ] 移除环境中的重复纹理(如纯色墙面)
- [ ] 设置安全开关和紧急停止机制
4.2 典型问题解决方案
问题1:飞行中持续漂移
可能原因:
- 相机减震不足
- 环境特征点不足
- 坐标系配置错误
解决步骤:
- 加强相机减震(更换更软的泡棉)
- 在地面铺设临时纹理(如方格纸)
- 重新检查TF树:
rosrun tf view_frames evince frames.pdf
问题2:MAVROS连接不稳定
优化措施:
# 提高MAVLink通信优先级 sudo nice -n -20 roslaunch mavros px4.launch fcu_url:="serial:///dev/ttyACM0:921600"问题3:VIO延迟明显
调优方法:
- 降低图像分辨率:
<!-- 在realsense启动文件中添加 --> <param name="enable_sync" value="true"/> <param name="align_depth" value="false"/> - 限制ROS话题带宽:
rosrun topic_tools throttle messages /camera/odom/sample 30
4.3 性能优化技巧
通过实时监控系统资源使用情况来发现瓶颈:
# 综合监控脚本 watch -n 1 "echo 'CPU: ' $(top -bn1 | grep 'rosmaster' | awk '{print $9}')%; \ echo 'MEM: ' $(free -m | awk '/Mem/{print $3}')MB; \ echo 'TF延迟: ' $(rosrun tf tf_monitor | grep 'Average delay')"对于需要长期运行的场景,建议创建systemd服务:
# /etc/systemd/system/vio_bridge.service [Unit] Description=VIO Bridge Service After=network.target [Service] ExecStart=/bin/bash -c "source /home/user/catkin_ws/devel/setup.bash && \ roslaunch px4_realsense_bridge bridge_mavros.launch" Restart=always User=user [Install] WantedBy=multi-user.target5. 进阶应用与扩展
5.1 多机协同定位
通过TF树实现多无人机坐标系统一:
# 在每台无人机上运行 import tf2_ros broadcaster = tf2_ros.StaticTransformBroadcaster() transform = geometry_msgs.msg.TransformStamped() transform.header.stamp = rospy.Time.now() transform.header.frame_id = "world" transform.child_frame_id = "uav1/map" transform.transform.translation.x = 0 # 相对世界坐标系偏移 transform.transform.translation.y = 0 transform.transform.translation.z = 0 transform.transform.rotation.w = 1.0 broadcaster.sendTransform(transform)5.2 室外VIO-GPS融合配置
当需要室内外无缝切换时,修改PX4参数:
# 设置多源融合模式 param set EKF2_AID_MASK 56 # 启用GPS+视觉 param set EKF2_HGT_MODE 1 # 高度源自动切换5.3 自定义轨迹跟踪实现
基于ROS Action实现航点飞行:
class WaypointAction(object): def __init__(self): self._as = actionlib.SimpleActionServer( 'waypoint', WaypointAction, execute_cb=self.execute_cb, auto_start=False) self.pose_pub = rospy.Publisher('/mavros/setpoint_position/local', PoseStamped, queue_size=10) def execute_cb(self, goal): pose = PoseStamped() pose.pose.position.x = goal.x pose.pose.position.y = goal.y for i in range(100): self.pose_pub.publish(pose) rate.sleep() self._as.set_succeeded()6. 关键参数参考表
下表总结了T265与PX4集成中的核心参数:
| 参数类别 | 关键参数 | 典型值 | 调整策略 |
|---|---|---|---|
| 相机参数 | enable_pose_jumping | false | 防止位姿跳变 |
| pose_smoothing | true | 平滑输出 | |
| MAVROS | conn/heartbeat_rate | 5.0 | 降低心跳频率 |
| PX4 EKF | EKF2_EV_NOISE_MNE | 0.05 | 视觉噪声系数 |
| EKF2_EV_DELAY | 0.01 | 视觉延迟补偿 | |
| 控制参数 | MPC_XY_VEL_MAX | 2.0 | 限制最大速度 |
在飞行测试中发现,当环境纹理特征丰富时,可以将EKF2_EV_NOISE_MNE降低到0.03以获得更高精度;而在光照不足的环境中,建议提高到0.08以增强鲁棒性。
