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

PX4 无人机 MID360 配合 FAST_LIO 实现自主飞行与定点配置

介绍基于 PX4 固件 1.15.4 与微空科技 MicoAir743V2 飞控,结合 MID360 激光雷达与 FAST_LIO 算法实现无人机室内自主定位及定点悬停的配置流程。主要步骤包括将 PX4 定位数据源设置为视觉(Vision),关闭磁力计罗盘,编写 ROS 节点将 Fast-LIO 位姿发布为 MAVROS 视觉位姿话题,并调整雷达扫描频率。通过验证坐标系方向与实际运动的一致性,确保定位系统正常工作。

星云发布于 2026/4/5更新于 2026/5/2121 浏览
PX4 无人机 MID360 配合 FAST_LIO 实现自主飞行与定点配置

PX4 无人机 MID360 配合 FAST_LIO 实现自主飞行与定点配置

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

一、PX4 飞控设置

1. 将 PX4 定位数据源设置为 Vision

参数 EKF2_EV_CTRL:可以默认,或者看参数手册按需配置。 参数 EKF2_HGT_REF:Vision

2. 关闭罗盘

注意: 走完飞控设置后,机头上电后会指向北。但在走完下面的程序后,你会发现上电后无人机机头指向东方(罗盘已经被关了)。

此外,加一个激光测距融合好处多多。

二、程序

注意: 下面我把雷达等频率改到了 30HZ,但是在这频率下,定位精度实测只能有 10HZ 的 60% 不到,慎重选择是否改频率!!!!!

1. 代码

接下来创建发布 /mavros/vision_pose/pose 话题的功能包过程。

主要功能:将转化后的位姿信息以话题 /mavros/vision_pose/pose 发布。

#!/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 add_data(self, new_data):
        # 如果新数据与上一个数据差异过大,重置队列
        if self.data_queue and (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:
        
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
# 将四元数转换为 yaw 角
return
2
def
vins_callback
self, msg
# 获取 Fast-LIO 提供的位姿和四元数
self
self
def
px4_odom_callback
self, msg
# 获取 PX4 的本地位置四元数,并计算 yaw 角
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 文件。

2. 运行 mid360 和 fastlio 的程序,修改雷达扫描频率

按照官方说法修改 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

roslaunch mavros px4.launch

必须运行上面指令后马上运行下面的 fastlio_to_mavros。

4. 运行自己创建的 fastlio_to_mavros 节点的 launch 文件

三、验证

推荐用官方的仿真来理解坐标系。

你会发现一运行 fastlio_to_mavros 节点,无人机机头突然从指向北变成指向东方(确保罗盘已经被关了)。

在 Ubuntu 上位机看输入 rostopic echo /mavros/local_position/pose 机头所指的方向为正 X。X 在前,Y 朝向左,Z 朝向下。

打开 QGC、点左上角 Analyze Tools -> MAVlink 检测,出现了 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. 一、PX4 飞控设置
  3. 1. 将 PX4 定位数据源设置为 Vision
  4. 2. 关闭罗盘
  5. 二、程序
  6. 1. 代码
  7. 滑动窗口平均类,用于平滑 yaw 值
  8. 2. 运行 mid360 和 fastlio 的程序,修改雷达扫描频率
  9. 在另一个终端中执行
  10. 3. 运行 mavros
  11. 4. 运行自己创建的 fastliotomavros 节点的 launch 文件
  12. 三、验证
  13. 实机向前方运动
  14. 实机向右方运动
  15. 当飞机向上运动
  16. 实机建议调好 PID 再起飞,本人只试过定点飞行,没有任何问题
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • C++ STL string 类从零实现详解
  • Web 安全学习体系与常见漏洞实战解析
  • 软件正交架构的设计原则与核心优势
  • 基于 WebGIS 实现 80 年代风格老式天气预报系统
  • 大模型学习路线与实战项目推荐:多模态、医学 AI 及数字人
  • AIGC 工作流技术资产化与商业化变现指南
  • Spring Boot 数据仓库与 ETL 工具集成实战
  • Java 注解与反射实战:自定义注解的定义与应用
  • Java Set 集合并非完全无序:LinkedHashSet 与 TreeSet 详解
  • React Native 自定义弹窗警告框
  • 可信赖的大型语言模型综述:提出可信大模型七大维度
  • 构建 Vue 全局错误处理体系,实现业务与错误解耦
  • STL 模型体积与质量计算 Python 工具使用指南
  • MCP 插件配置实战:browser-tools-mcp 集成指南
  • 数据结构核心:顺序表的原理与模拟实现
  • 网络安全基础:成为专业安全研究员需掌握的十大核心技能
  • 基于 Java 和 Leaflet 的湖南省道路长度 WebGIS 系统构建
  • 大模型(LLM)学习全攻略:从基础数学到工程化落地
  • Linux 线程互斥:原理、实战与 C++ RAII 封装
  • VSCode Copilot 接入智谱 GLM-4 及任意大模型方案

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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