当前位置: 首页 > article >正文

用Python+NumPy手把手复现数学建模国赛题:无人机编队纯方位定位(附完整代码)

用PythonNumPy手把手实现无人机编队纯方位定位算法在无人机集群协同飞行的场景中保持编队队形是核心技术挑战之一。当无人机需要避免电磁干扰而减少主动信号发射时如何仅通过方位信息实现精确定位就成为了关键问题。本文将带你用Python和NumPy从零实现2022年全国大学生数学建模竞赛B题的解决方案通过代码拆解数学原理最终完成无人机编队的纯方位无源定位系统。1. 问题背景与数学模型构建无人机编队飞行时通常由部分无人机发射信号其余无人机被动接收信号。通过提取信号中的方位信息接收无人机可以调整自身位置。假设编队由10架无人机组成其中9架均匀分布在半径为100m的圆周上1架FY00位于圆心位置所有无人机保持相同高度飞行我们需要建立的数学模型是当圆心无人机(FY00)和编队中另外2架无人机发射信号时其他位置略有偏差的无人机如何通过接收到的方位信息调整自身位置。核心数学原理利用正弦定理建立角度与距离的关系。对于圆周上的任意三架无人机FY00、FY01和FY02接收无人机FY0X的位置可以通过解三角形确定a/sin(A) b/sin(B) c/sin(C) 2R其中R为三角形的外接圆半径。通过测量多个角度关系我们可以建立方程组求解接收无人机的位置坐标。2. Python环境准备与基础代码框架我们使用Python的科学计算栈来实现这个定位系统import numpy as np import matplotlib.pyplot as plt from scipy.optimize import least_squares class DroneFormation: def __init__(self, radius100): self.radius radius # 编队半径 self.drones {} # 无人机位置字典 self.initialize_formation() def initialize_formation(self): 初始化理想编队位置 # 圆心无人机 self.drones[FY00] (0, 0) # 圆周上的9架无人机 angles np.linspace(0, 2*np.pi, 10)[:-1] # 0到2π均分10份取前9个 for i, angle in enumerate(angles, 1): x self.radius * np.cos(angle) y self.radius * np.sin(angle) self.drones[fFY{i:02d}] (x, y)这个基础类建立了理想编队位置后续我们将在此基础上添加定位算法。3. 纯方位定位的核心算法实现定位算法的核心是根据接收到的角度信息求解无人机位置。我们采用最小二乘法来优化位置估计def calculate_position(self, angle_measurements): 根据角度测量计算无人机位置 :param angle_measurements: 字典格式为{发射无人机编号: 测量角度} :return: 估计的(x,y)位置 def residuals(params, anchors, angles): 最小二乘法的残差函数 x, y params residuals [] for (ax, ay), measured_angle in zip(anchors, angles): # 计算理论角度 theoretical_angle np.arctan2(y - ay, x - ax) # 角度差考虑周期 angle_diff (theoretical_angle - measured_angle np.pi) % (2*np.pi) - np.pi residuals.append(angle_diff) return residuals # 准备锚点发射信号的无人机位置和测量角度 anchors [] measured_angles [] for drone_id, angle in angle_measurements.items(): anchors.append(self.drones[drone_id]) measured_angles.append(np.radians(angle)) # 初始猜测位置可以改进为更智能的初始猜测 initial_guess (self.radius * 0.8, self.radius * 0.8) # 使用最小二乘法求解 result least_squares(residuals, initial_guess, args(anchors, measured_angles)) return result.x[0], result.x[1]这个算法可以处理来自多个发射无人机的角度测量信息通过优化位置估计使得理论角度与测量角度的差异最小。4. 编队调整与可视化实现有了定位算法后我们需要实现编队调整策略每架接收无人机根据定位算法计算当前位置与理想位置比较计算调整向量分步实施调整避免过冲def adjust_formation(self, actual_positions, max_steps10): 调整编队到理想位置 :param actual_positions: 当前实际位置字典 :param max_steps: 最大调整步数 # 记录调整过程用于可视化 adjustment_history {drone_id: [pos] for drone_id, pos in actual_positions.items()} for step in range(max_steps): for drone_id in actual_positions: if drone_id FY00: continue # 圆心无人机不调整 current_pos actual_positions[drone_id] target_pos self.drones[drone_id] # 计算调整向量只移动1/4距离避免过冲 adjustment 0.25 * (np.array(target_pos) - np.array(current_pos)) new_pos np.array(current_pos) adjustment actual_positions[drone_id] tuple(new_pos) adjustment_history[drone_id].append(tuple(new_pos)) return adjustment_history可视化代码使用Matplotlib展示调整过程def plot_adjustment(self, adjustment_history): 绘制编队调整过程 plt.figure(figsize(10, 8)) # 绘制理想位置 for drone_id, pos in self.drones.items(): if drone_id FY00: plt.scatter(pos[0], pos[1], cred, marker*, s200, label圆心无人机(FY00)) else: plt.scatter(pos[0], pos[1], cblue, markero, s100, alpha0.3, label理想位置) # 绘制调整路径 for drone_id, positions in adjustment_history.items(): x [p[0] for p in positions] y [p[1] for p in positions] plt.plot(x, y, --, linewidth1) plt.scatter(x[-1], y[-1], cgreen, markers, s80, label最终位置) plt.xlabel(X坐标 (m)) plt.ylabel(Y坐标 (m)) plt.title(无人机编队位置调整过程) plt.axis(equal) plt.grid(True) plt.legend() plt.show()5. 完整系统集成与测试现在我们将所有组件集成到一个完整的系统中def simulate_complete_system(): # 初始化编队 formation DroneFormation() # 模拟实际位置加入随机偏差 actual_positions {} for drone_id, pos in formation.drones.items(): if drone_id FY00: actual_positions[drone_id] pos else: # 添加随机位置偏差 deviation np.random.uniform(-20, 20, size2) actual_positions[drone_id] (pos[0] deviation[0], pos[1] deviation[1]) # 模拟角度测量实际应用中来自传感器 angle_measurements {} for drone_id in [FY01, FY02, FY00]: # 假设这三架发射信号 angle_measurements[drone_id] np.random.uniform(0, 360) # 定位并调整 for drone_id in actual_positions: if drone_id not in angle_measurements: # 接收无人机 estimated_pos formation.calculate_position(angle_measurements) actual_positions[drone_id] estimated_pos # 调整编队 history formation.adjust_formation(actual_positions) # 可视化 formation.plot_adjustment(history)这个完整实现展示了从定位到调整的全过程读者可以在此基础上进一步优化算法或添加更多功能。6. 算法优化与性能提升基础实现虽然能工作但在实际应用中还需要考虑以下优化方向多源信息融合结合多个时间步的测量信息提高定位精度运动模型考虑无人机运动特性进行预测抗干扰处理对异常测量值进行滤波改进后的定位算法可以加入卡尔曼滤波from filterpy.kalman import KalmanFilter class EnhancedPositionEstimator: def __init__(self): self.kf KalmanFilter(dim_x4, dim_z2) # 状态(x,y,vx,vy)观测(x,y) # 初始化状态转移矩阵匀速模型 self.kf.F np.array([[1, 0, 1, 0], [0, 1, 0, 1], [0, 0, 1, 0], [0, 0, 0, 1]]) # 初始化观测矩阵 self.kf.H np.array([[1, 0, 0, 0], [0, 1, 0, 0]]) # 初始化协方差矩阵 self.kf.P * 100 self.kf.R np.eye(2) * 5 # 观测噪声 def update(self, measured_position): 用新测量值更新估计 self.kf.predict() self.kf.update(measured_position) return self.kf.x[:2] # 返回位置估计这种优化可以显著提高在噪声环境下的定位稳定性。7. 实际应用中的挑战与解决方案在实际部署这类系统时会遇到一些理论模拟中不明显的挑战挑战1测量误差累积角度传感器的精度直接影响定位结果解决方案使用高精度IMU并定期用GPS校正挑战2通信延迟无人机间的信息传递存在延迟解决方案在状态估计中显式考虑延迟补偿挑战3动态环境适应风扰等环境因素影响编队保持解决方案加入自适应控制算法以下代码展示了如何加入简单的环境适应def adaptive_adjustment(self, current_pos, target_pos, wind_estimate): 考虑环境因素的调整算法 :param wind_estimate: 估计的风速向量(x,y) # 基本调整向量 adjustment 0.25 * (np.array(target_pos) - np.array(current_pos)) # 风扰补偿简单模型 wind_compensation -0.1 * np.array(wind_estimate) # 综合调整 total_adjustment adjustment wind_compensation return tuple(np.array(current_pos) total_adjustment)8. 扩展应用不同编队队形的实现除了圆形编队这套算法也可以应用于其他队形如直线形、V字形等。关键在于定义新的理想队形位置调整定位算法中的几何关系可能增加更多的发射无人机以保证定位精度例如对于直线编队def initialize_line_formation(self, spacing50): 初始化直线编队 self.drones.clear() for i in range(10): self.drones[fFY{i:02d}] (i * spacing, 0)相应的定位算法需要调整几何关系计算但核心思路保持不变。

