Пример #1
0
        public static string ToLatLongString(this NavSatFixMsg message)
        {
            string lat = (message.latitude > 0) ? "ºN" : "ºS";
            string lon = (message.longitude > 0) ? "ºE" : "ºW";

            return($"{message.latitude}{lat} {message.longitude}{lon}");
        }
Пример #2
0
    /// <param name="data">X: Angular speed in meter/s, Y: Linear speed in meter/s</param>
    public void PublishData(GeoPointWGS84 data)
    {
        if (_publisher == null)
        {
            return;
        }

        NavSatFixMsg navSatFix = new NavSatFixMsg(data.latitude, data.longitude, data.altitude);

        _publisher.PublishData(navSatFix);
    }
Пример #3
0
    public void ReceivedWaypoint(ROSBridgeMsg newGoal)
    {
        NavSatFixMsg  waypoint   = (NavSatFixMsg)newGoal;
        GeoPointWGS84 coordinate = new GeoPointWGS84()
        {
            latitude  = waypoint._latitude,
            longitude = waypoint._longitude,
            altitude  = waypoint._altitude
        };

        goal     = coordinate.ToUTM().ToUnity();
        goal_set = true;
        subState = "STOP";
    }
Пример #4
0
    public static Vector2 VectorFromGPS(NavSatFixMsg position1, NavSatFixMsg position2)
    {
        double lon_diff_rad = Mathf.Deg2Rad * (position2.GetLongitude() - position1.GetLongitude());
        double a            = Math.Pow(Math.Sin(Mathf.Deg2Rad * (position2.GetLatitude() - position1.GetLatitude()) * 0.5), 2) +
                              Math.Cos(Mathf.Deg2Rad * position1.GetLatitude()) * Math.Cos(Mathf.Deg2Rad * position2.GetLatitude()) *
                              Math.Pow(Math.Sin(lon_diff_rad * 0.5), 2);
        double c        = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
        double distance = EARTH_RADIUS_METERS * c;

        double x = Math.Cos(Mathf.Deg2Rad * position1.GetLatitude()) * Math.Sin(Mathf.Deg2Rad * position2.GetLatitude()) -
                   Math.Sin(Mathf.Deg2Rad * position1.GetLatitude()) * Math.Cos(Mathf.Deg2Rad * position2.GetLatitude()) *
                   Math.Cos(lon_diff_rad);
        double  y             = Math.Cos(Mathf.Deg2Rad * position2.GetLatitude()) * Math.Sin(lon_diff_rad);
        double  bearing_angle = Math.Atan2(y, x);
        Vector2 bearing       = new Vector2((float)Math.Sin(bearing_angle), (float)Math.Cos(bearing_angle));

        return(bearing * (float)distance);
    }
Пример #5
0
 public ROSLocomotionWaypoint(AgentJob job, ROSBridgeWebSocketConnection rosConnection, string topicName)
 {
     if (job == AgentJob.Publisher)
     {
         _publisher = new ROSGenericPublisher(rosConnection, topicName, NavSatFixMsg.GetMessageType());
         rosConnection.AddPublisher(_publisher);
     }
     else if (job == AgentJob.Subscriber)
     {
         _subscriber = new ROSGenericSubscriber <NavSatFixMsg>(rosConnection, topicName, NavSatFixMsg.GetMessageType(), (msg) => new NavSatFixMsg(msg));
         _subscriber.OnDataReceived += (data) =>
         {
             if (OnDataReceived != null)
             {
                 OnDataReceived(data);
             }
         };
         rosConnection.AddSubscriber(_subscriber);
     }
 }
