
1. 室内无GPS悬停的挑战与解决方案在无人机应用中室内环境一直是个特殊的存在。没有GPS信号、缺乏视觉特征、空间受限等因素让很多在室外游刃有余的无人机变得寸步难行。我曾经在一个仓库项目中就吃过这个亏——无人机在室外飞得好好的一进仓库就像无头苍蝇一样乱撞。后来经过多次尝试终于找到了Mid360激光雷达Fast-LIO算法这套黄金组合。这套方案的核心思路很简单用激光雷达代替人眼用算法代替大脑。大疆Mid360这款固态激光雷达体积小巧但性能强悍水平视场角达360度垂直视场角也有59度特别适合无人机这种对重量敏感的平台。而Fast-LIO作为目前最先进的激光惯性里程计算法之一能以极低的计算开销实现厘米级定位精度。实际部署时我发现有几个关键点需要注意雷达安装位置要避开螺旋桨气流干扰坐标系转换必须严格对齐ENU坐标系与机体坐标系PX4参数配置要与定位系统匹配数据传输延迟必须控制在可接受范围内2. 硬件准备与环境搭建2.1 硬件选型建议我的硬件配置如下供大家参考飞控Pixhawk 6C MiniPX4 1.15.4固件机载电脑Jetson Orin Nano建议16GB内存版本激光雷达大疆Mid360遥控链路千兆路由器实测5GHz频段效果最佳这里特别要说说路由器的选择。刚开始我用笔记本热点连接结果远程桌面卡得根本没法操作。后来换了台千兆路由器延迟立即降到可接受水平。Orin Nano的远程桌面也有个坑——开机后要等那个小图标出现才能连接直接开机就连会报错。2.2 软件环境配置首先是Mid360的驱动安装sudo apt-get install ros-$ROS_DISTRO-livox-ros-driver2然后是Fast-LIO的编译安装mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone https://github.com/hku-mars/FAST_LIO.git cd .. catkin_make source devel/setup.bash建议单独创建一个工作空间来管理这些包避免与现有系统产生冲突。我遇到过因为依赖版本不一致导致的各种奇怪问题最后都是通过新建工作空间解决的。3. 定位系统集成与调试3.1 启动流程详解正确的启动顺序很重要我总结的最佳实践是先启动雷达驱动roslaunch livox_ros_driver2 msg_MID360.launch再启动Fast-LIO算法roslaunch fast_lio mapping_mid360.launch最后启动MAVROS连接PX4roslaunch mavros px4.launch这里有个权限问题要注意第一次连接飞控时可能会遇到串口权限问题。我习惯用这个命令一键解决sudo chmod 777 /dev/tty*3.2 坐标系转换关键点坐标系对齐是最大的坑之一我花了整整两天时间才搞明白为什么无人机总是往反方向飞。关键是要确保Fast-LIO输出的odometry是ENU坐标系机体坐标系与ENU坐标系对齐QGC中设置的参数与实际情况一致这里分享一个检查方法用手移动无人机观察/mavros/vision_pose/pose话题的数据变化。机头方向移动时x增大右侧移动时y增大上升时z增大。如果发现相反就需要在代码中进行转换。4. 飞行测试与问题排查4.1 首次飞行准备在真正起飞前我强烈建议先做地面测试卸下螺旋桨手动移动无人机观察QGC中的位置反馈检查话题数据是否合理确认无误后可以使用这个Python脚本进行起飞测试#!/usr/bin/env python3 import rospy from geometry_msgs.msg import PoseStamped from mavros_msgs.msg import State from mavros_msgs.srv import CommandBool, CommandBoolRequest, SetMode, SetModeRequest current_state State() def state_cb(msg): global current_state current_state msg if __name__ __main__: rospy.init_node(offb_node_py) state_sub rospy.Subscriber(mavros/state, State, callbackstate_cb) local_pos_pub rospy.Publisher(mavros/setpoint_position/local, PoseStamped, queue_size10) rospy.wait_for_service(/mavros/cmd/arming) arming_client rospy.ServiceProxy(mavros/cmd/arming, CommandBool) rospy.wait_for_service(/mavros/set_mode) set_mode_client rospy.ServiceProxy(mavros/set_mode, SetMode) rate rospy.Rate(20) while not rospy.is_shutdown() and not current_state.connected: rate.sleep() pose PoseStamped() pose.pose.position.x 0 pose.pose.position.y 0 pose.pose.position.z 0.5 for i in range(100): if rospy.is_shutdown(): break local_pos_pub.publish(pose) rate.sleep() offb_set_mode SetModeRequest() offb_set_mode.custom_mode OFFBOARD arm_cmd CommandBoolRequest() arm_cmd.value True last_req rospy.Time.now() while not rospy.is_shutdown(): if current_state.mode ! OFFBOARD and (rospy.Time.now() - last_req) rospy.Duration(5.0): if set_mode_client.call(offb_set_mode).mode_sent: rospy.loginfo(OFFBOARD enabled) last_req rospy.Time.now() else: if not current_state.armed and (rospy.Time.now() - last_req) rospy.Duration(5.0): if arming_client.call(arm_cmd).success: rospy.loginfo(Vehicle armed) last_req rospy.Time.now() local_pos_pub.publish(pose) rate.sleep()4.2 常见问题解决方案在实际飞行中我遇到了几个典型问题螺旋桨干扰问题最初使用大桨叶时无人机一起飞就开始画圈。后来发现是螺旋桨气流干扰了雷达工作。解决方案有两个改用小尺寸螺旋桨将雷达安装在机身下方定位漂移问题如果发现无人机缓慢漂移建议检查Fast-LIO的配置参数特别是地图分辨率IMU数据是否正常坐标系转换是否正确QGC参数设置有几个关键参数必须修改EKF2_HGT_REF设置为VisionEKF2_AID_MASK启用视觉位置融合MPC_Z_VEL_MAX适当降低垂直速度限制5. 实战经验与进阶技巧经过多次实地测试我总结出几个提升稳定性的技巧雷达安装位置优化最佳安装位置是机身正下方距离螺旋桨至少15cm。我试过顶部安装结果气流干扰导致定位抖动明显增加。Fast-LIO参数调优在mapping_mid360.launch文件中这几个参数很关键param namemap_resolution value0.05/ param namemax_radius value10.0/ param namemax_iteration value5/日志分析技巧遇到问题时记得下载PX4日志分析将.ulg文件上传到https://logs.px4.io/重点检查ekf2_innovations消息观察vision_position与local_position的差异网络延迟优化如果使用远程桌面操作建议关闭不必要的图形效果降低分辨率到720p使用有线连接代替WiFi在最近的一个室内巡检项目中这套系统已经可以稳定运行30分钟以上定位误差控制在5cm以内。特别是在光线条件复杂的仓库环境中表现明显优于视觉方案。不过要提醒的是完全黑暗环境还是需要额外照明因为激光雷达也需要一定的环境光才能正常工作。