下个星期就要参加中国工程机加粗样式器人大赛了,此之前一直是玩 类人形机器人以及ROS二轮差速小车,和三轮全向小车,从未涉及到四轴飞行器系列,因此,等我比完赛我要开始涉足四旋翼系列…
在淘宝上买了一些硬件之后,先不急,由于抱着练手 matplotlib 的心情来Python仿真四旋翼的飞行过程,在此之间趁机学习四旋翼飞行原理,所需的数学知识…
由于刚刚接触四旋翼,在仿真与实操的情况下,有可能哪里说得不对,那么,看过的小伙伴如果发现了我的错误,请留言告诉我,大家一起讨论…

首先,在桌面新建一个文件夹,名字自拟,反正我的叫做: Quadrotor
然后我们就可以在此目录下,新建python脚本了…
我使用的编辑器是 Anaconda自带的 Spyder, 同时也用 PycharmPython自带的ide

打开 Spyder 我们新建 Python脚本,命名为:

Quadrotor.py

然后,就开始编写程序:
既然是 matplotlib 仿真,我们必然是要导入 特定的模块:

import matplotlib.pyplot as plt

导入这个模块我们是为了以图形的方式来展现我们的四旋翼飞机;
创建自定义3D图像;

plt.ion()
fig = plt.figure()
self.ax = fig.add_subplot(111, projection='3d')

plt.ion():
使用plt.ion()这个函数,使matplotlib的显示模式转换为交互(interactive)模式。即使在脚本中遇到plt.show(),代码还是会继续执行。有时候,在plt.show()之前一定不要忘了加plt.ioff(),如果不加,界面会一闪而过,并不会停留。那么动态图像是如何画出来的,请看下面这段代码:




这是最终的效果图…

在这里 介绍旋转矩阵:
维基百科解释的旋转矩阵

还有这篇:非常好!
http://blog.miskcoo.com/2016/12/rotation-in-3d-space



这是我建立的旋转矩阵函数:
在此之前,我们先导入标准库:

from math import cos, sin

还有特殊向量格式的numpy

import numpy as np

def transformation_matrix(self):x = self.xy = self.yz = self.zroll = self.rollpitch = self.pitchyaw = self.yawreturn np.array([[cos(yaw) * cos(pitch), -sin(yaw) * cos(roll) + cos(yaw) * sin(pitch) * sin(roll), sin(yaw) * sin(roll) + cos(yaw) * sin(pitch) * cos(roll), x],[sin(yaw) * cos(pitch), cos(yaw) * cos(roll) + sin(yaw) * sin(pitch) *sin(roll), -cos(yaw) * sin(roll) + sin(yaw) * sin(pitch) * cos(roll), y],[-sin(pitch), cos(pitch) * sin(roll), cos(pitch) * cos(yaw), z]])

此后,接着写:在这里面…

在这里我们必须注意了解的是这些函数:

1.np.matmul() 两个数组的矩阵乘积。
https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.matmul.html

2.plt.xlim 获取或设置当前x轴的限制。
https://matplotlib.org/api/_as_gen/matplotlib.pyplot.xlim.html

3.plt.ylim 获取或设置当前y轴的限制。
https://matplotlib.org/api/_as_gen/matplotlib.pyplot.xlim.html

4.plt.pause(0.001) 暂停间隔秒
https://matplotlib.org/api/_as_gen/matplotlib.pyplot.pause.html

5.np.array 创建一个数组
https://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html

6.plt.cla() 清除当前轴
https://matplotlib.org/api/_as_gen/matplotlib.pyplot.cla.html

7.self.ax.plot 绘制y与x作为线和/或标记,也就是绘制图像
https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.plot.html

8.self.ax.set_zlim(0, 10) 设置z轴视图限制。
https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.set_xlim.html

def plot(self):T = self.transformation_matrix()p1_t = np.matmul(T, self.p1)p2_t = np.matmul(T, self.p2)p3_t = np.matmul(T, self.p3)p4_t = np.matmul(T, self.p4)plt.cla()self.ax.plot([p1_t[0], p2_t[0], p3_t[0], p4_t[0]],[p1_t[1], p2_t[1], p3_t[1], p4_t[1]],[p1_t[2], p2_t[2], p3_t[2], p4_t[2]], 'k.')self.ax.plot([p1_t[0], p2_t[0]], [p1_t[1], p2_t[1]],[p1_t[2], p2_t[2]], 'r-')self.ax.plot([p3_t[0], p4_t[0]], [p3_t[1], p4_t[1]],[p3_t[2], p4_t[2]], 'r-')self.ax.plot(self.x_data, self.y_data, self.z_data, 'b:')plt.xlim(-5, 5)plt.ylim(-5, 5)self.ax.set_zlim(0, 10)plt.pause(0.001)