Пример #6
0
    // Update is called once per frame
    void Update()
    {
        if (dji_sdk == null)
        {
            dji_sdk = GetComponent <DJI_SDK>();
        }
        if (dji_sdk != null && dji_sdk.sdk_ready)
        {
            if (origin_position == null)
            {
                origin_position = dji_sdk.GetGPSPosition();
            }
            else
            {
                Vector3 ground_displacement = DJI_SDK.VectorFromGPS(origin_position, dji_sdk.GetGPSPosition());
                transform.localPosition = new Vector3(ground_displacement.x, dji_sdk.GetHeightAboveTakeoff(), ground_displacement.y);
            }
            transform.localRotation = dji_sdk.GetAttitude();

            //if (Input.GetKeyUp(KeyCode.W))
            //{
            //    dji_sdk.PublishRelativeSetPoint(new Vector2(0, 1), dji_sdk.GetHeightAboveTakeoff(), 0);
            //} else if (Input.GetKeyUp(KeyCode.A))
            //{
            //    dji_sdk.PublishRelativeSetPoint(new Vector2(-1, 0), dji_sdk.GetHeightAboveTakeoff(), 0);
            //} else if (Input.GetKeyUp(KeyCode.S))
            //{
            //    dji_sdk.PublishRelativeSetPoint(new Vector2(0, -1), dji_sdk.GetHeightAboveTakeoff(), 0);
            //} else if (Input.GetKeyUp(KeyCode.D))
            //{
            //    dji_sdk.PublishRelativeSetPoint(new Vector2(1, 0), dji_sdk.GetHeightAboveTakeoff(), 0);
            //}

            if (Input.GetKey(KeyCode.W))
            {
                dji_sdk.PublishRateSetpoint(0, 5, dji_sdk.GetHeightAboveTakeoff(), 0);
            }
            else if (Input.GetKey(KeyCode.A))
            {
                dji_sdk.PublishRateSetpoint(-5, 0, dji_sdk.GetHeightAboveTakeoff(), 0);
            }
            else if (Input.GetKey(KeyCode.S))
            {
                dji_sdk.PublishRateSetpoint(0, -5, dji_sdk.GetHeightAboveTakeoff(), 0);
            }
            else if (Input.GetKey(KeyCode.D))
            {
                dji_sdk.PublishRateSetpoint(5, 0, dji_sdk.GetHeightAboveTakeoff(), 0);
            }
            else
            {
                dji_sdk.PublishRateSetpoint(0, 0, dji_sdk.GetHeightAboveTakeoff(), 0);
            }

            if (Input.GetKeyUp(KeyCode.Space))
            {
                if (!dji_sdk.HasAuthority())
                {
                    dji_sdk.SetSDKControl(true);
                }
                else if (dji_sdk.GetFlightStatusM100() == DJI_SDK.FlightStatusM100.ON_GROUND_STANDBY)
                {
                    dji_sdk.ExecuteTask(DJI_SDK.DroneTask.TAKEOFF);
                }
                else if (dji_sdk.GetFlightStatusM100() == DJI_SDK.FlightStatusM100.IN_AIR_STANDBY)
                {
                    dji_sdk.ExecuteTask(DJI_SDK.DroneTask.LAND);
                }
            }
            else if (Input.GetKeyUp(KeyCode.Escape))
            {
                if (dji_sdk.HasAuthority())
                {
                    dji_sdk.ExecuteTask(DJI_SDK.DroneTask.GO_HOME);
                }
            }
            else if (Input.GetKeyUp(KeyCode.R))
            {
                if (dji_sdk.HasAuthority())
                {
                    dji_sdk.SetSDKControl(false);
                }
            }
        }
    }
