基于unity无人机3D仿真《一》
基于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仿真《一》相关推荐
- 软件工程第二次作业:基于Unity的3D魔方实现
基于Unity的3D魔方实现 王化明(2012211757).吴静(2012211523) 一.背景: 魔方,英文名为Rubik's Cube,又叫魔术方块,也称鲁比克方块.是匈牙利布达佩斯建筑学院 ...
- 基于HTML5气3D仿真培训系统
根据最近的上线HTML5的燃气3D培训仿真系统.曾经的老系统是採用基于C++和OpenGL的OpenSceneGraph引擎设计的,OSG引擎性能和渲染效果各方面还是不错的,但由于这次新产品需求要求能 ...
- 基于Unity的流体仿真
序 unity封装了一堆东西,用起来小白友好-- 找找有没有能模仿的项目吧 网页1 GitHub - aren227/unity-fluid-simulation: Real-time sph flu ...
- Ubuntu18.04配置搭建基于Gazebo的虚拟仿真平台(Px4):无人机(UAV)、无人车等模拟实验平台
这篇我觉得是写得比较详细完整的 摘自:https://dgzc.ganahe.top/ganahe/2021/uavgazebomoni.html Ubuntu18.04配置搭建基于Gazebo的虚拟 ...
- Unity 基于eventTriggers的3D场景交互系统
Unity 基于eventTriggers的3D场景交互系统 Unity里的3D项目有时候需要大量的交互,而且是无UI的交互. 这时候可以像UI系统里,使用eventTrigger去制作交互系统.但是 ...
- 《游戏开发基础》课程论文丨基于Unity与Bolt的抗美援朝主题3D游戏设计
文章目录 摘要 关键词 一.导言 二.角色操控 2.1 隐藏鼠标 2.2 通过移动鼠标更新玩家视角 2.3 使角色跳跃 2.4 使角色移动 2.5 使角色冲刺 2.6 使角色卧倒 2.7 设置准星及切 ...
- 无人机设计仿真--在Isight平台上进行的基于CST参数化+Xfoil的无人机翼型优化
作者:Graychen 一.工程背景 翼型的选型和设计是飞行器气动设计中的一项基础性工作,翼型对飞行器的气动性能具有根本性的影响.现在高性能飞行器已不再从翼型库中选择适用翼型后直接使用,而是以现有翼型 ...
- 初中计算机教案3D,基于3D 仿真平台的初中机器人 教学设计
原标题:基于3D 仿真平台的初中机器人 教学设计 本文发表于 <数字教育> 2018年第5期(总第23期)实践案例栏目,页码:71-77.转载请注明出处. 摘 要:本文采用实践教学法,以社 ...
- 【雷达通信】基于matlab无人机FMCW毫米波高度计雷达仿真【含Matlab源码 1261期】
⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源: [雷达通信]基于matlab无人机FMCW毫米波高度计雷达仿真[含Matlab源码 1261期] 点击上面蓝色字体,直接付费下载,即可. ...
最新文章
- background-size:cover IE8
- 极路由安全设计架构分析
- 【C语言】C语言实现面向对象编程之多态
- 《Effective Java》—— 对于所有对象都通用的方法
- windows简单TCP通信 C++
- Flink JDBC Connector:Flink 与数据库集成最佳实践
- 谷歌浏览器修复工具_奇安信代码卫士协助谷歌修复漏洞 获官方致谢
- 同步异步-阻塞非阻塞
- Operations Manager 2007 R2系列之单台服务器拓扑图监控
- 体验Windows server 2012上安装SQL 2012
- git指定版本openwrt源码_关于Github Action自动编译Lean_Openwrt的配置修改问题
- autojs实现无障碍关机重启和随机姓名
- D盘或者E盘根目录出现msdia80.dll文件的解决方法
- 青海大学昆仑学院计算机机考,青 海 大 学 昆 仑 学 院 试 卷.doc
- SpringBoot安全管理 ——模块4:Spring Boot 整合 Shiro
- vc++datamatrix二维码识别
- ISO14443 Type A类型卡的防碰撞过程以及命令解析
- windows重装系统教程
- VS2005 编译器选项
- android悬浮窗跑马灯,边缘闪光跑马灯