然后,补充剩下的初始代码:

class Quadrotor():def __init__(self, x=0, y=0, z=0, roll=0, pitch=0, yaw=0, size=1, show_animation=True):self.p1 = np.array([size / 2, 0, 0, 1]).Tself.p2 = np.array([-size / 2, 0, 0, 1]).Tself.p3 = np.array([0, size / 2, 0, 1]).Tself.p4 = np.array([0, -size / 2, 0, 1]).Tself.x_data = []self.y_data = []self.z_data = []self.show_animation = show_animationif self.show_animation:plt.ion()fig = plt.figure()self.ax = fig.add_subplot(111, projection='3d')self.update_pose(x, y, z, roll, pitch, yaw)def update_pose(self, x, y, z, roll, pitch, yaw):self.x = xself.y = yself.z = zself.roll = rollself.pitch = pitchself.yaw = yawself.x_data.append(x)self.y_data.append(y)self.z_data.append(z)if self.show_animation:self.plot()

完整代码如下:

from math import cos, sin
import numpy as np
import matplotlib.pyplot as plt#size=0.25
class Quadrotor():def __init__(self, x=0, y=0, z=0, roll=0, pitch=0, yaw=0, size=1, show_animation=True):self.p1 = np.array([size / 2, 0, 0, 1]).Tself.p2 = np.array([-size / 2, 0, 0, 1]).Tself.p3 = np.array([0, size / 2, 0, 1]).Tself.p4 = np.array([0, -size / 2, 0, 1]).Tself.x_data = []self.y_data = []self.z_data = []self.show_animation = show_animationif self.show_animation:plt.ion()fig = plt.figure()self.ax = fig.add_subplot(111, projection='3d')self.update_pose(x, y, z, roll, pitch, yaw)def update_pose(self, x, y, z, roll, pitch, yaw):self.x = xself.y = yself.z = zself.roll = rollself.pitch = pitchself.yaw = yawself.x_data.append(x)self.y_data.append(y)self.z_data.append(z)if self.show_animation:self.plot()def transformation_matrix(self):x = self.xy = self.yz = self.zroll = self.rollpitch = self.pitchyaw = self.yawreturn np.array([[cos(yaw) * cos(pitch), -sin(yaw) * cos(roll) + cos(yaw) * sin(pitch) * sin(roll), sin(yaw) * sin(roll) + cos(yaw) * sin(pitch) * cos(roll), x],[sin(yaw) * cos(pitch), cos(yaw) * cos(roll) + sin(yaw) * sin(pitch) *sin(roll), -cos(yaw) * sin(roll) + sin(yaw) * sin(pitch) * cos(roll), y],[-sin(pitch), cos(pitch) * sin(roll), cos(pitch) * cos(yaw), z]])def plot(self):T = self.transformation_matrix()p1_t = np.matmul(T, self.p1)p2_t = np.matmul(T, self.p2)p3_t = np.matmul(T, self.p3)p4_t = np.matmul(T, self.p4)plt.cla()self.ax.plot([p1_t[0], p2_t[0], p3_t[0], p4_t[0]],[p1_t[1], p2_t[1], p3_t[1], p4_t[1]],[p1_t[2], p2_t[2], p3_t[2], p4_t[2]], 'k.')self.ax.plot([p1_t[0], p2_t[0]], [p1_t[1], p2_t[1]],[p1_t[2], p2_t[2]], 'r-')self.ax.plot([p3_t[0], p4_t[0]], [p3_t[1], p4_t[1]],[p3_t[2], p4_t[2]], 'r-')self.ax.plot(self.x_data, self.y_data, self.z_data, 'b:')plt.xlim(-5, 5)plt.ylim(-5, 5)self.ax.set_zlim(0, 10)plt.pause(0.001)q = Quadrotor(x=-5, y=5, z=5, roll=0,pitch=0, yaw=0, size=1, show_animation=True)
#q.plot()

看过的小伙伴如果发现了我的错误,请留言告诉我哦!,大家一起讨论…

