void LateUpdate()
    {
        //try {


        if (zmq != null)
        {
            if (zmq.getNewestData(out output))
            {
                //Expect righthand, X front, Z up coordinate system
                m_position = CoordinateTransformations.VectorToGameEngine(new Vector3(output.px, output.py, output.pz));
                m_rotation = CoordinateTransformations.QuaternionToGameEngine(new Quaternion(output.qx, output.qy, output.qz, output.qw));


                //update height if walking on ground
                if (WalkOnGround)
                {
                    //trace from new x,z coordinates and old height, with height = new height
                    m_position = FallToGround(m_position, m_position.y);
                }
            }
        }
        transform.position = m_position;
        transform.rotation = m_rotation;

        //trigger position update
        TriggerPositionUpdate(m_position, m_rotation);
    }
Ejemplo n.º 2
0
        public static void GetHelioCentricState(DateTime epoch, Coordinates coordinates)
        {
            /*
             * Possible use would be : get for a satellite several heliocentric states in different frames, though it is doubtful one would ever need this.
             * Normally, you would expect to retrieve one set of Keplerian and Cartesian state with same frame
             */
            if (coordinates.Body == null)
            {
                throw new ArgumentNullException();
            }
            Body body = coordinates.Body.Value;
            KeplerianCoordinates keplerianCoordinates = coordinates.KeplerianCoordinates;

            if (coordinates.CoordinatesNeeded.Keplerian)
            {
                GetHelioCentricKeplerianElements(body, epoch, keplerianCoordinates);
            }

            if (coordinates.CoordinatesNeeded.Cartesian)
            {
                KeplerianCoordinates dummyKeplerianCoordinates;
                foreach (CartesianCoordinates cartesianCoordinates in coordinates.CartesianCoordinates)
                {
                    cartesianCoordinates.Origin = Body.Sun;
                    if (keplerianCoordinates == null || keplerianCoordinates.CoordinateFrame != cartesianCoordinates.CoordinateFrame)//TESTME sending a nonnull KeplerianCoord with a null coordinate frame
                    {
                        dummyKeplerianCoordinates = new KeplerianCoordinates
                        {
                            CoordinateFrame = cartesianCoordinates.CoordinateFrame
                        };
                        GetHelioCentricKeplerianElements(body, epoch, dummyKeplerianCoordinates);
                    }
                    else
                    {
                        dummyKeplerianCoordinates = keplerianCoordinates;
                    }
                    CoordinateTransformations.ConvertKeplerianToCartesian(dummyKeplerianCoordinates, cartesianCoordinates);
                }
            }
            else
            {
                throw new NotImplementedException();
            }
        }
Ejemplo n.º 3
0
        public static DefaultState GetDefaultState(DateTime?epoch = null)
        {
            CartesianCoordinates cartesianCoordinates = new CartesianCoordinates
            {
                CoordinateFrame = Frame.EME2000,
                Origin          = Body.Earth,
            };
            Coordinates coordinates = new Coordinates
            {
                Body = Body.Earth,
                CartesianCoordinates = new List <CartesianCoordinates>
                {
                    cartesianCoordinates,
                },
            };
            DefaultState defaultState = new DefaultState
            {
                CoordinateType = CoordinateType.Cartesian,
                Coordinates    = coordinates,
            };

            if (epoch == null)
            {
                return(defaultState); //FIXME
            }
            else
            {
                defaultState.Epoch = epoch;
                DefaultState         earthDefaultState = Earth.GetDefaultState(epoch);
                CartesianCoordinates earthCartesian    = new CartesianCoordinates
                {
                    Depth = CartesianDepth.Velocity,
                };
                CoordinateTransformations.ConvertKeplerianToCartesian(earthDefaultState.Coordinates.KeplerianCoordinates, earthCartesian);
                earthCartesian.Negative();
                cartesianCoordinates        = earthCartesian;
                cartesianCoordinates.Origin = Body.Earth;
                defaultState.Coordinates.CartesianCoordinates = new List <CartesianCoordinates>
                {
                    cartesianCoordinates
                };
                return(defaultState);
            }
        }
Ejemplo n.º 4
0
    public void positionUpdate(Vector3 pos, Quaternion ori)
    {
        miVRlink.Position6DofMessage msg = new miVRlink.Position6DofMessage();

        pos = CoordinateTransformations.GameEngineToVector(pos);
        ori = CoordinateTransformations.GameEngineToQuaternion(ori);

        msg.timestamp_system = Time.time;
        msg.timestamp_device = Time.time;

        msg.px = pos.x;
        msg.py = pos.y;
        msg.pz = pos.z;

        msg.qw = ori.w;
        msg.qx = ori.x;
        msg.qy = ori.y;
        msg.qz = ori.z;

        zmq.sendData(msg);
    }
