基于unity无人机3D仿真《一》实现无人机的模型的制作、运动学关系、姿态角等;实现无人机各种姿态运动。

一、目前的效果

二、无人机模型

制作软件:maya

模型结构:

三、开发平台

unity2017 + VS2019 + C#

四、无人机模型及控制规律


飞行姿态控制
高度控制:
俯仰控制:绕无人机自身y轴运动(前后)
横滚控制:绕无人机自身x轴运动(左右)
偏航控制:绕无人机自身z轴运动(自旋)

无人机坐标系与世界坐标系的对应关系
x(uav) = z(world)
y(uav) = x(world)
z(uav)= y(world)

四电机拉力:
F1、F2、F3、F4

无人机控制规律:



五、无人机控制脚本

UAV_1_power:脚本
(1)四个电机的拉力

 static public float F1 = 0.0f;//无人机电机1的拉力static public float F2 = 0.0f;//无人机电机2的拉力static public float F3 = 0.0f;//无人机电机3的拉力static public float F4 = 0.0f;//无人机电机4的拉力

(2)更新标志

static public bool update_xyz_flag = false;//更新xyz的加速度、速度、位移的标志
static public bool update_angle_flag = false;//更新角度的加速度、速度、角度的标志
static public bool update_move_flag = false;//更新无人机的位置,在更新xyz后设置标志位
static public bool update_rotate_flag = false;//更新无人机的姿态角,在更新角度后设置标志位

(3)四个电机的转速

static public float motor_1_speed = 0.0f;//无人机电机1的转速
static public float motor_2_speed = 0.0f;//无人机电机2的转速
static public float motor_3_speed = 0.0f;//无人机电机3的转速
static public float motor_4_speed = 0.0f;//无人机电机4的转速

(4)电机属性差异(可利用此对电机对无人机的影响)

private float motor_1_para = 0.0f;//无人机电机1的属性
private float motor_2_para = 0.0f;//无人机电机2的属性
private float motor_3_para = 0.0f;//无人机电机3的属性
private float motor_4_para = 0.0f;//无人机电机4的属性

(5)无人机各方向,姿态的控制量

static public float U1 = 0.0f;//无人机垂直升降控制量
static public float U2 = 0.0f;//无人机横滚控制量
static public float U3 = 0.0f;//无人机俯仰控制量
static public float U4 = 0.0f;//无人机偏航控制量

(6)电机提供的最大力

    private float min_motor1_power = 0.0f;//无人机电机1最小的拉力private float max_motor1_power = 380.0f;//无人机电机1最大的拉力private float min_motor2_power = 0.0f;//无人机电机2最小的拉力private float max_motor2_power = 380.0f;//无人机电机2的最大拉力private float min_motor3_power = 0.0f;//无人机电机3的最小的拉力private float max_motor3_power = 380.0f;//无人机电机3的最大拉力private float min_motor4_power = 0.0f;//无人机电机4的最小拉力private float max_motor4_power = 380.0f;//无人机电机4的最大拉力

(7)检查F1、F2、F3、F4是否改变并设置标志位

void check_update();

(8)无人机拉力参数初始化

 void F_para_init()

(9)无人机电机的转速

motor_speed()

(10)无人机各方向的控制量

void control()

(11)检查无人机的控制模式

check_control_model()

(12)利用按键改变F1、F2、F3、F4的大小
F1:A 为加1, S 为减1 F3:G 为加1, H 为减1
F2:D 为加1, F 为减1 F4:J 为加1, K 为减1

void key_scam_control()

(13)