Пример #7
0
    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(init))
        {
            Drone drone = WorldProperties.SelectNextDrone();
            rosDroneConnection = (Matrice_ROSDroneConnection)drone.droneProperties.droneROSConnection;
        }

        if (Input.GetKeyDown(viewHomeLat))
        {
            double homeLat = rosDroneConnection.GetHomeLat();
            Debug.LogFormat("Home Latitute set to {0}", homeLat);
        }

        if (Input.GetKeyDown(viewHomeLong))
        {
            double homeLong = rosDroneConnection.GetHomeLong();
            Debug.LogFormat("Home Longitute set to {0}", homeLong);
        }

        if (printLatLong)
        {
            NavSatFixMsg gpsPosition = rosDroneConnection.GetGPSPosition();
            Debug.LogFormat("Drone Lat,Long : {0},{1}", gpsPosition.GetLatitude(), gpsPosition.GetLongitude());
        }

        if (printGPSHealth)
        {
            float gpsHealth = rosDroneConnection.GetGPSHealth();
            Debug.LogFormat("GPS Health : {0}", gpsHealth);
        }

        if (Input.GetKeyUp(hasAuthority))
        {
            rosDroneConnection.HasAuthority();
        }

        if (Input.GetKeyUp(getAuthority))
        {
            rosDroneConnection.SetSDKControl(true);
        }

        if (Input.GetKeyUp(KeyCode.Space))
        {
            rosDroneConnection.SetSDKControl(false);
        }

        if (Input.GetKeyDown(spinMotors))
        {
            rosDroneConnection.ChangeArmStatusTo(true);
        }

        if (Input.GetKeyDown(stopMotors))
        {
            rosDroneConnection.ChangeArmStatusTo(false);
        }

        if (Input.GetKeyUp(takeoffDrone))
        {
            rosDroneConnection.ExecuteTask(Matrice_ROSDroneConnection.DroneTask.TAKEOFF);
        }

        if (Input.GetKeyUp(landDrone))
        {
            rosDroneConnection.ExecuteTask(Matrice_ROSDroneConnection.DroneTask.LAND);
        }

        if (Input.GetKeyUp(uploadTestMission))
        {
            uint[] command_list   = new uint[16];
            uint[] command_params = new uint[16];
            for (int i = 0; i < 16; i++)
            {
                command_list[i]   = 0;
                command_params[i] = 0;
            }

            MissionWaypointMsg test_waypoint_1 = new MissionWaypointMsg(37.915701652f, -122.337967237f, 20.0f, 3.0f, 0, 0, MissionWaypointMsg.TurnMode.CLOCKWISE, 0, 30, new MissionWaypointActionMsg(0, command_list, command_params));
            MissionWaypointMsg test_waypoint_2 = new MissionWaypointMsg(37.915585270f, -122.338122805f, 20.0f, 3.0f, 0, 0, MissionWaypointMsg.TurnMode.CLOCKWISE, 0, 30, new MissionWaypointActionMsg(0, command_list, command_params));
            MissionWaypointMsg test_waypoint_3 = new MissionWaypointMsg(37.915457249f, -122.338015517f, 20.0f, 3.0f, 0, 0, MissionWaypointMsg.TurnMode.CLOCKWISE, 0, 30, new MissionWaypointActionMsg(0, command_list, command_params));

            Debug.Log("Check float accuracy here" + test_waypoint_1.ToYAMLString());

            MissionWaypointMsg[] test_waypoint_array = new MissionWaypointMsg[] { test_waypoint_1, test_waypoint_2, test_waypoint_3 };

            MissionWaypointTaskMsg test_Task = new MissionWaypointTaskMsg(15.0f, 15.0f, MissionWaypointTaskMsg.ActionOnFinish.NO_ACTION, 1, MissionWaypointTaskMsg.YawMode.AUTO, MissionWaypointTaskMsg.TraceMode.COORDINATED, MissionWaypointTaskMsg.ActionOnRCLost.FREE, MissionWaypointTaskMsg.GimbalPitchMode.FREE, test_waypoint_array);

            rosDroneConnection.UploadWaypointsTask(test_Task);
        }

        if (Input.GetKeyUp(missionInfo))
        {
            rosDroneConnection.FetchMissionStatus();
        }

        if (Input.GetKeyUp(executeUploadedMission))
        {
            rosDroneConnection.SendWaypointAction(Matrice_ROSDroneConnection.WaypointMissionAction.START);
        }

        if (Input.GetKeyUp(viewSafeWaypointMission))
        {
            // 37.915411
            // -122.338024

            // 37.915159, -122.337983


            // LEFT CORNER:  37.915188, -122.337988
            // RIGHT CORNER: 37.915262, -122.337984


            GameObject waypoint1 = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            waypoint1.name                    = "Waypoint 1";
            waypoint1.transform.parent        = this.transform;
            waypoint1.transform.localPosition = WorldProperties.GPSCoordToUnityCoord(new GPSCoordinate(37.915701652, -122.337967237, 20));
            waypoint1.transform.localScale    = Vector3.one * (0.05f);

            Debug.Log("SANITY CHECK GPS: " + WorldProperties.UnityCoordToGPSCoord(WorldProperties.GPSCoordToUnityCoord(new GPSCoordinate(37.915701652, -122.337967237, 20))).Lat);
            Debug.Log("SANITY CHECK GPS: " + WorldProperties.UnityCoordToGPSCoord(WorldProperties.GPSCoordToUnityCoord(new GPSCoordinate(37.915701652, -122.337967237, 20))).Lng);
            GameObject waypoint2 = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            waypoint2.name                    = "Waypoint 2";
            waypoint2.transform.parent        = this.transform;
            waypoint2.transform.localPosition = WorldProperties.GPSCoordToUnityCoord(new GPSCoordinate(37.915585270, -122.338122805, 20));
            waypoint2.transform.localScale    = Vector3.one * (0.05f);

            GameObject waypoint3 = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            waypoint3.name                    = "Waypoint 3";
            waypoint3.transform.parent        = this.transform;
            waypoint3.transform.localPosition = WorldProperties.GPSCoordToUnityCoord(new GPSCoordinate(37.915457249, -122.338015517, 20));
            waypoint3.transform.localScale    = Vector3.one * (0.05f);
        }

        if (Input.GetKeyUp(uploadUserMission))
        {
            rosDroneConnection.StartMission();
        }

        if (Input.GetKeyUp(pauseMission))
        {
            rosDroneConnection.SendWaypointAction(Matrice_ROSDroneConnection.WaypointMissionAction.PAUSE);
        }

        if (Input.GetKeyUp(resumeMission))
        {
            rosDroneConnection.SendWaypointAction(Matrice_ROSDroneConnection.WaypointMissionAction.RESUME);
        }

        if (Input.GetKeyDown(stopMission))
        {
            rosDroneConnection.SendWaypointAction(Matrice_ROSDroneConnection.WaypointMissionAction.STOP);
        }

        if (Input.GetKeyUp(cycleDrone))
        {
            Drone drone = WorldProperties.SelectNextDrone();
            rosDroneConnection = (Matrice_ROSDroneConnection)drone.droneProperties.droneROSConnection;
        }

        if (Input.GetKeyDown(cycleSensor))
        {
            WorldProperties.sensorManager.ShowNextSensor();
        }

        if (Input.GetKeyDown(unsubscribe))
        {
            ROSSensorConnectionInterface sensor         = WorldProperties.sensorManager.getSelectedSensor();
            Dictionary <string, bool>    subscriberDict = WorldProperties.sensorManager.getSubscriberDict();
            foreach (string topic in subscriberDict.Keys)
            {
                sensor.Unsubscribe(topic);
            }
        }
    }
