示例#1
0
        private void executeAddServo(object o)
        {
            PololuMaestroServo servo = new PololuMaestroServo();

            servo.setOwner(this);
            ServoList.Add(servo);
        }
        ////////////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////////////
        ///
        /// 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);
            }
        }