基于Python matplotlib的无人机追踪模拟仿真可视化

本文介绍了如何使用Python的Matplotlib库进行无人机追踪模拟的可视化。内容包括静态图形的绘制,展示了无人机在二维平面上的飞行轨迹,以及动态图的实现,详细解释了无人机直线飞行和追踪飞行的动态模拟过程,涉及到plt.ion()和plt.sleep()函数的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Matplotlib

Matplotlib 是一个 Python 的 2D 绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形

一、静态图形

首先假设飞机飞行在某一高度位置,飞行高度不会发生变化,这样就可以在二维平面内表示飞机的飞行轨迹,让我们先把飞机飞行的平面确立下来吧。
在这里插入图片描述
假定这就是飞机飞行的平面区域,在位置为 x ∈ [ 0 , 80 ] , y ∈ [ 0 , 40 ] x∈[0,80],y∈[0,40] x[0,80],y[0,40]的平面飞行,这里为表示完全,在 x , y x,y x,y坐标轴范围左右分别延伸 1 1 1。我们以飞机的初始坐标 ( 0 , 20 ) (0,20) (0,20)为例,向东方向输出一张静态的飞机飞行轨迹。
在这里插入图片描述
散点图用 ∗ * 符号表示,这样输出的就是五角星的散点图。

实现代码
import matplotlib.pyplot as plt

plane_xcoordinate = list(range(0, 84, 4))  # 起始0,终止84,步长为4
plane_ycoordinate = [20] * len(plane_xcoordinate)  # 保证对应数组一致

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.title('轨迹图')  # 图标题
plt.xlim(-1, 81)  # x轴范围(0,80)比范围稍微多出一丢丢
plt.ylim(-1, 41)  # y轴范围(0,40)比范围稍微多出一丢丢
plt.xlabel('$x/km$')  # x轴坐标轴标注
plt.ylabel('$y/km$')  # y轴坐标轴标注
plt.scatter(plane_xcoordinate, plane_ycoordinate, marker='*', s=40, cmap='b')
plt.show()

二、动态图

动态图就是静态图一帧一帧输出,需要用到 p l t . i o n ( ) plt.ion() plt.ion() p l t . s l e e p ( ) plt.sleep() plt.sleep()两个函数,这样才能出现如下的效果,关于函数的具体用法࿰

### 构建无人机实时仿真与飞行控制平台 #### 平台概述 使用 Python 可以为无人机开发一个完整的实时仿真与飞行控制系统。该系统通常分为三个主要部分:数据生成、状态更新和可视化展示。 --- #### 数据生成模块 如果无法连接真实的无人机硬件,可以通过模拟数据实现仿真实验环境。以下是两种常见的方法: 1. **模拟数据** 使用 `random` 或 `numpy` 库生成动态变化的飞行姿态数据,例如加速度、角度或位置信息[^2]。 ```python import random import time def generate_simulated_data(): while True: data = { 'roll': random.uniform(-10, 10), # 滚转角 (°) 'pitch': random.uniform(-10, 10), # 俯仰角 (°) 'yaw': random.uniform(0, 360), # 偏航角 (°) 'altitude': random.uniform(0, 100) # 海拔高度 (m) } yield data time.sleep(0.1) # 模拟每秒10次采样频率 ``` 2. **实际数据接入** 如果有物理设备支持,则通过串口通信或其他协议读取传感器数据。例如,利用 `pyserial` 处理来自飞控单元的数据流。 ```python import serial ser = serial.Serial('COM3', baudrate=9600, timeout=1) def read_real_data(): while True: line = ser.readline().decode('utf-8').strip() if not line: continue try: roll, pitch, yaw, altitude = map(float, line.split(',')) return {'roll': roll, 'pitch': pitch, 'yaw': yaw, 'altitude': altitude} except ValueError: pass ``` --- #### 状态更新模块 为了精确描述无人机的行为,需设计其动力学模型并应用现代预测控制算法(MPC)。以下是一个简化版的状态更新逻辑示例[^3]。 ```python import numpy as np class DroneModel: def __init__(self, dt): self.dt = dt # 时间步长 self.state = np.zeros(4) # 初始状态 [x, y, vx, vy] def update(self, control_input): """根据控制输入更新无人机状态""" ax, ay = control_input self.state[0] += self.state[2] * self.dt # 更新位置 x self.state[1] += self.state[3] * self.dt # 更新位置 y self.state[2] += ax * self.dt # 更新速度 vx self.state[3] += ay * self.dt # 更新速度 vy def get_state(self): return self.state class MPCController: def __init__(self, horizon_steps, dt): self.horizon_steps = horizon_steps self.dt = dt def compute_control(self, target_position, current_state): """ 计算最优控制序列以达到目标位置 :param target_position: 目标坐标 [tx, ty] :param current_state: 当前状态 [x, y, vx, vy] :return: 控制指令 [ax, ay] """ tx, ty = target_position cx, cy, cvx, cvy = current_state # 这里仅作为占位符返回简单比例控制器的结果 k_p = 1.0 / self.dt ax = k_p * (tx - cx) ay = k_p * (ty - cy) return [ax, ay] ``` 上述代码展示了如何定义无人机的动力学方程及其对应的 MPC 控制器框架。 --- #### 可视化模块 对于实时数据显示的需求,推荐采用 Matplotlib 动态绘图功能或将 Dash/Plotly 结合 Flask 创建交互式 Web 仪表盘。 ##### 方法一:Matplotlib 实时绘制轨迹 ```python import matplotlib.pyplot as plt from drone_model import DroneModel drone = DroneModel(dt=0.1) fig, ax = plt.subplots() def plot_trajectory(ax, state_history): xs, ys = zip(*state_history) ax.clear() ax.plot(xs, ys, label="Flight Path", color='blue') ax.scatter([xs[-1]], [ys[-1]], c='red', s=50, marker='o') # 最新位置标记 ax.legend() ax.set_title("Drone Trajectory Simulation") if __name__ == "__main__": states = [] for _ in range(100): control_input = [-0.1, 0.1] # 示例控制信号 drone.update(control_input) states.append(drone.get_state()[:2]) # 存储当前位置 plot_trajectory(ax, states) plt.pause(0.1) ``` ##### 方法二:Dash + Plotly 的在线监控面板 此方案适合团队协作场景下远程查看无人机运行状况。 ```python import dash from dash import dcc, html import plotly.graph_objs as go app = dash.Dash(__name__) app.layout = html.Div([ dcc.Graph(id='live-update-graph'), dcc.Interval( id='interval-component', interval=1*1000, # 单位毫秒 n_intervals=0 ) ]) @app.callback(dash.dependencies.Output('live-update-graph', 'figure'), [dash.dependencies.Input('interval-component', 'n_intervals')]) def update_graph_live(n): # 替换为您的实际数据采集函数 simulated_data = next(generate_simulated_data()) trace = go.Scatter(x=[simulated_data['roll']], y=[simulated_data['pitch']], mode='markers+lines', name='Roll vs Pitch') layout = go.Layout(title="Real-Time Flight Data", showlegend=True, margin={'l': 50, 'r': 10, 't': 50, 'b': 10}) return {'data': [trace], 'layout': layout} if __name__ == '__main__': app.run_server(debug=True) ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值