void Start () {uav_1_self = GameObject.Find("uav_1");//无人机1初始化F_para_init();//电机拉力参数初始化}

(14)

void Update () {check_control_model();//检查控制模式check_update();//检查F1、F2、F3、F4是否改变并设置标志位motor_speed();//更新电机速度control();//更新各方向的控制量key_scam_control();}

(15)GUI界面

  void OnGUI(){GUILayout.Label("无人机当前位置"+uav_1_self.transform.position);//显示无人机的当前位置GUILayout.Label("当前横滚角加速度:" + UAV_1_angle.roll_acc +  "  横滚角速度:" + UAV_1_angle.roll_speed +  "  横滚角增量:" + UAV_1_angle.roll);GUILayout.Label("当前俯仰角加速度:" + UAV_1_angle.pitch_acc + "  俯仰角速度:" + UAV_1_angle.pitch_speed + "  俯仰角增量:" + UAV_1_angle.pitch);GUILayout.Label("当前偏航角加速度:" + UAV_1_angle.yaw_acc + "  偏航角速度:" + UAV_1_angle.yaw_speed + "  偏航角增量:" + UAV_1_angle.yaw);GUILayout.Label("X轴当前的加速度:" + UAV_1_linear_motion.x_acc + "  X轴的速度" + UAV_1_linear_motion.x_speed + "  X轴的位移增量" + UAV_1_linear_motion.x);GUILayout.Label("Z轴当前的加速度:" + UAV_1_linear_motion.y_acc + "  Z轴的速度" + UAV_1_linear_motion.y_speed + "  Z轴的位移增量" + UAV_1_linear_motion.y);GUILayout.Label("Y轴当前的加速度:" + UAV_1_linear_motion.z_acc + "  Y轴的速度" + UAV_1_linear_motion.z_speed + "  Y轴的位移增量" + UAV_1_linear_motion.z);GUILayout.Label("当前无人机的控制模式" + control_model);//显示无人机的控制模式if(GUILayout.Button("自动模式")){uav_control_model = false;}if(GUILayout.Button("手动模式")){uav_control_model = true;}if(uav_control_model){F1 = GUILayout.HorizontalSlider(F1, min_motor1_power, max_motor1_power);//通过滑块改变F1的大小GUILayout.Label("当前F1的大小为" + F1);//显示F1的当前值GUILayout.BeginHorizontal();if(GUILayout.Button("F1加1")){F1 = F1 + 1;}GUILayout.Space(10);if(GUILayout.Button("F1减1")){F1 = F1 - 1;}GUILayout.EndHorizontal();F2 = GUILayout.HorizontalSlider(F2,min_motor2_power,max_motor2_power);//通过滑块改变F2的大小GUILayout.Label("当前F2的大小为" + F2);//显示F2的当前值GUILayout.BeginHorizontal();if (GUILayout.Button("F2加1")){F2 = F2 + 1;}GUILayout.Space(10);if (GUILayout.Button("F2减1")){F2 = F2 - 1;}GUILayout.EndHorizontal();F3 = GUILayout.HorizontalSlider(F3, min_motor3_power, max_motor3_power);//通过滑块改变F3的大小GUILayout.Label("当前F3的大小为" + F3);//显示F3的当前值GUILayout.BeginHorizontal();if (GUILayout.Button("F3加1")){F3 = F3 + 1;}GUILayout.Space(10);if (GUILayout.Button("F3减1")){F3 = F3 - 1;}GUILayout.EndHorizontal();F4 = GUILayout.HorizontalSlider(F4, min_motor4_power, max_motor4_power);//通过滑块改变F4的大小GUILayout.Label("当前F4的大小为" + F4);//显示F4的当前值GUILayout.BeginHorizontal();if (GUILayout.Button("F4加1")){F4 = F4 + 1;}GUILayout.Space(10);if (GUILayout.Button("F4减1")){F4 = F4 - 1;}GUILayout.EndHorizontal();GUILayout.BeginHorizontal();if (GUILayout.Button("整体加1")){F1 = F1 + 1;F2 = F2 + 1;F3 = F3 + 1;F4 = F4 + 1;}GUILayout.Space(10);if (GUILayout.Button("整体减1")){F1 = F1 - 1;F2 = F2 - 1;F3 = F3 - 1;F4 = F4 - 1;}GUILayout.Space(10);if(GUILayout.Button("起飞")){F1 = 4;F2 = 4;F3 = 4;F4 = 4;}GUILayout.EndHorizontal();}

脚本UAV_1_moveRotate

(1) 无人机姿态角

  void uav_Rotate()

(2)无人机位置

 void uav_positiom()

(3)

void Start () {//获取无人机的对象uav_1_self = GameObject.Find("uav_1");}

(4)

void Update () {uav_Rotate();}

(5)

void FixedUpdate(){uav_positiom();}

脚本UAV_1_propellor
(1)更新螺旋桨的转速

 void propellor_update()

(2)

void Start () {//获取无人机的对象UAV_1_propellor_1 = GameObject.Find("uav_1/front_motor1_right14/motor/propellor14");//无人机1的一号电机的螺旋桨UAV_1_propellor_2 = GameObject.Find("uav_1/back_motor2_left11/motor/propellor11");//无人机1的二号电机的螺旋桨UAV_1_propellor_3 = GameObject.Find("uav_1/front_motor3_left12/motor/propellor12");//无人机1的三号电机的螺旋桨UAV_1_propellor_4 = GameObject.Find("uav_1/back_motor4_right13/motor/propellor13");//无人机1的四号电机的螺旋桨}

(3)

void Update () {propellor_update();}

脚本UAV_1_linear_motion

 //空气阻力参数private float Kx = 0.0f;//X轴方向的空气阻力参数private float Ky = 0.0f;//Y轴方向的空气阻力参数private float Kz = 0.0f;//Z轴方向的空气阻力参数//空气阻力static public float fx = 0.0f;//X轴方向的空气阻力static public float fy = 0.0f;//Y轴方向的空气阻力static public float fz = 0.0f;//Z轴方向的空气阻力//线运动的速度static public float x_speed = 0.0f;//X轴方向的速度static public float y_speed = 0.0f;//Y轴方向的速度static public float z_speed = 0.0f;//Z轴方向的速度//线运动的加速度static public float x_acc = 0.0f;//X轴方向的加速度static public float y_acc = 0.0f;//Y轴方向的加速度static public float z_acc = 0.0f;//Z轴方向的加速度//线运动的位移static public float x = 0.0f;//X轴方向的位移static public float y = 0.0f;//Y轴方向的位移static public float z = 0.0f;//Z轴方向的位移//无人机的质量private float mass_uav = 0.0f;//无人机的质量//重力加速度private float g = 0.0f;//重力加速度//固定更新的时间,此时间用于计算速度和位移private float fixed_update_time = 0.0f;//起飞标志static public bool take_off_uav_flag = false;//无人机对象GameObject UAV_1_self = null;

(2)检查起飞和设置标志位

  void check_takeoff()

(3)线运动参数初始化

void linear_motion_init()

(4)更新空气阻力

void fx_fy_fz_update()

(5)更新线运动

void linear_motion_update()

(6)

void Start () {linear_motion_init();UAV_1_self = GameObject.Find("uav_1");}// Update is called once per framevoid Update () {fx_fy_fz_update();check_takeoff();Debug.Log(z);}void FixedUpdate(){linear_motion_update();}

脚本UAV_1_angle
(1)

//无人机的转动惯量private float Ix = 0.0f;private float Iy = 0.0f;private float Iz = 0.0f;//无人机旋翼中心到无人机坐标系x轴的垂直距离private float d = 0.0f;//无人机的姿态角static public float roll = 0.0f;// 无人机的横滚角度static public float pitch = 0.0f;//无人机的俯仰角度static public float yaw = 0.0f;//无人机的偏航角度//无人机的姿态角角速度static public float roll_speed = 0.0f;//无人机的横滚角度的角速度static public float pitch_speed = 0.0f;//无人机的俯仰角的角速度static public float yaw_speed = 0.0f;//无人机的偏航角的角速度//无人机的姿态角角加速度static public float roll_acc = 0.0f;//无人机的横滚角度的角加速度static public float pitch_acc = 0.0f;//无人机的俯仰角的角加速度static public float yaw_acc = 0.0f;//无人机的偏航角的角加速度//固定更新的时间static public float fixed_update_time = 0.0f;//FixedUpdate函数运行的时间//角加速度计算的参数private float k1 = 0.0f;//横滚角角加速度private float k2 = 0.0f;//俯仰角角加速度private float k3 = 0.0f;//偏航角角加速度

(2)与角度计算有关的参数初始化

void angle_para_init()

(3)姿态角更新

void angle_update()

(4)

void Start () {angle_para_init();}// Update is called once per framevoid Update () {}void FixedUpdate(){angle_update();}

基于unity无人机3D仿真《二》将关注于相机和激光传感器的仿真。

基于unity无人机3D仿真《一》相关推荐

  1. 软件工程第二次作业:基于Unity的3D魔方实现

    基于Unity的3D魔方实现 王化明(2012211757).吴静(2012211523)  一.背景: 魔方,英文名为Rubik's Cube,又叫魔术方块,也称鲁比克方块.是匈牙利布达佩斯建筑学院 ...

  2. 基于HTML5气3D仿真培训系统

    根据最近的上线HTML5的燃气3D培训仿真系统.曾经的老系统是採用基于C++和OpenGL的OpenSceneGraph引擎设计的,OSG引擎性能和渲染效果各方面还是不错的,但由于这次新产品需求要求能 ...

  3. 基于Unity的流体仿真

    序 unity封装了一堆东西,用起来小白友好-- 找找有没有能模仿的项目吧 网页1 GitHub - aren227/unity-fluid-simulation: Real-time sph flu ...

  4. Ubuntu18.04配置搭建基于Gazebo的虚拟仿真平台(Px4):无人机(UAV)、无人车等模拟实验平台

    这篇我觉得是写得比较详细完整的 摘自:https://dgzc.ganahe.top/ganahe/2021/uavgazebomoni.html Ubuntu18.04配置搭建基于Gazebo的虚拟 ...

  5. Unity 基于eventTriggers的3D场景交互系统

    Unity 基于eventTriggers的3D场景交互系统 Unity里的3D项目有时候需要大量的交互,而且是无UI的交互. 这时候可以像UI系统里,使用eventTrigger去制作交互系统.但是 ...

  6. 《游戏开发基础》课程论文丨基于Unity与Bolt的抗美援朝主题3D游戏设计

    文章目录 摘要 关键词 一.导言 二.角色操控 2.1 隐藏鼠标 2.2 通过移动鼠标更新玩家视角 2.3 使角色跳跃 2.4 使角色移动 2.5 使角色冲刺 2.6 使角色卧倒 2.7 设置准星及切 ...

  7. 无人机设计仿真--在Isight平台上进行的基于CST参数化+Xfoil的无人机翼型优化

    作者:Graychen 一.工程背景 翼型的选型和设计是飞行器气动设计中的一项基础性工作,翼型对飞行器的气动性能具有根本性的影响.现在高性能飞行器已不再从翼型库中选择适用翼型后直接使用,而是以现有翼型 ...

  8. 初中计算机教案3D,基于3D 仿真平台的初中机器人 教学设计

    原标题:基于3D 仿真平台的初中机器人 教学设计 本文发表于 <数字教育> 2018年第5期(总第23期)实践案例栏目,页码:71-77.转载请注明出处. 摘 要:本文采用实践教学法,以社 ...

  9. 【雷达通信】基于matlab无人机FMCW毫米波高度计雷达仿真【含Matlab源码 1261期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源: [雷达通信]基于matlab无人机FMCW毫米波高度计雷达仿真[含Matlab源码 1261期] 点击上面蓝色字体,直接付费下载,即可. ...

最新文章

  1. background-size:cover IE8
  2. 极路由安全设计架构分析
  3. 【C语言】C语言实现面向对象编程之多态
  4. 《Effective Java》—— 对于所有对象都通用的方法
  5. windows简单TCP通信 C++
  6. Flink JDBC Connector:Flink 与数据库集成最佳实践
  7. 谷歌浏览器修复工具_奇安信代码卫士协助谷歌修复漏洞 获官方致谢
  8. 同步异步-阻塞非阻塞
  9. Operations Manager 2007 R2系列之单台服务器拓扑图监控
  10. 体验Windows server 2012上安装SQL 2012
  11. git指定版本openwrt源码_关于Github Action自动编译Lean_Openwrt的配置修改问题
  12. autojs实现无障碍关机重启和随机姓名
  13. D盘或者E盘根目录出现msdia80.dll文件的解决方法
  14. 青海大学昆仑学院计算机机考,青 海 大 学 昆 仑 学 院 试 卷.doc
  15. SpringBoot安全管理 ——模块4:Spring Boot 整合 Shiro
  16. vc++datamatrix二维码识别
  17. ISO14443 Type A类型卡的防碰撞过程以及命令解析
  18. windows重装系统教程
  19. VS2005 编译器选项
  20. android悬浮窗跑马灯,边缘闪光跑马灯

热门文章

  1. 网络设备的连接以及配置
  2. Windows 7/8 创建WIFI热点
  3. UE4 Matinee的动画倒播
  4. C#大作业——学生信息管理系统
  5. 操作系统概念 第六章 同步
  6. 对excel表格按照某个字段拆分
  7. 李珣同款爱心特效代码,加DIY教程,快拿去送给你喜欢的那个ta吧。
  8. java邮箱发送验证码_java实现发送邮箱验证码——三步搞定java邮箱发送验证码
  9. 浅谈网络世界中的Power Law现象(一) 什么是Power Law
  10. Android 新闻客户端案例