PX4无人机|MID360使用FAST_LIO,实现自主飞行及定点——PX4无人机配置流程(六)

PX4无人机|MID360使用FAST_LIO,实现自主飞行及定点——PX4无人机配置流程(六)

PX4固件版本为1.15.4

qgc地面站版本为4.4.5

飞控,使用微空科技MicoAir743V2

机载电脑:12代i5,ubuntu20.04

安装位置:mid360的接口对应飞机的后方

推荐阅读px4+vio实现无人机室内定位_px4+室内视觉定位-ZEEKLOG博客

和飞控连接机载电脑相关,有用

代码参考:

PX4|基于FAST-LIO mid360的无人机室内自主定位及定点悬停_fastlio mid360-ZEEKLOG博客
使用视觉或动作捕捉系统进行位置估计 | PX4 指南(主) --- Using Vision or Motion Capture Systems for Position Estimation | PX4 Guide (main)

一.px4飞控设置

建议看官方文档:Using Vision or Motion Capture Systems for Position Estimation | PX4 Guide (main)

1.将px4定位数据源设置为vinsion

参数EKF2_EV_CTRL:可以默认,或者看参数手册按需配置(该教程默认)Parameter Reference | PX4 Guide (main)



EKF2_HGT_REF参数:Vision 

 2.关闭罗盘:

教程:
PX4 | 无人机关闭磁力计罗盘飞行(yaw estimate error报错解决方法)-ZEEKLOG博客

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

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

二、程序

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

1.代码

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

这里只提供代码,具体创建工作空间和功能包的步骤建议问AI

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

#!/usr/bin/python3 #上面的python3不一定是这样写,建议找ai优化一下代码,和前面的推荐文章里的CPP代码其实一样的,该代码发布频率不太对 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 abs(new_data - self.data_queue[-1]) > 0.01: self.data_queue.clear() self.window_sum = 0.0 self.data_queue.append(new_data) self.window_sum += new_data # 如果队列大小超过窗口大小,移除最早的数据 if len(self.data_queue) > self.window_size: self.window_sum -= self.data_queue.popleft() return self.window_sum / len(self.data_queue) def get_size(self): return len(self.data_queue) def get_avg(self): if self.data_queue: return self.window_sum / len(self.data_queue) else: return 0.0 class FastLIOToMavros: def __init__(self): rospy.init_node('fastlio_to_mavros', anonymous=True) # 初始化位姿和四元数 self.p_lidar_body = np.zeros(3) self.q_mav = [0, 0, 0, 1] self.q_px4_odom = [0, 0, 0, 1] self.window_size = 8 self.swa = SlidingWindowAverage(self.window_size) self.init_flag = False self.init_q = tf.transformations.quaternion_from_euler(0, 0, 0) # 订阅 Fast-LIO 的 Odometry 数据 rospy.Subscriber('/Odometry', Odometry, self.vins_callback) # 订阅 PX4 的本地位置 Odometry 数据 rospy.Subscriber('/mavros/local_position/odom', Odometry, self.px4_odom_callback) # 发布视觉位姿数据到 PX4 self.vision_pub = rospy.Publisher('/mavros/vision_pose/pose', PoseStamped, queue_size=10) self.rate = rospy.Rate(30.0) self.run() def from_quaternion_to_yaw(self, q): # 将四元数转换为 yaw 角 euler = tf.transformations.euler_from_quaternion(q) return euler[2] def vins_callback(self, msg): # 获取 Fast-LIO 提供的位姿和四元数 self.p_lidar_body = np.array([ msg.pose.pose.position.x, msg.pose.pose.position.y, msg.pose.pose.position.z ]) self.q_mav = [ msg.pose.pose.orientation.x, msg.pose.pose.orientation.y, msg.pose.pose.orientation.z, msg.pose.pose.orientation.w ] def px4_odom_callback(self, msg): # 获取 PX4 的本地位置四元数,并计算 yaw 角 self.q_px4_odom = [ msg.pose.pose.orientation.x, msg.pose.pose.orientation.y, msg.pose.pose.orientation.z, msg.pose.pose.orientation.w ] yaw = self.from_quaternion_to_yaw(self.q_px4_odom) self.swa.add_data(yaw) def run(self): while not rospy.is_shutdown(): # 初始化 yaw 角 if self.swa.get_size() == self.window_size and not self.init_flag: init_yaw = self.swa.get_avg() self.init_q = tf.transformations.quaternion_from_euler(0, 0, init_yaw) self.init_flag = True if self.init_flag: # 旋转位姿以对齐初始 yaw 角 rot_matrix = tf.transformations.quaternion_matrix(self.init_q)[:3, :3] p_enu = np.dot(rot_matrix, self.p_lidar_body) # 构建并发布视觉位姿消息 vision = PoseStamped() vision.header.stamp = rospy.Time.now() vision.header.frame_id = "map" # 根据实际情况设置 vision.pose.position.x = p_enu[0] vision.pose.position.y = p_enu[1] vision.pose.position.z = p_enu[2] vision.pose.orientation.x = self.q_mav[0] vision.pose.orientation.y = self.q_mav[1] vision.pose.orientation.z = self.q_mav[2] vision.pose.orientation.w = self.q_mav[3] self.vision_pub.publish(vision) rospy.loginfo( "\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( p_enu[0], p_enu[1], p_enu[2], self.q_mav[0], self.q_mav[1], self.q_mav[2], self.q_mav[3] ) ) self.rate.sleep() if __name__ == '__main__': try: FastLIOToMavros() except rospy.ROSInterruptException: pass 