Ejemplo n.º 5
0
    private void SendRobotTargetPose(TimeSpan currentTime, Quaternion currentRotation, Vector3 currentPosition)
    {
        int[]       structuredTime = Timer.GetSecondsNanosecondsStructure(currentTime);
        PoseStamped message        = new PoseStamped();

        message.header.frame_id    = Config.HololensWorldFrame;
        message.header.seq         = robotTargetPoseFrameIdx++;
        message.header.stamp.secs  = structuredTime[0];
        message.header.stamp.nsecs = structuredTime[1];

        CoordinateTransformations.ConvertPoseUnity2ROS(ref currentPosition, ref currentRotation);
        message.pose.orientation.x = Quaternion.identity.x;
        message.pose.orientation.y = Quaternion.identity.y;
        message.pose.orientation.z = Quaternion.identity.z;
        message.pose.orientation.w = Quaternion.identity.w;

        message.pose.position.x = currentPosition.x;
        message.pose.position.y = currentPosition.y;
        message.pose.position.z = currentPosition.z;

        robotTargetPosePublisher.Publish(message);
        System.Diagnostics.Debug.WriteLine("ROBOT TARGET POSE at time: " + ((double)structuredTime[0] + ((double)structuredTime[1]) / 1e9).ToString() +
                                           " --- (" + currentPosition.x + ", " + currentPosition.y + ", " + currentPosition.z + ")");
    }
    private void SendPose(TimeSpan currentTime, Quaternion currentRotation, Vector3 currentPosition)
    {
        int[] structuredTime = Timer.GetSecondsNanosecondsStructure(currentTime);
        RosSharp.RosBridgeClient.Messages.Geometry.PoseStamped message = new RosSharp.RosBridgeClient.Messages.Geometry.PoseStamped();

        message.header.frame_id    = Config.HololensWorldFrame;
        message.header.seq         = frameIdx++;
        message.header.stamp.secs  = structuredTime[0];
        message.header.stamp.nsecs = structuredTime[1];

        CoordinateTransformations.ConvertPoseUnity2ROS(ref currentPosition, ref currentRotation);
        message.pose.orientation.x = currentRotation.x;
        message.pose.orientation.y = currentRotation.y;
        message.pose.orientation.z = currentRotation.z;
        message.pose.orientation.w = currentRotation.w;

        message.pose.position.x = currentPosition.x;
        message.pose.position.y = currentPosition.y;
        message.pose.position.z = currentPosition.z;

        publisher.Publish(message);
        System.Diagnostics.Debug.WriteLine("POSE at time: " + ((double)structuredTime[0] + ((double)structuredTime[1]) / 1e9).ToString() +
                                           " --- (" + currentPosition.x + ", " + currentPosition.y + ", " + currentPosition.z + ")");
    }
Ejemplo n.º 7
0
    void doUpdate()
    {
        //try {


        if (zmq != null)
        {
            if (zmq.getNewestData(out output))
            {
                //Expect righthand, X front, Z up coordinate system
                pos = CoordinateTransformations.VectorToGameEngine(new Vector3(output.px, output.py, output.pz));
                ori = CoordinateTransformations.QuaternionToGameEngine(new Quaternion(output.qx, output.qy, output.qz, output.qw));

                m_rotation = ori;

                //update height if walking on ground
                if (WalkOnGround)
                {
                    //trace from new x,z coordinates and old height, with height = new height
                    m_position = FallToGround(new Vector3(pos.x, m_position.y, pos.z), pos.y);
                }
                else
                {
                    m_position = pos;
                }
            }
            Invoke("doUpdate", updateTime);
        }
        else
        {
            Invoke("doUpdate", 1f);
        }

        //trigger position update
        TriggerPositionUpdate(m_position, m_rotation);
    }