Пример #8
0
 /// <summary>
 /// Convert the given ROS NavSatFixMsg to Unity XYZ space.
 /// To Be used to convert drone coordinates to unity space
 /// </summary>
 /// <returns>Unity position vector to use within World GameObject</returns>
 public static Vector3 ROSCoordToUnityCoord(NavSatFixMsg gpsPosition)
 {
     return(GPSCoordToUnityCoord(new GPSCoordinate(gpsPosition.GetLatitude(), gpsPosition.GetLongitude(), gpsPosition.GetAltitude())));
 }
Пример #9
0
    public ROSBridgeMsg OnReceiveMessage(string topic, JSONNode raw_msg, ROSBridgeMsg parsed = null)
    {
        ROSBridgeMsg result = null;

        // Writing all code in here for now. May need to move out to separate handler functions when it gets too unwieldy.
        switch (topic)
        {
        case "/dji_sdk/attitude":
            QuaternionMsg attitudeMsg = (parsed == null) ? new QuaternionMsg(raw_msg["quaternion"]) : (QuaternionMsg)parsed;
            attitude = offset * (new Quaternion(attitudeMsg.GetX(), attitudeMsg.GetY(), attitudeMsg.GetZ(), attitudeMsg.GetW()));
            result   = attitudeMsg;
            break;

        case "/dji_sdk/battery_state":
            battery_state = (parsed == null) ? new BatteryStateMsg(raw_msg) : (BatteryStateMsg)parsed;
            result        = battery_state;
            break;

        case "/dji_sdk/flight_status":
            if (isM100)
            {
                m100_flight_status = (FlightStatusM100)(new UInt8Msg(raw_msg)).GetData();
            }
            else
            {
                flight_status = (FlightStatus)(new UInt8Msg(raw_msg)).GetData();
            }
            break;

        case "/dji_sdk/gimbal_angle":
            Vector3Msg gimbleAngleMsg = (parsed == null) ? new Vector3Msg(raw_msg["vector"]) : (Vector3Msg)parsed;
            gimble_joint_angles = new Vector3((float)gimbleAngleMsg.GetX(), (float)gimbleAngleMsg.GetY(), (float)gimbleAngleMsg.GetZ());
            result = gimbleAngleMsg;
            break;

        case "/dji_sdk/gps_health":
            gps_health = (parsed == null) ? (new UInt8Msg(raw_msg)).GetData() : ((UInt8Msg)parsed).GetData();
            break;

        case "/dji_sdk/gps_position":
            gps_position = (parsed == null) ? new NavSatFixMsg(raw_msg) : (NavSatFixMsg)parsed;
            result       = gps_position;
            break;

        case "/dji_sdk/imu":
            imu    = (parsed == null) ? new IMUMsg(raw_msg) : (IMUMsg)parsed;
            result = imu;
            break;

        case "/dji_sdk/rc":
            remote_controller_msg = (parsed == null) ? new JoyMsg(raw_msg) : (JoyMsg)parsed;
            result = remote_controller_msg;
            break;

        case "/dji_sdk/velocity":
            Vector3Msg velocityMsg = (parsed == null) ? new Vector3Msg(raw_msg["vector"]) : (Vector3Msg)parsed;
            velocity = new Vector3((float)velocityMsg.GetX(), (float)velocityMsg.GetY(), (float)velocityMsg.GetZ());
            result   = velocityMsg;
            break;

        case "/dji_sdk/height_above_takeoff":
            relative_altitude = (parsed == null) ? (new Float32Msg(raw_msg)).GetData() : ((Float32Msg)parsed).GetData();
            break;

        case "/dji_sdk/local_position":
            PointMsg pointMsg = (parsed == null) ? new PointMsg(raw_msg["point"]) : (PointMsg)parsed;
            local_position = new Vector3(pointMsg.GetX(), pointMsg.GetY(), pointMsg.GetZ());
            result         = pointMsg;
            Debug.Log(result);
            break;

        default:
            Debug.LogError("Topic not implemented: " + topic);
            break;
        }
        return(result);
    }