小型四旋翼飞机的仿真以及实物操作 ------- Python matplotlib仿真篇(一)画出飞机相关推荐

  1. 计算机仿真实训操作开车步骤,仿真实训系统解决方案

    原标题:仿真实训系统解决方案 仿真实训系统解决方案 仿真实训系统一般都具有很强的工业背景,其工艺流程.设备结构.自控方案都来源于实际,可以进行生产过程演示.产品运行演示.产品拆装.维修.故障排除.操作 ...

  2. 基于51单片机万年历可调电子时钟闹钟温度(实物图+源码+仿真+原理图+论文)

     资料编号:038 硬件构成:51单片机+最小系统+LCD1602液晶显示模块+时钟模块+温度采集模块+蜂鸣器模块+按键模块 1.采用LCD1602液晶屏显示.DS1302时钟芯片和DS18B20温度 ...

  3. 【51单片机】矩阵键盘逐行扫描法仿真实验+超详细Proteus仿真和Keil操作步骤

    [51单片机]矩阵键盘逐行扫描法仿真实验+超详细Proteus仿真和Keil操作步骤 一.环境 二.硬件部分 1. Proteus新建工程 2. 添加元件 3.连接线路 4.硬件效果 三.软件部分 1 ...

  4. 基于数据融合和串级PID的小型四旋翼无人机高度测量与控制系统

    作者:Tomy 摘要:简单介绍了一种基于 Mahony 算法无人机姿态解算算法,并在这个的基础上设计了一 种融合惯导加速度计和气压计的小型无人机高度测量系统, 同时利用该高度测量系统设计了 基于串级 ...

  5. 基于RflySim平台的mahony(含磁罗盘)互补滤波在pixhawk仿真及实物实验(带实验数据)

    写在前面 本案例实验采用RflySim平台,该平台可以高效快速编写代码,使用simulink模型搭建,可以见代码直接生成对应的C代码,并一键将代码烧录Pixhawk中,是一种快速开发平台,RflySi ...

  6. 17-基于单片机的矿井提升机_步进电机控制装置设计(原理图+仿真+源代码+实物图+答辩论文+答辩PPT)

    17-基于单片机的矿井提升机_步进电机控制装置设计(原理图+仿真+源代码+实物图+答辩论文+答辩PPT) 文章目录 17-基于单片机的矿井提升机_步进电机控制装置设计(原理图+仿真+源代码+实物图+答 ...

  7. 2021年大数据HBase(四):HBase的相关操作-客户端命令式!【建议收藏】

    全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 HBase的相关操作-客户端命令式 1.进入HBase ...

  8. OpenCV学习笔记(四十一)——再看基础数据结构core OpenCV学习笔记(四十二)——Mat数据操作之普通青年、文艺青年、暴力青年 OpenCV学习笔记(四十三)——存取像素值操作汇总co

    OpenCV学习笔记(四十一)--再看基础数据结构core 记得我在OpenCV学习笔记(四)--新版本的数据结构core里面讲过新版本的数据结构了,可是我再看这部分的时候,我发现我当时实在是看得太马 ...

  9. 计算机仿真实训操作开车步骤,计算机仿真上机实训指导书.doc

    文档介绍: .页眉.. .页脚. 实训 1: 矩阵的建立和运算 1.1 实训目的 1.1.1 通过上机启动 MATLAB 软件,熟悉软件的界面和菜单; 1.1.2 掌握变量名的命名规则; 1.1.3 ...

最新文章

  1. 记住这个网站:服务器相关数据统计网站 http://news.netcraft.com/
  2. spoj BCEASY - Bottom Coder (Easy)
  3. getRectSubPix函数
  4. python读取文件名写入excel_Python实现读取并写入Excel文件过程解析
  5. 小学计算机几年级学3d建模,学了4年手绘和建模,你终于不会思考了
  6. Cookie利用神器:CookieHacker
  7. python对浏览器的常用操作有哪些_Python Selenium中对象常用操作方法
  8. IIS 日志文件位置
  9. 03 - 变量的数据类型
  10. exchange创建邮箱组_Exchange批量创建用户组及启用通讯组邮箱-阿里云开发者社区...
  11. Python 基础课程第八天
  12. JAVAWeb开发之Servlet-18.Servlet共享变量与变量的作用域
  13. Linux缓存机制之块缓存
  14. dbms_java 包不存在_Oracle的sql开发之包技术实战
  15. 如何图片格式批量转换?
  16. matlab 光斑质心算法,一种光斑提取及其质心确定的方法技术
  17. WinEdit + CTex 打开论文模板出现乱码
  18. SAP 响应时间 性能察看
  19. [FROM WOJ]#2040 山贼集团
  20. 微信扫码支付notify_url回调接收通知问题

热门文章

  1. 导出链接不会影响网站权重
  2. Oracle数据库SQL查询结果去重——ROW_NUMBER() OVER
  3. 如何阻止华为网盘插件修改搜狗浏览器主页
  4. TD三国赤壁通关攻略与录像下载
  5. 超级链接代码,html中的a标签,超链详细用法
  6. IOS-OC的基础知识
  7. 算法编程11:二分法求平方根
  8. uview 自定义导航栏
  9. 一个软件测试工程师面试结束后想说的
  10. 微软官方的VS2003设计器的demo