Question: in unity engine create a script for a UAV Add methods to display time, and drone speed and range. Display the time in seconds, range
in unity engine create a script for a UAV
Add methods to display time, and drone speed and range. Display the time in seconds, range in feet (ft) and the speed in miles per hour (mph).
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewBehaviourScript1 : MonoBehaviour
{
public GameObject drone;
public GameObject medicineBox;
public PIDController altitudePID;
public static int numberofMedicineBoxesDropped;
public float Kp;
public float Ki;
public float Kd;
private Rigidbody droneRigidBody;
private Animator UAVAnimator;
public static float _thrust;
public static Vector3 torque;
private float _maxThrust = 2.0f;
private float _maxYawTorque = 0.6f;
private float _maxPitchRollTorque = 0.50f;
private float hoverForce = 25.0f;
public float hoverHeight = 0.0f;
private Vector3 zeroPosition = new Vector3();
private Quaternion zeroRotation = new Quaternion();
void Start()
{
droneRigidBody = drone.GetComponent
UAVAnimator = drone.GetComponent
UAVAnimator.enabled = true;
zeroPosition = drone.transform.position;
zeroRotation = drone.transform.rotation;
altitudePID = new PIDController(Kp, Ki, Kd);
}
// Update is called once per frame
void Update()
{
_thrust = 0;
torque = Vector3.zero;
if (Input.GetAxis("VerticalThrust") != 0.0f) _thrust = Input.GetAxis("VerticalThrust") * _maxThrust;
if (Input.GetAxis("YawThrust") != 0.0f) torque.y = Input.GetAxis("YawThrust") * _maxYawTorque;
if (Input.GetAxis("PitchThrust") != 0.0f) torque.x = Input.GetAxis("PitchThrust") * _maxPitchRollTorque;
if (Input.GetAxis("RollThrust") != 0.0f) torque.z = Input.GetAxis("RollThrust") * _maxPitchRollTorque;
if (Input.GetAxis("JoystickVerticalThrust") != 0.0f) _thrust = Input.GetAxis("JoystickVerticalThrust") * _maxThrust;
if (Input.GetAxis("JoystickYawThrust") != 0.0f) torque.y = Input.GetAxis("JoystickYawThrust") * _maxYawTorque;
if (Input.GetAxis("JoystickPitchThrust") != 0.0f) torque.x = Input.GetAxis("JoystickPitchThrust") * _maxPitchRollTorque;
if (Input.GetAxis("JoystickRollThrust") != 0.0f) torque.z = Input.GetAxis("JoystickRollThrust") * _maxPitchRollTorque;
if (Input.GetKeyDown(KeyCode.B) || Input.GetKeyDown(KeyCode.Joystick1Button1))
{
Instantiate(medicineBox, drone.transform.position,Quaternion.identity);
numberofMedicineBoxesDropped++;
}
// misc.. //
if (_thrust != 0.0f) hoverHeight = drone.transform.position.y;
if (Input.GetKeyDown(KeyCode.R)) ReturnToStartingPosition();
}
private void PowerConsumption(float throttleSetting)
{
}
private void FixedUpdate()
{
Vector3 droneAngles = drone.transform.localEulerAngles;
if (_thrust != 0 || torque.magnitude != 0)
{
if (_thrust != 0.0f || torque.y != 0.0f)
{
float verticalForce = 0.0f;
verticalForce = (float)droneRigidBody.mass * (float)Physics.gravity.y * (1) *(1.0f + _thrust);
droneRigidBody.AddRelativeForce(Vector3.up * verticalForce,ForceMode.Force);
droneRigidBody.AddRelativeTorque(Vector3.up * torque.y,ForceMode.Force);
}
float _throttlePositionTorquePitch = 0.0f;
float _throttlePositionTorqueRoll = 0.0f;
float dampingRoll = .5f;
float dampingPitch = 0.1f;
if (torque.x != 0.0f || torque.z != 0.0f)
{
Quaternion droneQuat = drone.transform.rotation;
//the pitch
if (droneQuat.x > .25f && droneQuat.x < .25f)_throttlePositionTorquePitch = (Mathf.Clamp((torque.x),0.5f, 0.5f));
_throttlePositionTorquePitch = (Mathf.Clamp( rightHandPalm.Pitch / (Mathf.PI / 6.0f), 1.0f, 1.0f));
else if (droneQuat.x >= 0.24f) _throttlePositionTorquePitch = 0.325f * (droneQuat.x.24f);
else if (droneQuat.x <= .24f)_throttlePositionTorquePitch = 0.325f * (droneQuat.x + .24f);
//the roll
if (droneQuat.z > .25f && droneQuat.z < 0.250f)_throttlePositionTorqueRoll = (Mathf.Clamp(torque.z, 0.5f, 0.5f));
if (droneQuat.z >= 0.24f) _throttlePositionTorqueRoll = 0.325f * (droneQuat.z.24f);
if (droneQuat.z <= .24f)_throttlePositionTorqueRoll = 0.325f * (droneQuat.z + 0.24f);
Vector3 totalTorqueVector = (Vector3.forward * _throttlePositionTorqueRoll * dampingRoll) + (Vector3.right * _throttlePositionTorquePitch * dampingPitch);
droneRigidBody.AddRelativeTorque(totalTorqueVector, ForceMode.Force);
direction to compute the force such that the drone stays at a constant altitude when translating in the vertical plane only
Vector3 translation = new Vector3(0, 0, 0);
Vector3 eulerAngles = drone.transform.eulerAngles;
Vector3 scale = new Vector3(2.5, 2.5, 2.5);
Vector3 forceVector = new Vector3(0, 1, 0);
Quaternion rotation = Quaternion.Euler(eulerAngles);
Matrix4x4 transformationMatrix = Matrix4x4.TRS(translation, rotation, scale);
Matrix4x4 inverseTransformationMatrix = transformationMatrix.inverse;
Vector3 newForceVector = inverseTransformationMatrix.MultiplyVector(forceVector);
float _thrust = (float)droneRigidBody.mass * (float)Physics.gravity.y * (1) / (newForceVector.y);
droneRigidBody.AddRelativeForce(Vector3.up * _thrust, ForceMode.Force);
Debug.Log(_thrust);
}
}
if (_thrust == 0.0f && torque.magnitude == 0.0f) Hover();
}
private void Hover()
{
Vector3 droneAngles = drone.transform.localEulerAngles;
float slope = 1.0e3f;
float deltaAngleZ = Mathf.DeltaAngle(0, droneAngles.z);
float deltaAngleX = Mathf.DeltaAngle(0, droneAngles.x);
float torqueZ = slope * deltaAngleZ;
float torqueX = slope * deltaAngleX;
droneRigidBody.AddRelativeTorque(torqueX, 0.0f, torqueZ, ForceMode.Force);
RaycastHit hit;
Ray downRay = new Ray(drone.transform.position, Vector3.up);
Physics.Raycast(downRay, out hit);
float currentAltitude = drone.transform.position.y;
float error = hoverHeight currentAltitude;
float forceMultiplier = Mathf.Clamp01(altitudePID.Update(error));
Vector3 appliedHoverForce = Vector3.up * (forceMultiplier * hoverForce);
droneRigidBody.AddRelativeForce(appliedHoverForce, ForceMode.Force);
}
private void ReturnToStartingPosition()
{
drone.transform.position = zeroPosition;
drone.transform.rotation = zeroRotation;
hoverHeight = 0.0f;
}
}
Step by Step Solution
There are 3 Steps involved in it
Get step-by-step solutions from verified subject matter experts