相关文章:

用Python+NumPy手把手复现数学建模国赛题:无人机编队纯方位定位(附完整代码)

用PythonNumPy手把手实现无人机编队纯方位定位算法 在无人机集群协同飞行的场景中,保持编队队形是核心技术挑战之一。当无人机需要避免电磁干扰而减少主动信号发射时,如何仅通过方位信息实现精确定位就成为了关键问题。本文将带你用Python和NumPy从零实现…...

【保姆级教程】不装 Anaconda,用 OpenFiles 三分钟打开 / 编辑 .ipynb,还能让 AI 直接改代码

以前打开一个 .ipynb(Jupyter Notebook)文件,要装 Python、装 Jupyter、配环境,劝退一大批刚入门的同学。这篇文章手把手教你用 OpenFiles:双击打开、自带 Python 内核、支持新建和编辑 cell、自动渲染表格 / 图表 / L…...

别再搞混了!PyTorch和OpenCV处理RGB图像时,HWC和CHW格式到底怎么选?

深度解析PyTorch与OpenCV图像格式差异:HWC与CHW的实战指南 当你第一次在PyTorch和OpenCV之间切换处理同一张RGB图像时,可能会遇到这样的报错:"Expected 4D tensor (got 3D tensor)"或者"Input type and size mismatch"。…...

