1. 硬件准备与连接指南
想要在无GPS环境下实现稳定的无人机定位,首先需要准备好三样核心硬件:树莓派、Intel RealSense T265追踪摄像头和PX4飞控。这套组合就像是为无人机装上了"室内GPS",让它在没有卫星信号的地方也能精准定位。
树莓派我推荐使用4B型号,4GB内存版本就够用了。实测下来,这个配置运行ROS和视觉算法完全没问题。T265摄像头要特别注意选择USB 3.0接口的版本,因为USB 2.0的带宽会影响数据传输速度。我刚开始用错了接口,定位数据总是延迟,排查了半天才发现是这个原因。
硬件连接其实很简单:
- 用USB线将T265连接到树莓派的USB 3.0接口(蓝色接口)
- 通过串口或USB将树莓派与PX4飞控相连
- 给树莓派和飞控供电
这里有个小技巧:T265的安装方向很重要。官方推荐镜头朝下安装,这样坐标系方向最符合常规。我在第一次安装时没注意这个细节,结果无人机飞起来就往反方向跑,调试了好久才发现是坐标系反了。
2. 软件环境搭建详解
软件环境搭建是项目中最容易踩坑的部分。经过多次实践,我总结出了一套最稳定的安装流程。
首先要在树莓派上安装Ubuntu 20.04 Server系统。这里不建议用Raspberry Pi OS,因为对ROS的支持不够好。安装完成后,记得先更新系统:
sudo apt update && sudo apt upgrade -y接下来安装librealsense驱动。这个驱动需要从源码编译安装,过程比较耗时:
sudo apt install -y libssl-dev libusb-1.0-0-dev libudev-dev pkg-config libgtk-3-dev git clone https://github.com/IntelRealSense/librealsense.git cd librealsense git checkout v2.53.1 ./scripts/setup_udev_rules.sh mkdir build && cd build cmake ../ make -j4 sudo make installROS的安装也有讲究。推荐使用Noetic版本,这是目前最稳定的ROS1发行版:
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 -y ros-noetic-desktop-full echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc source ~/.bashrc最后安装MAVROS和vision_to_mavros这两个关键包:
sudo apt-get install ros-noetic-mavros ros-noetic-mavros-extras wget https://raw.githubusercontent.com/mavlink/mavros/master/mavros/scripts/install_geographiclib_datasets.sh sudo bash ./install_geographiclib_datasets.sh mkdir -p ~/vision_ws/src cd ~/vision_ws/src git clone https://github.com/thien94/vision_to_mavros.git catkin_init_workspace cd .. catkin_make echo "source ~/vision_ws/devel/setup.bash" >> ~/.bashrc source ~/.bashrc3. T265与PX4的配置技巧
硬件和基础软件就绪后,接下来就是关键的配置环节。这部分直接关系到视觉定位的精度和稳定性。
首先启动T265节点测试摄像头是否正常工作:
roslaunch realsense2_camera rs_t265.launch在另一个终端中,可以查看T265发布的位姿信息:
rostopic echo /camera/odom/sample如果能看到实时的位姿数据,说明T265工作正常。接下来配置vision_to_mavros,这个包负责将T265的数据转换为PX4能识别的格式:
roslaunch vision_to_mavros t265_tf_to_mavros.launchPX4飞控的参数配置是关键中的关键。通过QGroundControl连接飞控,需要修改以下参数:
| 参数名 | 推荐值 | 说明 |
|---|---|---|
| EKF2_AID_MASK | 24 | 启用视觉位置和速度融合 |
| EKF2_HGT_MODE | 3 | 使用视觉作为主要高度源 |
| EKF2_EV_DELAY | 0 | 视觉测量延迟补偿 |
| EKF2_EV_POS_X/Y/Z | 根据实际安装位置设置 | 摄像头在机体坐标系中的位置 |
我遇到过的一个典型问题是视觉定位漂移。后来发现是因为EKF2_EV_DELAY参数设置不当。这个参数表示视觉测量的延迟时间,需要根据实际系统延迟进行调整。可以通过以下命令查看延迟:
rostopic hz /mavros/vision_pose/pose4. 实战飞行测试与问题排查
一切配置完成后,就可以进行飞行测试了。但在真正起飞前,建议先做地面测试:
- 启动所有节点:
roslaunch vision_to_mavros t265_all_nodes.launch- 在QGroundControl中观察"本地位置"数据
- 手动移动无人机,检查位置数据是否跟随变化
如果地面测试正常,就可以尝试悬停测试了。这里有几个注意事项:
- 首次飞行建议在Altitude模式下起飞,然后切换到Position模式
- 飞行高度保持在1-2米,便于观察和控制
- 准备随时切换回Manual模式应对突发情况
常见问题及解决方法:
无人机漂移:
- 检查T265安装是否牢固
- 确认EKF2_EV_POS_X/Y/Z参数正确
- 尝试增大EKF2_EV_NOISE_MD参数
高度不稳定:
- 确认EKF2_HGT_MODE设置为3
- 检查T265镜头是否清洁
- 考虑增加超声波或激光测距仪辅助
数据延迟大:
- 检查USB连接是否为3.0
- 降低ROS话题发布频率
- 优化树莓派系统负载
飞行日志分析也很重要。在QGroundControl中下载飞行日志,重点关注以下指标:
- 视觉位置估计与飞控估计的差异
- EKF创新性测试值
- 传感器数据更新时间间隔
5. 进阶优化与扩展应用
基础功能实现后,还可以进行更多优化和扩展。这里分享几个实用的进阶技巧。
性能优化:
超频树莓派:在/boot/config.txt中添加:
over_voltage=2 arm_freq=1750这能提升约20%的处理速度,但要注意散热。
ROS话题优化:只订阅必要的话题,减少系统负载:
roslaunch realsense2_camera rs_t265.launch enable_gyro:=false enable_accel:=false
多传感器融合: 可以添加光流传感器或激光测距仪来提升定位精度。在PX4参数中设置:
EKF2_AID_MASK 56 # 启用视觉+光流融合 EKF2_HGT_MODE 1 # 使用测距仪高度自主飞行扩展: 结合MAVROS可以实现自动飞行。这里有个简单的起飞-盘旋-降落脚本示例:
#!/usr/bin/env python import rospy from geometry_msgs.msg import PoseStamped from mavros_msgs.msg import State from mavros_msgs.srv import CommandBool, SetMode current_state = State() def state_cb(state): global current_state current_state = state rospy.init_node('offb_node', anonymous=True) state_sub = rospy.Subscriber("mavros/state", State, state_cb) local_pos_pub = rospy.Publisher("mavros/setpoint_position/local", PoseStamped, queue_size=10) arming_client = rospy.ServiceProxy("mavros/cmd/arming", CommandBool) set_mode_client = rospy.ServiceProxy("mavros/set_mode", SetMode) pose = PoseStamped() pose.pose.position.x = 0 pose.pose.position.y = 0 pose.pose.position.z = 1 rate = rospy.Rate(20) while not current_state.connected: rate.sleep() for i in range(100): local_pos_pub.publish(pose) rate.sleep() set_mode_client(custom_mode="OFFBOARD") arming_client(True) for i in range(300): local_pos_pub.publish(pose) rate.sleep() arming_client(False)场景扩展: 这套系统不仅适用于无人机,稍加改造还可以用于:
- 室内机器人导航
- AR/VR定位系统
- 工业自动化检测
在实际项目中,我发现环境光照对T265影响较大。在光线不足或反光强烈的环境中,定位精度会下降。这时可以考虑增加红外补光灯或改用主动式深度摄像头。