跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

PX4 无人机 MID360 激光雷达 FAST-LIO 室内定位与定点悬停配置

PX4 无人机结合 MID360 激光雷达与 FAST-LIO 算法实现室内自主定位。需配置飞控参数将定位源设为视觉并关闭罗盘,编写 ROS 节点转换位姿数据至 MAVROS 话题。注意雷达频率对精度的影响,运行顺序为雷达驱动、Fast-LIO、MAVROS 及转换节点。通过 QGC 验证坐标系方向(机头向东),实飞前需调优 PID。

片刻发布于 2026/4/5更新于 2026/7/2337 浏览
PX4 无人机 MID360 激光雷达 FAST-LIO 室内定位与定点悬停配置

PX4 无人机 MID360 激光雷达 FAST-LIO 室内定位与定点悬停配置

硬件与环境准备

  • 固件版本:PX4 1.15.4
  • 地面站:QGC 4.4.5
  • 飞控:微空科技 MicoAir743V2
  • 机载电脑:12 代 i5, Ubuntu 20.04
  • 安装位置:MID360 接口对应飞机后方

建议查阅官方文档了解外部定位系统配置细节。

一、PX4 飞控设置

1. 将定位数据源设置为视觉

修改以下参数,确保飞控使用视觉/激光里程计作为主要定位源:

  • EKF2_EV_CTRL:保持默认或按需配置(本教程采用默认)
  • EKF2_HGT_REF:设置为 Vision

2. 关闭罗盘

由于依赖视觉/激光定位,需关闭磁力计以避免干扰。注意,完成此设置后上电,机头可能不再指向正北。

注意:在后续程序运行前,飞控上电默认指向北方;但加载程序后,若罗盘已关闭,机头可能指向东方(具体取决于坐标系定义)。

此外,融合激光测距数据能显著提升定位稳定性。

二、程序开发

我们需要创建一个 ROS 节点,将 Fast-LIO 输出的位姿信息转换为 MAVROS 可识别的 /mavros/vision_pose/pose 话题。

1. 核心代码

以下是 Python 脚本示例,实现了滑动窗口平滑处理及四元数转换逻辑:

#!/usr/bin/python3
import rospy
from nav_msgs.msg import Odometry
from geometry_msgs.msg import PoseStamped
import tf
import numpy as np
from collections import deque
import math

# 滑动窗口平均类,用于平滑 yaw 值
class SlidingWindowAverage:
    def __init__(self, window_size):
        self.window_size = window_size
        self.data_queue = deque()
        self.window_sum = 0.0

    def ():
        
         .data_queue  (new_data - .data_queue[-]) > :
            .data_queue.clear()
            .window_sum = 
        .data_queue.append(new_data)
        .window_sum += new_data
        
         (.data_queue) > .window_size:
            .window_sum -= .data_queue.popleft()
         .window_sum / (.data_queue)

     ():
         (.data_queue)

     ():
         .data_queue:
             .window_sum / (.data_queue)
        :
             

 :
     ():
        rospy.init_node(, anonymous=)
        
        .p_lidar_body = np.zeros()
        .q_mav = [, , , ]
        .q_px4_odom = [, , , ]
        .window_size = 
        .swa = SlidingWindowAverage(.window_size)
        .init_flag = 
        .init_q = tf.transformations.quaternion_from_euler(, , )

        
        rospy.Subscriber(, Odometry, .vins_callback)
        
        rospy.Subscriber(, Odometry, .px4_odom_callback)
        
        .vision_pub = rospy.Publisher(, PoseStamped, queue_size=)
        .rate = rospy.Rate()
        .run()

     ():
        euler = tf.transformations.euler_from_quaternion(q)
         euler[]

     ():
        .p_lidar_body = np.array([
            msg.pose.pose.position.x,
            msg.pose.pose.position.y,
            msg.pose.pose.position.z
        ])
        .q_mav = [
            msg.pose.pose.orientation.x,
            msg.pose.pose.orientation.y,
            msg.pose.pose.orientation.z,
            msg.pose.pose.orientation.w
        ]

     ():
        .q_px4_odom = [
            msg.pose.pose.orientation.x,
            msg.pose.pose.orientation.y,
            msg.pose.pose.orientation.z,
            msg.pose.pose.orientation.w
        ]
        yaw = .from_quaternion_to_yaw(.q_px4_odom)
        .swa.add_data(yaw)

     ():
          rospy.is_shutdown():
            
             .swa.get_size() == .window_size   .init_flag:
                init_yaw = .swa.get_avg()
                .init_q = tf.transformations.quaternion_from_euler(, , init_yaw)
                .init_flag = 

             .init_flag:
                
                rot_matrix = tf.transformations.quaternion_matrix(.init_q)[:, :]
                p_enu = np.dot(rot_matrix, .p_lidar_body)

                
                vision = PoseStamped()
                vision.header.stamp = rospy.Time.now()
                vision.header.frame_id = 
                vision.pose.position.x = p_enu[]
                vision.pose.position.y = p_enu[]
                vision.pose.position.z = p_enu[]
                vision.pose.orientation.x = .q_mav[]
                vision.pose.orientation.y = .q_mav[]
                vision.pose.orientation.z = .q_mav[]
                vision.pose.orientation.w = .q_mav[]

                .vision_pub.publish(vision)
                rospy.loginfo(
                    .(
                        p_enu[], p_enu[], p_enu[], .q_mav[], .q_mav[], .q_mav[], .q_mav[]
                    )
                )
            .rate.sleep()

 __name__ == :
    :
        FastLIOToMavros()
     rospy.ROSInterruptException:
        
