我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Unity使用物理引擎实现多旋翼无人机的模拟飞行

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Unity使用物理引擎实现多旋翼无人机的模拟飞行

内容简介

最近在用Unity实现无人机的模拟飞行,但发现站里基本没有完整介绍如何实现该功能的博客,因时间紧迫,就自己简单做了一个仿真(不是完全按照现实物理情景来做,即通过各个螺旋桨旋转产生力带动机体飞行)。下面我会简述完全按现实物理情景实现模拟飞行,并详细描述我自己做的模拟飞行(不完全仿真),给各位提供参考。

现实物理情景的实现——简述(以四旋翼无人机为例)

因为我没有实现1:1仿真,所以这里只介绍思路,希望能给到读者一点启发。

  1. 构建一个四旋翼无人机模型(可以网上下载。或用Maya等建一个)
  2. 将模型设置为Rigidbody和BoxCollider(即实现一个物理模型,记得要先Create一个Plane承住你的模型)
  3. 给四个螺旋桨各写一个脚本,各产生一个向上的力
  4. 通过螺旋桨产生的升力即可带动模型飞行,通过控制不同螺旋桨产生升力的不同,即可实现无人机的各种飞行姿态(这步是最难的,也最花时间)

简化物理情景的实现——详述(以四旋翼无人机为例)

背景:上面的现实模拟最麻烦之处在于要对四个螺旋桨(电机)实现控制并达到平衡,太麻烦了,调试要很久,网上又没有现成的代码(至少免费的我没有发现)。所以我自己简化了一下模型,并实现所需功能。
思路:简化模型的区别在于我不用四个螺旋桨(电机)来各自产生升力,形成合力来带动机体。而是直接将力加在机身上,即跳过了前面那一步,直接用合力来实现无人机的飞行。
实现步骤:以下为实现步骤,考虑到网上好像没有相关的博客和视频教程,我会尽量详细来叙述,所以会有点多。

1.导入一个无人机模型,并给整体设置Rigidbody和BoxCollider(注意最好Collider设成和模型差不多大)。

2. 写脚本1(Plane_Text)(总共需要写两个脚本,记为脚本1和脚本2),脚本1使其产生力带动机体运动


using System.Collections;
using System.Collections.Generic;
using System.IO.Pipes;
using System.Runtime.CompilerServices;
using System.Security.Cryptography.X509Certificates;
using UnityEngine;
using UnityEngine.UI;

public class Plane_Text : MonoBehaviour
{
	private Rigidbody m_Rigidbody;
	public float speed = 5;
	public float angle = 0;
	private float x, y, z;
	public Transform target;
	
	void Start()
	{
		m_Rigidbody = gameObject.GetComponent<Rigidbody>();//获取组件
	}

	
	void Update()
	{
		var vec = new Vector3(x, y, z);
		m_Rigidbody.AddForce(vec * speed, ForceMode.Force);//无人机朝vec向量方向运动,至于vec的取值由下面各个按键确定
		
		
		if (Input.GetKeyUp(KeyCode.W))
			speed++;
		if (Input.GetKeyDown(KeyCode.W))
			x = 0;y = 1;z = 0;
		if (Input.GetKeyUp(KeyCode.S))
			speed--;
		if (Input.GetKeyDown(KeyCode.D))
			angle++;
			this.transform.Rotate(Vector3.up * angle);//按下D键则一直右转,下同
		if (Input.GetKeyUp(KeyCode.D))
			angle = 0;
			this.transform.Rotate(Vector3.up * angle);//松开D键停止右转,下同
		if (Input.GetKeyDown(KeyCode.A))
			angle--;
			this.transform.Rotate(Vector3.up * angle);
		if (Input.GetKeyUp(KeyCode.A))
			angle = 0;
			this.transform.Rotate(Vector3.up * angle);
		
		if (Input.GetKeyDown(KeyCode.LeftArrow))//按下←键朝向量(-1,2,0)方向运动,即左倾,但该左倾只是运动轨迹上左倾,模型是不会往左倾的,所以需要下脚本2里设置
			x = -1; y = 2; z = 0; //这个取值随你定,但x一定是负的且z一定是0,至于x和y的大小就看你想飞行轨迹左倾多少来决定了
		if (Input.GetKeyUp(KeyCode.LeftArrow))//当松开←键时,不再左倾,而是按原来(0,1,0)方向,即y轴向上,继续移动
			x = 0; y = 1; z = 0;//同样因为是y轴,x和z的值必须为0,y的值看你心情
		
		if (Input.GetKeyDown(KeyCode.RightArrow))//按下→键
			x = 1; y = 2; z = 0;                     //这些我就不再解释了,跟上面“←键”的是一样的,只是倾斜方向不一样而已
		if (Input.GetKeyUp(KeyCode.RightArrow))
			x = 0; y = 1; z = 0;
		
		if (Input.GetKeyDown(KeyCode.UpArrow))//按下↑键
			x = 0;y = 2;z = 1;
		if (Input.GetKeyUp(KeyCode.UpArrow))
			x = 0; y = 1; z = 0;
		
		if (Input.GetKeyDown(KeyCode.DownArrow))//按下↓键
			x = 0;y = 2;z = -1;
		if (Input.GetKeyUp(KeyCode.DownArrow))
			x = 0; y = 1; z = 0;
		
	}
}