百年传动革新|盖茨个人出行解决方案:重新定义二轮 / 四轮骑行体验

在全球出行产业向电动化、轻量化、高效化快速转型的当下,传动系统作为核心部件,直接决定设备性能、可靠性与用户体验。盖茨作为全球流体动力与传动解决方案的标杆企业,凭借百年技术积淀与持续材料科学创新,构建了覆盖二轮 / 四轮、…...

魔兽争霸3终极优化指南:WarcraftHelper完全使用教程

魔兽争霸3终极优化指南:WarcraftHelper完全使用教程 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为《魔兽争霸3》在现代电脑上运行…...

Mac NTFS写入终极指南:如何免费解锁Windows硬盘的完整读写权限

Mac NTFS写入终极指南:如何免费解锁Windows硬盘的完整读写权限 【免费下载链接】Free-NTFS-for-Mac Nigate: An open-source NTFS utility for Mac. It supports all Mac models (Intel and Apple Silicon), providing full read-write access, mounting, and manag…...

抖音批量下载助手:一键获取全系列作品的终极解决方案

抖音批量下载助手:一键获取全系列作品的终极解决方案 【免费下载链接】douyinhelper 抖音批量下载助手 项目地址: https://gitcode.com/gh_mirrors/do/douyinhelper 还在为手动保存抖音视频而烦恼吗?今天我要向你介绍一款神奇的抖音批量下载助手&…...

财务公司哪个更可靠

在企业的经营发展中,财务管理是至关重要的一环。对于众多中小微企业和初创企业来说,由于人力、财力等限制,选择一家可靠的财务公司进行代理记账等服务,成为了一个明智的选择。然而,市场上财务公司众多,究竟…...

手机号定位神器:5分钟搭建你的专属归属地查询系统