Ejemplo n.º 8
0
        public static void GetState(State state)
        {
            if (state == null)
            {
                throw new ArgumentNullException();
            }
            state.CheckValidity();

            Body         body             = state.Body.Value;
            DateTime     epoch            = state.Epoch;
            DefaultState bodyDefaultState = CelestialBodies.GetDefaultState(body, epoch);

            defaultStates.Add(body, bodyDefaultState);

            foreach (Coordinates mainCoordinates in state.CoordinatesSet)
            {
                if (mainCoordinates.CoordinatesNeeded == null || mainCoordinates.Body == null)
                {
                    throw new ArgumentNullException();
                }

                Body origin = mainCoordinates.Body.Value;
                if (origin == body)
                {
                    throw new InvalidOperationException();
                }

                DefaultState originDefaultState = new DefaultState();
                if (bodyDefaultState.Coordinates.Body != origin)
                {
                    originDefaultState = CelestialBodies.GetDefaultState(origin);
                    defaultStates.Add(origin, originDefaultState);
                }

                CoordinatesNeeded coordinatesNeeded = mainCoordinates.CoordinatesNeeded;

                if (coordinatesNeeded.Keplerian)
                {
                    //Earth-Sun, Sun-Earth
                    if (bodyDefaultState.Coordinates.Body == origin)
                    {
                        if (bodyDefaultState.CoordinateType == CoordinateType.Keplerian)
                        {
                            CoordinateTransformations.ConvertKeplerianFrame(bodyDefaultState.Coordinates.KeplerianCoordinates, mainCoordinates.KeplerianCoordinates);
                        }
                        else if (bodyDefaultState.CoordinateType == CoordinateType.Cartesian)
                        {
                            CoordinateTransformations.ConvertCartesianToKeplerian(bodyDefaultState.Coordinates.CartesianCoordinates.First(), mainCoordinates.KeplerianCoordinates);
                        }
                        else
                        {
                            throw new NotImplementedException();
                        }
                    }
                    // Sun-Mars , Sun default earth, Mars default sun
                    else if (originDefaultState.Coordinates.Body == body)
                    {
                        CartesianCoordinates dummyCartesianCoordinates = new CartesianCoordinates
                        {
                            CoordinateFrame = mainCoordinates.KeplerianCoordinates.CoordinateFrame,
                            Depth           = CartesianDepth.Velocity,
                        };
                        if (originDefaultState.CoordinateType == CoordinateType.Keplerian)
                        {
                            CartesianCoordinates cartesianCoordinates1 = new CartesianCoordinates
                            {
                                Depth = CartesianDepth.Velocity,
                            };
                            CoordinateTransformations.ConvertKeplerianToCartesian(originDefaultState.Coordinates.KeplerianCoordinates, cartesianCoordinates1);

                            CoordinateTransformations.ConvertCartesianFrame(cartesianCoordinates1, dummyCartesianCoordinates);
                        }
                        else if (originDefaultState.CoordinateType == CoordinateType.Cartesian)
                        {
                            CoordinateTransformations.ConvertCartesianFrame(originDefaultState.Coordinates.CartesianCoordinates.First(), dummyCartesianCoordinates);
                        }
                        dummyCartesianCoordinates.Negative();
                        CoordinateTransformations.ConvertCartesianToKeplerian(dummyCartesianCoordinates, mainCoordinates.KeplerianCoordinates);
                    }

                    //Moon-Sun
                    //Sun-Moon
                }
                if (coordinatesNeeded.Cartesian)
                {
                    foreach (CartesianCoordinates cartesianCoordinates in mainCoordinates.CartesianCoordinates)
                    {
                        if (cartesianCoordinates == null || cartesianCoordinates.CoordinateFrame == null)
                        {
                            throw new ArgumentNullException();
                        }
                        cartesianCoordinates.Origin = origin;
                        if (origin != body)
                        {
                            CartesianCoordinates dummyCartesianCoordinates = new CartesianCoordinates
                            {
                                Depth           = cartesianCoordinates.Depth,
                                CoordinateFrame = cartesianCoordinates.CoordinateFrame,
                            };
                            Coordinates dummyCoordinates = new Coordinates
                            {
                                Body = origin,
                                CoordinatesNeeded = new CoordinatesNeeded
                                {
                                    Cartesian = true,
                                },
                                KeplerianCoordinates = mainCoordinates.KeplerianCoordinates,
                                CartesianCoordinates = new List <CartesianCoordinates>
                                {
                                    dummyCartesianCoordinates,
                                }
                            };
                            GetHelioCentricState(state.Epoch, dummyCoordinates);
                            dummyCartesianCoordinates.Negative(); //BETTERME
                            cartesianCoordinates.Position = dummyCartesianCoordinates.Position;
                            if (cartesianCoordinates.Depth >= CartesianDepth.Velocity)
                            {
                                cartesianCoordinates.Velocity = dummyCartesianCoordinates.Velocity;
                            }
                        }
                        else
                        {
                            cartesianCoordinates.Position = Vector <double> .Build.Dense(3);

                            if (cartesianCoordinates.Depth >= CartesianDepth.Velocity)
                            {
                                cartesianCoordinates.Velocity = Vector <double> .Build.Dense(3);
                            }
                        }
                    }
                }
            }
        }