3.写脚本2(Plane_Move):该脚本是用来实现模型的前后左右倾的


using System.Collections;
using System.Collections.Generic;
using System.IO.Pipes;
using System.Runtime.CompilerServices;
using System.Security.Cryptography.X509Certificates;
using UnityEngine;
using UnityEngine.UI;

public class Plane_Move : MonoBehaviour
{
    private Rigidbody m_Rigidbody;
    void Start()
    {
        m_Rigidbody = gameObject.GetComponent<Rigidbody>();//获取组件
    }

    void Update()
    {
		
		if (Input.GetKeyDown(KeyCode.LeftArrow))
			transform.rotation = Quaternion.Euler(0, 0, 10);//绕z轴转10°,即左倾,不一定是10,看你想倾多少就倾多少,别太大就行,下同
		if (Input.GetKeyUp(KeyCode.LeftArrow))
			transform.rotation = Quaternion.Euler(0, 0, 0);//松开按键恢复竖直向上飞,下同
		
		if (Input.GetKeyDown(KeyCode.RightArrow))
			this.transform.rotation = Quaternion.Euler(0, 0, -10);
		if (Input.GetKeyUp(KeyCode.RightArrow))
			this.transform.rotation = Quaternion.Euler(0, 0, 0);
		
		if (Input.GetKeyDown(KeyCode.UpArrow))
			this.transform.rotation = Quaternion.Euler(10, 0, 0);
		if (Input.GetKeyUp(KeyCode.UpArrow))
			this.transform.rotation = Quaternion.Euler(0, 0, 0);
		
		if (Input.GetKeyDown(KeyCode.DownArrow))
			this.transform.rotation = Quaternion.Euler(-10, 0, 0);
		if (Input.GetKeyUp(KeyCode.DownArrow))
			this.transform.rotation = Quaternion.Euler(0, 0, 0);
		
	}
}

4.完成上面3步,我们就会得到两个脚本

5.然后就是把这两个脚本拖到无人机上(注意两个都要拖!),接着就是运行了(如果是运行不了肯定是你复制了我的代码,但脚本名又和我不一样的缘故)

6.最后运行成功(原谅我不会截动图给你们看运行结果)

7.当然有人会说螺旋桨怎么不会转啊,这也简单;首先给四个螺旋桨的顶点各建一个空物体(每个螺旋桨要绕着它对应的空物体旋转),然后再写一个脚本(Power_all),我这里就不区分正反桨了。(你要区分也行,就是把Vector3.down改成Vector3.up就是另一对桨)


using System.Collections.Generic;
using System.Collections;
using System.Globalization;
using UnityEngine;
using System;
using UnityEngine.UI;
//using  UnityEngine.Debug;

public class Power_all : MonoBehaviour
{
	public GameObject target01;//声明顶点
	private float n = 10;

	// Update is called once per frame
	void Update()
	{

		this.transform.RotateAround(target01.transform.position, Vector3.down, 100f * n * Time.deltaTime);//该函数通过放入一个顶点,以及围绕这个顶点要旋转的x轴并给定旋转速度
																										  //Vector3向量,在三维坐标系中带有方向和大小的数据,Vector3.up=(0,1,0)、Vector3.down=(0,-1,0)、Vector3.left=(-1,0,0)、Vector3.right=(1,0,0)

	}
}

8.将上面这个螺旋桨的脚本分别拖到各个桨叶模型上,然后将各个空物体拉到各个声明的顶点处即可。

9.上述即完成了简化的多旋翼无人机模拟飞行。可能有人会说我第2、3点谁规定了只能前倾一个角度,其实我是这样理解的,如果按照现实情景来完全模拟,确实前倾任意角度,甚至是180°,但前倾角度过大导致的结果是坠机,所以我设置在10°可以理解为安全倾角,当然你也可以自己该代码来实现自己想要的功能,我这里只是提供一个参考。

以上就是Unity使用物理引擎实现多旋翼无人机的模拟飞行的详细内容,更多关于Unity实现无人机飞行的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Unity使用物理引擎实现多旋翼无人机的模拟飞行

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录