手机号定位神器:5分钟搭建你的专属归属地查询系统 【免费下载链接】location-to-phone-number This a project to search a location of a specified phone number, and locate the map to the phone number location. 项目地址: https://gitcode.com/gh_mirrors/…...

如何第一次使用嘎嘎降AI:零基础注册充值上传下载全流程免费图文教程

如何第一次使用嘎嘎降AI:零基础注册充值上传下载全流程免费图文教程 帮三个不同学校的同学处理过论文降AI问题,每次情况不完全一样,但流程基本是固定的。 主推工具:嘎嘎降AI(www.aigcleaner.com)&#xf…...

SITS2026安全治理框架深度拆解(含ISO/GB/T/NIST三级映射对照表)

更多请点击: https://intelliparadigm.com 第一章:SITS2026安全治理框架的演进逻辑与核心定位 SITS2026并非对既有标准的简单叠加,而是面向云原生、AI增强与零信任纵深防御场景重构的安全治理范式跃迁。其演进根植于三大现实张力&#xff1a…...

Apache Airflow 系列教程 | 第11课:XCom 与任务间通信机制

导读(Introduction) 欢迎来到 Apache Airflow 源码深度解析系列的第十一课。 在前两课中,我们学习了 TaskFlow API 的装饰器体系(第9课)和 Operator/Sensor/Hook 的设计模式(第10课)。在这两课中,一个概念反复出现但从未被深入剖析——XCom(Cross-Communication)。…...

伏昔尼布VORANIGO从多大剂量开始吃,肝功能不好了还能按原量继续吃吗?

伏昔尼布(VORANIGO)作为治疗IDH突变复发或进展性低级别胶质瘤的重要药物,其初始剂量的选择与肝功能异常时的剂量调整策略,对于确保治疗的安全性和有效性至关重要。本文将详细阐述伏昔尼布的初始剂量选择,以及肝功能不好…...

中文BERT-wwm全词掩码技术深度解析:突破中文NLP预训练瓶颈的5大架构优化

中文BERT-wwm全词掩码技术深度解析:突破中文NLP预训练瓶颈的5大架构优化 【免费下载链接】Chinese-BERT-wwm Pre-Training with Whole Word Masking for Chinese BERT(中文BERT-wwm系列模型) 项目地址: https://gitcode.com/gh_mirrors/ch/…...

使用Python快速编写第一个调用Taotoken多模型API的脚本示例

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用Python快速编写第一个调用Taotoken多模型API的脚本示例 对于初次接触大模型API的开发者而言,如何快速上手并验证不…...

别再乱摆电感了!手把手教你用LM358搭建电磁智能车传感器(附PCB文件)

电磁智能车传感器设计实战:从LM358电路优化到PCB避坑指南 在大学生智能车竞赛中,电磁组的选手们最常遇到的"玄学问题"往往集中在传感器模块——明明按照官方文档焊接的电路板,AD值却像心电图一样跳动;精心设计的电感布局…...

别再手动敲命令了!用Oracle 19c RPM预安装包在CentOS 7上快速搞定环境配置

告别手工配置:Oracle 19c RPM预安装包在CentOS 7的极速部署指南 每次看到DBA同事在终端里逐行敲击groupadd、sysctl命令时,我总想起自己第一次部署Oracle 19c时踩过的坑——内核参数漏配导致实例无法启动,权限设置错误引发安装中断&#xff0…...

wxauto架构深度解析:从UI自动化原理到企业级应用实战

wxauto架构深度解析:从UI自动化原理到企业级应用实战 【免费下载链接】wxauto Windows版本微信客户端(非网页版)自动化,可实现简单的发送、接收微信消息,简单微信机器人 项目地址: https://gitcode.com/gh_mirrors/w…...

别再以为蓝牙绝对安全了:用Kali Linux的hciconfig和hcitool,我发现了邻居的汽车OBD接口

蓝牙安全探秘:从日常设备到汽车OBD的潜在风险 1. 蓝牙技术的安全现状与普遍认知误区 蓝牙技术已经渗透到我们生活的方方面面,从无线耳机到智能家居,再到汽车电子系统。然而,大多数用户对蓝牙安全性的认知仍停留在"配对即安全…...