自行创建fastlio_to_mavros节点的launch文件

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

建议参考MID360+fastlio功能笔记-ZEEKLOG博客

按照官方说法 修改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安装——解决疑难杂症- PX4无人机配置流程(三)-ZEEKLOG博客
 roslaunch mavros px4.launch

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

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

运行结果,和qgc里的画面(飞控通过数传和Windows电脑QGC连接,故而频率很低)


 

三、验证

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

你会发现一运行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再起飞,本人只试过定点飞行,没有任何问题

Read more

Spring Boot携手Leaflet,点亮省级旅游口号WebGIS可视化之路

Spring Boot携手Leaflet,点亮省级旅游口号WebGIS可视化之路

目录 前言 一、旅游口号信息管理 1、写在前面的 2、空间属性关联 二、SpringBoot后台实现 1、系统调用时序图 2、Mapper数据查询实现 3、控制层接口实现 三、Leaflet集成实现WebGIS 1、省级数据展示及可视化 2、东北三省旅游口号 3、长三角城市群口号 4、珠三角旅游口号 5、西北地区旅游口号 四、总结 前言         在当今数字化浪潮汹涌澎湃的时代,地理信息系统(GIS)技术正以前所未有的速度改变着我们对世界的认知与探索方式。它不仅为科学研究提供了强大的工具,更在旅游、城市规划、环境保护等诸多领域展现出巨大的应用潜力。而当我们将目光聚焦于旅游行业,一个充满活力与创新的领域,GIS技术的应用更是如鱼得水,为旅游体验的提升和旅        游管理的优化带来了全新的机遇。         省级旅游口号作为各地旅游宣传的重要名片,承载着地域文化的精髓与旅游资源的亮点,是吸引游客、塑造旅游品牌形象的关键要素。然而,传统的旅游口号宣传方式往往局限于文字、

【AI】coze的简单入门构建智能体

【AI】coze的简单入门构建智能体

前言:最近扣子很火,我来学习一下!扣子时新一代的AI应用平台。在扣子上搭建AI应用,只需要在界面上点击下一步下一步,做些配置,就可以快速去搭建一个AI应用。让我来看看,扣子是何方神圣吧~ 一、什么是coze? 扣子是新一代AI应用开发平台。无论你是否有编程基础,都可以在扣子上快速搭建基于大模型的各类AI应用,并将AI应用发布到各个社交平台,也可以通过API或SDK将AI应用集成到你的业务系统中。 二、coze能做什么? 扣子提供可视化设计与编排工具,通过零代码或低代码方式,快速搭建基于大模型的各类AI项目。(登录到扣子官网,进入到商店,有各种应用、插件等) * 智能体:智能体是基于对话的AI项目,能理解自然语言,调用知识库与插件,通过可视化工作流完成复杂任务,并可发布到多端使用,如智能客服、虚拟伴侣等 * 应用:利用大模型技术开发的应用程序。在扣子中搭建的AI应用具备完整业务逻辑和可视化用户界面,是一个独立的AI项目,如AI搜索、翻译工具等 * 插件:是 一个工具集,一个插件内可以包括一个或多个工具(API)。用于扩展智能体 / Bot 的功能,通过标准化接口与工作

传统制图VS AI制图:一线产区标准图效率对比

快速体验 1. 打开 InsCode(快马)平台 https://www.inscode.net 2. 输入框内输入如下内容: 开发一个效率对比工具,分别用传统方法和AI方法生成一线产区标准图。传统方法模拟人工绘制流程,AI方法使用机器学习分类。统计两种方法的时间消耗和准确率,用图表展示结果。技术栈包括Python、Pandas和Matplotlib。 3. 点击'项目生成'按钮,等待项目生成完整后预览效果 传统制图VS AI制图:一线产区标准图效率对比 最近在工作中遇到了一个需求:需要快速生成一线产区和二线产区的标准图。传统的人工绘制方法耗时耗力,于是我开始探索AI辅助制图的可能性。经过一番尝试,发现AI在数据处理、分类和可视化方面的效率提升确实令人惊喜。 传统制图流程的痛点 1. 数据收集与整理 传统方法需要人工从各种渠道收集产区数据,包括产量、地理位置、气候条件等。这个过程往往需要几天甚至几周时间,而且容易出错。 2. 分类标准制定 一线产区和二线产区的划分标准需要专家团队反复讨论确定,每次调整都需要重新处理数据。

opencode+Git集成:版本控制中AI辅助操作指南

opencode+Git集成:版本控制中AI辅助操作指南 1. 开篇:当Git遇见AI编程助手 你是否曾经在Git提交时纠结于怎么写好提交信息?或者在代码合并冲突时头疼不已?又或者想要重构代码却担心破坏现有功能? 今天我们要介绍的opencode,正是为了解决这些痛点而生。这是一个开源的AI编程助手框架,特别适合与Git版本控制系统配合使用。它能在你编码的每个环节提供智能辅助,从代码编写到提交信息生成,从冲突解决到代码审查。 最棒的是,opencode支持本地部署的模型,比如我们将要使用的Qwen3-4B-Instruct-2507,这意味着你的代码永远不会离开你的本地环境,完全保障了隐私和安全。 2. opencode是什么? 2.1 核心特点 opencode是一个2024年开源的AI编程助手框架,用Go语言编写,主打"终端优先、多模型、隐私安全"的理念。它把大语言模型包装成可插拔的智能体,支持在终端、IDE和桌面三端运行。 你可以把它理解为你的编程副驾驶,但它比一般的代码补全工具强大得多。opencode支持代码补全、重构、调试、项目规划等全流程辅助,而且可以