예제 #1
0
        // Extract and convert Rotation and Center data to matrix
        private AARServo ExtractServoInformation(JToken _jobj, string _servoName)
        {
            var servo = _jobj[_servoName];
            var LtP   = servo["LocalToPVCamera"];

            // Local to PV camera transform
            Matrix4x4 T = new Matrix4x4();

            for (int i = 0; i < 3; ++i)
            {
                JToken v = LtP[i];

                Vector4 vec = new Vector4(
                    v[0].ToObject <float>(),
                    v[1].ToObject <float>(),
                    v[2].ToObject <float>(),
                    v[3].ToObject <float>() / 1000.0f);
                T.SetRow(i, vec);
            }
            T.m33 = 1;

            // Range of servo in degrees
            var rangeJson = servo["RangeDegrees"];

            AARServo.Range range = new AARServo.Range(
                rangeJson[0].ToObject <float>(),
                rangeJson[1].ToObject <float>());

            // Hard limits of servo in degrees
            var limitJson = servo["LimitDegrees"];

            AARServo.Range limit = new AARServo.Range(
                limitJson[0].ToObject <float>(),
                limitJson[1].ToObject <float>());

            // The axis of rotation for the servo
            var     axisJson = servo["AxisOfRotation"];
            Vector3 axis     = new Vector3(
                axisJson[0].ToObject <float>(),
                axisJson[1].ToObject <float>(),
                axisJson[2].ToObject <float>());

            // Get ID used for the Arduino
            int servoID = servo["ID"].ToObject <int>();

            // Calibrated center for servo at rest (i.e. facing forward parallel with the hololens)
            float calibratedCenter = servo["CalibratedCenter"].ToObject <float>();

            // Get the ticks used in calibration and calcualted degrees
            float servoTicks = servo["ServoTick"].ToObject <float>();
            float calibratedRotationDegree = servo["CalibratedRotationDegree"].ToObject <float>();

            var s = new AARServo(
                _servoName,
                servoID,
                axis,
                T,
                range,
                limit,
                calibratedCenter,
                servoTicks,
                calibratedRotationDegree);

            return(s);
        }