从零开始学Java:掌握面向对象编程的核心理念

在当今这个数字化时代,编程语言如同构建数字世界的砖瓦,而Java,以其强大的跨平台能力、丰富的库支持和广泛的应用领域,成为了众多开发者心中的首选。对于初学者而言,从零开始学习Java,掌握其核心理念——面…...

突破传统音频捕获:为什么win-capture-audio能彻底改变你的直播体验?

突破传统音频捕获:为什么win-capture-audio能彻底改变你的直播体验? 【免费下载链接】win-capture-audio An OBS plugin that allows capture of independant application audio streams on Windows, in a similar fashion to OBSs game capture and Dis…...

3步掌握FModel:轻松提取Fortnite游戏资源的终极指南

3步掌握FModel:轻松提取Fortnite游戏资源的终极指南 【免费下载链接】FModel Unreal Engine Archives Explorer 项目地址: https://gitcode.com/gh_mirrors/fm/FModel 想要提取Fortnite游戏中的3D模型、纹理和音频资源吗?FModel作为一款专业的虚幻…...

AISMM安全维度落地指南:从合规审计到AI模型投毒防护,5步构建企业级智能安全基线

更多请点击: https://intelliparadigm.com 第一章:AISMM安全维度的演进逻辑与奇点意义 AISMM(Artificial Intelligence Security Maturity Model)并非传统安全框架的线性延伸,而是AI系统在对抗性环境、数据漂移与模型…...

告别轮询!GD32F103 USBD CDC中断接收实战(基于V2.2.4库)

GD32F103 USBD CDC中断接收改造实战指南 在嵌入式开发中,USB通信协议因其高速、稳定和即插即用的特性,已成为设备与主机通信的首选方案之一。特别是CDC(Communication Device Class)协议,能够将USB设备虚拟成串口&…...

TCC-G15散热控制中心:解锁戴尔笔记本性能潜能的深度技术解析

TCC-G15散热控制中心:解锁戴尔笔记本性能潜能的深度技术解析 【免费下载链接】tcc-g15 Thermal Control Center for Dell G15 - open source alternative to AWCC 项目地址: https://gitcode.com/gh_mirrors/tc/tcc-g15 在笔记本性能调优领域,散热…...

5分钟掌握英雄联盟个性化美化:R3nzSkin国服换肤完全指南

5分钟掌握英雄联盟个性化美化:R3nzSkin国服换肤完全指南 【免费下载链接】R3nzSkin-For-China-Server Skin changer for League of Legends (LOL) 项目地址: https://gitcode.com/gh_mirrors/r3/R3nzSkin-For-China-Server 还在为英雄联盟国服的昂贵皮肤而犹…...

5000次校招简历插件实测:手动填写19.2min vs 自动填充48s,数据分析

一、背景校招季,网申填写是高频重复劳动。同一份经历在不同系统中反复录入,耗时且易错。本文基于后台脱敏数据,对一个名为“塔塔网申”的自动填充插件进行实测,统计了5000次真实填充记录(覆盖500家企业,每家…...

3分钟精通百度网盘高速下载:Python解析工具实战指南

3分钟精通百度网盘高速下载:Python解析工具实战指南 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 在当今数字化时代,百度网盘已成为国内最流行的云存…...

3步解锁Windows原生HEIC预览:告别格式转换的终极方案

3步解锁Windows原生HEIC预览:告别格式转换的终极方案 【免费下载链接】windows-heic-thumbnails Enable Windows Explorer to display thumbnails for HEIC/HEIF files 项目地址: https://gitcode.com/gh_mirrors/wi/windows-heic-thumbnails 你是否曾经在Wi…...

避开GD32 ADC的‘时钟坑’:手把手教你配置F303的采样时钟与校准顺序

GD32 ADC时钟配置实战:从原理到避坑指南 ADC采样是嵌入式开发中最基础也最易出问题的功能之一。最近在GD32F303项目中发现一个奇怪现象:当输入电压在0.415V~0.455V区间时,ADC读数会"卡住"不动。经过一周的排查,最终发现…...