add_data
self, new_data
# 如果新数据与上一个数据差异过大,重置队列
if
self
and
abs
self
1
0.01
self
self
0.0
self
self
# 如果队列大小超过窗口大小,移除最早的数据
if
len
self
self
self
self
return
self
len
self
def
get_size
self
return
len
self
def
get_avg
self
if
self
return
self
len
self
else
return
0.0
class
FastLIOToMavros
def
__init__
self
'fastlio_to_mavros'
True
# 初始化位姿和四元数
self
3
self
0
0
0
1
self
0
0
0
1
self
8
self
self
self
False
self
0
0
0
# 订阅 Fast-LIO 的 Odometry 数据
'/Odometry'
self
# 订阅 PX4 的本地位置 Odometry 数据
'/mavros/local_position/odom'
self
# 发布视觉位姿数据到 PX4
self
'/mavros/vision_pose/pose'
10
self
30.0
self
def
from_quaternion_to_yaw
self, q
return
2
def
vins_callback
self, msg
self
self
def
px4_odom_callback
self, msg
self
self
self
self
def
run
self
while
not
# 初始化 yaw 角
if
self
self
and
not
self
self
self
0
0
self
True
if
self
# 旋转位姿以对齐初始 yaw 角
self
3
3
self
# 构建并发布视觉位姿消息
"map"
0
1
2
self
0
self
1
self
2
self
3
self
"\nPosition in ENU:\n x: {:.3f}\n y: {:.3f}\n z: {:.3f}\nOrientation of LiDAR:\n x: {:.3f}\n y: {:.3f}\n z: {:.3f}\n w: {:.3f}"
format
0
1
2
self
0
self
1
self
2
self
3
self
if
'__main__'
try
except
pass

自行创建 fastlio_to_mavros 节点的 launch 文件,具体创建工作空间和功能包的步骤可参考 ROS 官方文档。

2. 运行 Mid360 和 Fast-LIO

修改雷达扫描频率至 30Hz。虽然默认频率可用,但需注意高频下定位精度可能受影响。

警告:实测在 30Hz 频率下,定位精度仅为 10Hz 时的 60% 左右,请慎重选择是否提高频率。

按照官方说明修改 livox_ros_driver2 中的 msg_MID360.launch,使其频率达到 30Hz。方法通常在 livox_ros_driver2 的 GitHub 仓库中。

启动命令如下:

roslaunch livox_ros_driver2 msg_MID360.launch
# 在另一个终端执行
roslaunch fast_lio mapping_mid360.launch

输入指令查看频率确认修改是否生效。

3. 运行 MAVROS

安装步骤参考 MAVROS 官方指南。启动顺序至关重要:

roslaunch mavros px4.launch

必须运行上述指令后立即启动 fastlio_to_mavros 节点。

4. 验证与调试

运行自定义 launch 文件后,观察 QGC 画面(通过数传连接 Windows 电脑时频率较低)。

文章配图

三、坐标系验证

推荐先使用官方仿真理解坐标系差异。

运行 fastlio_to_mavros 节点后,无人机机头方向会发生变化(从指向北变为指向东方,前提是罗盘已关闭)。

  • Ubuntu 上位机:输入 rostopic echo /mavros/local_position/pose,机头所指方向为正 X。
    • X 在前,Y 向左,Z 向下。
  • QGC 分析工具:打开 MAVLink Inspector,查看 LOCAL_POSITION_NED 数据。
    • NED 坐标系:X 为北,Y 为东,Z 为下。
    • 机头指向东,向东运动(机头方向),Y 会增大。
    • 向北运动(飞机左方向),X 会增大。
    • 向上运动,Z 为负数且越来越负。

实机测试现象

  • 向前方运动:QGC 的 LOCAL_POSITION_NED Y 增大,/mavros/local_position/pose X 增大。
  • 向右方运动:QGC 的 LOCAL_POSITION_NED X 变小为负数,/mavros/local_position/pose Y 变小为负数。
  • 向上运动:QGC 的 LOCAL_POSITION_NED Z 变成负数并不断减小。

文章配图 文章配图 文章配图

四、实飞建议

实机飞行前务必调好 PID 参数。本人仅测试过定点飞行模式,运行稳定无异常。

目录

  1. PX4 无人机 MID360 激光雷达 FAST-LIO 室内定位与定点悬停配置
  2. 硬件与环境准备
  3. 一、PX4 飞控设置
  4. 1. 将定位数据源设置为视觉
  5. 2. 关闭罗盘
  6. 二、程序开发
  7. 1. 核心代码
  8. 滑动窗口平均类,用于平滑 yaw 值
  9. 2. 运行 Mid360 和 Fast-LIO
  10. 在另一个终端执行
  11. 3. 运行 MAVROS
  12. 4. 验证与调试
  13. 三、坐标系验证
  14. 实机测试现象
  15. 四、实飞建议
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 认知刷新,AI 时代,“人人都是产品经理” 的全新内涵
  • Trae 集成图片素描 MCP 工具实现多风格图像转换
  • Mac 版 Stable Diffusion 环境搭建指南
  • Topaz Video AI 视频画质增强与修复软件安装指南
  • Stable Diffusion v1.5 Archive 模型部署与使用指南
  • 8 款实用 AI 绘画工具推荐:从 Midjourney 到 Stable Diffusion
  • OpenCode 接入 Kimi K2.5 配置与实战指南
  • Windows 环境下 OpenClaw 接入飞书机器人配置指南
  • 2021 年 CSP-S 信奥赛 C++ 提高组阅读程序题解析
  • Java 实现 PDF 文字与图片水印添加及 MinIO 下载实战
  • FileSaver.js 实战解析:前端文件下载通用方案
  • Ollama 下载模型太慢?试试国内 HuggingFace 镜像与 LLama-Factory 组合
  • MCP Server 实现 Excel 表格一键生成可视化图表 HTML 报告
  • C++ 类与对象:封装特性的实现与实战应用
  • OpenClaw 配置与 QQ Bot 接入指南
  • Transformer 20 个常见面试问题解析:从基础到高级
  • AI 机器人安全私信访问机制:Secure DM Pairing 实现原理
  • OpenClaw 系列:16 款 AI Agent 工具选型指南
  • C++ 智能指针详解:原理、实现与使用场景
  • GitHub 第 10 亿个仓库名为 shit,官方祝贺创造伟大屎

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online