예제 #2
0
        ////////////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////////////
        ///
        /// PARSING METHODS
        ///
        ////////////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////////////

        #region CALIB_PARSING

        private void ParseAllCalibrationData()
        {
            //////////////////////////////////////////////////////////////////////////////////////////////////
            // Build All Hololens Sensors (VLC and PV)\
            //////////////////////////////////////////////////////////////////////////////////////////////////

            {
                TextAsset jText           = Resources.Load(HololensSensorCalibFile) as TextAsset;
                JObject   sensorCalibJObj = JObject.Parse(jText.text);



                foreach (var name in m_sensorNames)
                {
                    var sensor = ExtractSensorInformation(sensorCalibJObj, name);
                    HololensSensorList.Add(name, sensor);
                }
            }

            // Visualize structure;
            m_sensorStructure                         = new GameObject();
            m_sensorStructure.name                    = "CameraSensorStructure";
            m_sensorStructure.transform.parent        = m_AARCameraProjectorRig.transform;
            m_sensorStructure.transform.localPosition = Vector3.zero;

            foreach (var sensor in HololensSensorList)
            {
                GameObject obj = (SensorModel == null) ?
                                 GameObject.CreatePrimitive(PrimitiveType.Sphere) :
                                 GameObject.Instantiate(SensorModel);
                obj.name                    = sensor.Key.ToString();
                obj.transform.parent        = m_sensorStructure.transform;
                obj.transform.localPosition = Vector3.zero;

                obj.transform.localPosition = sensor.Value.GetPositionHololensFrameOfReference();
                obj.transform.rotation      = sensor.Value.GetRotationHololensFrameOfReference();

                sensor.Value.AttachGameObject(obj);
            }


            //////////////////////////////////////////////////////////////////////////////////////////////////
            // Build servo and projector
            //////////////////////////////////////////////////////////////////////////////////////////////////


            // TODO: Attach the servo and projector scripts directly to these game objects
            // TODO: Create projector script that can take in the json format
            {
                TextAsset jText         = Resources.Load(ServoProjectorCalibFile) as TextAsset;
                JObject   servoProCalib = JObject.Parse(jText.text);

                // Servo
                var servos = servoProCalib["Servos"];
                foreach (var servoName in ServoNames)
                {
                    var servo = ExtractServoInformation(servos, servoName);
                    ServoList.Add(servoName, servo);
                }

                // Projector
                var projectors = servoProCalib["ProjectorViews"];
                foreach (var projectorName in ProjectorNames)
                {
                    var projector = ExtractProjectorInformation(projectors, projectorName);
                    ProjectorList.Add(projectorName, projector);
                }
            }

            // Create structure on hololens
            m_servoProjectorStructure                         = new GameObject();
            m_servoProjectorStructure.name                    = "ServoProjectorStructure";
            m_servoProjectorStructure.transform.parent        = m_AARCameraProjectorRig.transform;
            m_servoProjectorStructure.transform.localPosition = Vector3.zero;

            // Servos (ordering matters!)
            AARServo lastAddedServo = null;

            foreach (var servoName in ServoNames)
            {
                AARServo servo = ServoList[servoName];

                // Servo Object
                GameObject servoObj = new GameObject();
                servoObj.name                    = servo.GetName();
                servoObj.transform.parent        = m_servoProjectorStructure.transform;
                servoObj.transform.localPosition = Vector3.zero;

                // Set positio and rotation based on calibration
                var pvCamera = HololensSensorList[
                    Util.SensorTypeToString(HololensSensorType.AAR_SENSOR_PVCAMERA)
                               ];

                Matrix4x4 coordinateChange = Matrix4x4.Rotate(Quaternion.Euler(0, 0, 180));

                Vector4   p = new Vector4(0, 0, 0, 1);
                Matrix4x4 servoToHololens =
                    coordinateChange *
                    pvCamera.GetLocalToHololensFrameOfReferenceMatrix() *
                    servo.GetLocalToPVCameraMatrix() *
                    coordinateChange;

                servoObj.transform.localPosition = servoToHololens * p;
                servoObj.transform.localRotation = servoToHololens.rotation;

                // Check if there is a previous servo for linking
                if (lastAddedServo != null)
                {
                    GameObject previousServo = lastAddedServo.GetRotationGameObject();
                    servoObj.transform.parent = previousServo.transform;
                }

                servo.AttachGameObject(servoObj);
                lastAddedServo = servo;
            }

            // Projectors
            foreach (var projector in ProjectorList)
            {
                GameObject projectoObj = new GameObject();
                projectoObj.name                    = projector.Key.ToString();
                projectoObj.transform.parent        = m_servoProjectorStructure.transform;
                projectoObj.transform.localPosition = Vector3.zero;

                // Set positon and rotation based on calibration
                var pvCamera = HololensSensorList[
                    Util.SensorTypeToString(HololensSensorType.AAR_SENSOR_PVCAMERA)
                               ];

                Vector4   p = new Vector4(0, 0, 0, 1);
                Matrix4x4 coordinateChange = Matrix4x4.Rotate(Quaternion.Euler(0, 0, 180));
                Matrix4x4 servoToHololens  =
                    coordinateChange *
                    pvCamera.GetLocalToHololensFrameOfReferenceMatrix() *
                    projector.Value.GetLocalToPVCameraMatrix(); // * coordinateChange;

                // Set local positions
                projectoObj.transform.localPosition = servoToHololens * p;
                projectoObj.transform.localRotation = servoToHololens.rotation;

                // Attach to last seen servo
                if (lastAddedServo != null)
                {
                    projectoObj.transform.parent = lastAddedServo.GetRotationGameObject().transform;
                }

                projector.Value.AttachGameObject(projectoObj);

                // Model
                GameObject model = (ProjectorModel == null) ?
                                   GameObject.CreatePrimitive(PrimitiveType.Sphere) :
                                   GameObject.Instantiate(ProjectorModel);
                projector.Value.SetModel(model);
            }
        }