コード例 #1
0
        void ProximityMeasurementHandler(ProximityData measurement)
        {
            //Tracer.Trace("TrackRoamerBrickProximityBoardService::ProximityMeasurementHandler()");

            try
            {
                _state.LastSampleTimestamp = new DateTime(measurement.TimeStamp);
                _state.MostRecentProximity = new ProximityDataDssSerializable(measurement);
                _state.LinkState           = "receiving Proximity Data";

                //
                // Inform subscribed services that the state has changed.
                //
                _submgrPort.Post(new submgr.Submit(_state, DsspActions.ReplaceRequest));

                UpdateProximityData usd = new UpdateProximityData();
                usd.Body = _state.MostRecentProximity;

                base.SendNotification <UpdateProximityData>(_submgrPort, usd);
            }
            catch (Exception e)
            {
                _state.LinkState = "Error while receiving Proximity Data";
                LogError(e);
            }
        }
コード例 #2
0
 /// <summary>
 /// Scan for obstructions in a cone
 /// </summary>
 private IEnumerator Scan()
 {
     while (scanning)
     {
         float proximity = maxRange;
         // roll
         for (float r = 0; r <= 180f; r += 10f)
         {
             // yaw
             for (float y = -Fov; y < Fov; y += 6f)
             {
                 Quaternion rotation;
                 Vector3    direction;
                 rotation  = Quaternion.AngleAxis(y, transform.up);
                 direction = rotation * transform.forward;
                 rotation  = Quaternion.AngleAxis(r, transform.forward);
                 direction = rotation * direction;
                 float cast = Cast(direction);
                 // if this cast is shorter than returnData
                 if (cast < proximity)
                 {
                     proximity = cast;
                 }
             }
         }
         _data = new ProximityData(transform.forward * proximity, proximity < maxRange);
         _callback(_data);
         yield return(new WaitForSeconds(updateDt));
     }
 }
コード例 #3
0
        public virtual void OnCurrentValueChanged(DependencyPropertyChangedEventArgs e)
        {
            ProximityData newValue = (ProximityData)e.NewValue;

            beamsSt[0].ScaleX = mToScale(newValue.mffr);
            beamsSt[1].ScaleX = mToScale(newValue.mfr);
            beamsSt[2].ScaleX = mToScale(newValue.mbr);
            beamsSt[3].ScaleX = mToScale(newValue.mbbr);
            beamsSt[4].ScaleX = mToScale(newValue.mbbl);
            beamsSt[5].ScaleX = mToScale(newValue.mbl);
            beamsSt[6].ScaleX = mToScale(newValue.mfl);
            beamsSt[7].ScaleX = mToScale(newValue.mffl);
        }
コード例 #4
0
        public ProximityDataDssSerializable(ProximityData proximityData)
        {
            TimeStamp = new DateTime(proximityData.TimeStamp);

            // clockwise starting from rear right side:
            mbr  = arrangeProximityReading(proximityData.mbr, 0);
            mbbr = arrangeProximityReading(proximityData.mbbr, 1);
            mbbl = arrangeProximityReading(proximityData.mbbl, 2);
            mbl  = arrangeProximityReading(proximityData.mbl, 3);

            mfl  = arrangeProximityReading(proximityData.mfl, 4);
            mffl = arrangeProximityReading(proximityData.mffl, 5);
            mffr = arrangeProximityReading(proximityData.mffr, 6);
            mfr  = arrangeProximityReading(proximityData.mfr, 7);
        }
コード例 #5
0
    private unsafe void PacketReceived(Packet.Header *header)
    {
        switch (header->Type)
        {
        case (byte)CustomPackets.Type.OrientationData:
        {
            Orientation = *((CustomPackets.OrientationDataPacket *)header);

            DebugTools.Print($"DATA: {Orientation}");
            break;
        }

        case (byte)CustomPackets.Type.ProximityData:
        {
            ProximityData data = *((CustomPackets.ProximityDataPacket *)header);
            DebugTools.Print($"DATA: {data}");

            if (data.ID < 0 || data.ID >= ProximityContent.Length)
            {
                DebugTools.Print($"Invalid sensor index ID: {data.ID}");
                return;
            }

            int count = ProximityContent[data.ID].Count;
            int cap   = m_ContentCapacity - 1;
            for (; count-- > cap;)
            {
                ProximityContent[data.ID].RemoveAt(0);
            }

            ProximityContent[data.ID].Add(data);

            break;
        }

        default:
        {
            DebugTools.Print($"Unknown packet type: {header->Type}");
            break;
        }
        }
    }
コード例 #6
0
ファイル: Robot.cs プロジェクト: jeremyfix/botnavsim
 /// <summary>
 /// Sensor data callback passes proximity data to INavigation
 /// </summary>
 /// <param name="data">Data.</param>
 public void ReceiveSensorData(ProximityData data)
 {
     if (_navigation == null)
     {
         return;
     }
     // data is recieved here by any enabled sensor in world space
     // transformed into robot local space if necessary
     // and transmitted to INavigation
     if (_navigation.spaceRelativeTo == Space.Self)
     {
         _navigation.Proximity(
             Vector3.zero,
             transform.InverseTransformDirection(data.direction),
             data.obstructed);
     }
     else
     {
         _navigation.Proximity(
             transform.position,
             transform.position + data.direction,
             data.obstructed);
     }
 }
コード例 #7
0
        private void pmFrameCompleteHandler_UI(object sender, AsyncInputFrameArgs aira)
        {
            long timestamp = aira.timestamp;

            // have raw data displayed in a text box:

            StringBuilder frameValue = new StringBuilder();

            frameValue.AppendFormat("{0}   POT: {1}\r\n", aira.dPos1Mks, aira.sensorsState.potValue);
            frameValue.AppendFormat("{0}\r\n", aira.dPos2Mks);
            frameValue.AppendFormat("{0}  ", aira.dPing1DistanceM * 1000.0d);   // print distance in milimeters
            frameValue.AppendFormat("{0}\r\n", aira.fromPingScanStop);
            frameValue.AppendFormat("{0}\r\n", aira.dPing2DistanceM * 1000.0d);

            // expect 7 on "not in sight", 3 on "far", 1 on "medium" and 0 on "close":
            frameValue.AppendFormat("{0} ", aira.sensorsState.irbE1);
            frameValue.AppendFormat("{0} ", aira.sensorsState.irbE2);
            frameValue.AppendFormat("{0} ", aira.sensorsState.irbE3);
            frameValue.AppendFormat("{0} ", aira.sensorsState.irbE4);

            frameValue.AppendFormat("{0} ", aira.sensorsState.irbO1);
            frameValue.AppendFormat("{0} ", aira.sensorsState.irbO2);
            frameValue.AppendFormat("{0} ", aira.sensorsState.irbO3);
            frameValue.AppendFormat("{0}\r\n", aira.sensorsState.irbO4);

            frameValue.AppendFormat("{0} : {1:0.0} * {2:0.0} * {3:0.0} * {4:0.0} \r\n", aira.sensorsState.parkingSensorsCount,
                                    aira.sensorsState.parkingSensorMetersLB, aira.sensorsState.parkingSensorMetersLF, aira.sensorsState.parkingSensorMetersRF, aira.sensorsState.parkingSensorMetersRB);

            /*
             * Tracer.Trace(string.Format("=== xpsi: {0} : {1} {2} {3} {4} : {5} {6} {7} {8}", aira.sensorsState.parkingSensorsCount,
             *  aira.sensorsState.parkingSensors[0], aira.sensorsState.parkingSensors[1], aira.sensorsState.parkingSensors[2], aira.sensorsState.parkingSensors[3],
             *  aira.sensorsState.parkingSensors[4], aira.sensorsState.parkingSensors[5], aira.sensorsState.parkingSensors[6], aira.sensorsState.parkingSensors[7]));
             *
             * Tracer.Trace(string.Format("=== bpsi: {0} : {1} {2} {3} {4} : {5} {6} {7} {8}", aira.sensorsState.parkingSensorsCount,
             *  Convert.ToString(aira.sensorsState.parkingSensors[0],2), Convert.ToString(aira.sensorsState.parkingSensors[1],2), Convert.ToString(aira.sensorsState.parkingSensors[2],2), Convert.ToString(aira.sensorsState.parkingSensors[3],2),
             *  Convert.ToString(aira.sensorsState.parkingSensors[4],2), Convert.ToString(aira.sensorsState.parkingSensors[5],2), Convert.ToString(aira.sensorsState.parkingSensors[6],2), Convert.ToString(aira.sensorsState.parkingSensors[7],2)));
             */

            //frameValue.AppendFormat("{0} {1} {2} {3}\r\n", aira.sensorsState.parkingSensors[4], aira.sensorsState.parkingSensors[5], aira.sensorsState.parkingSensors[6], aira.sensorsState.parkingSensors[7]);

            pmValuesLabel.Content = frameValue.ToString();

            // Proximity sensors display their data in dedicated control:

            lastProxData = new ProximityData()
            {
                TimeStamp = timestamp
            };

            lastProxData.setProximityData(aira.sensorsState.irbE1, aira.sensorsState.irbE2, aira.sensorsState.irbE3, aira.sensorsState.irbE4,
                                          aira.sensorsState.irbO1, aira.sensorsState.irbO2, aira.sensorsState.irbO3, aira.sensorsState.irbO4);

            lastProxDataChanged = true;

            // accelerometer has its own control for displaying data:

            lastAccData = new AccelerometerDataWpf()
            {
                TimeStamp = timestamp
            };

            lastAccData.setAccelerometerData(aira.sensorsState.accelX, aira.sensorsState.accelY, aira.sensorsState.accelZ);

            lastAccDataChanged = true;

            // compass has its own control for displaying data:

            if (aira.sensorsState.compassHeading >= 0.0d && aira.sensorsState.compassHeading <= 359.999999d && (lastDirData == null || Math.Abs(lastDirData.heading - aira.sensorsState.compassHeading) > 2.0d))
            {
                lastDirData = new DirectionData()
                {
                    heading = aira.sensorsState.compassHeading, TimeStamp = timestamp
                };

                lastDirDataChanged = true;
            }
            else if ((bool)compassCheckBox.IsChecked && (lastCompassSlider != compassSlider.Value || timestamp > lastCompassSliderTimestamp + 20000000L))
            {
                // simulated direction, controlled by a slider:

                lastCompassSliderTimestamp = timestamp;
                lastCompassSlider          = compassSlider.Value;

                double hdg = compassSlider.Value;   // -180 ... 180
                if (hdg < 0)
                {
                    hdg += 360.0d;      // 0...360
                }

                lastDirData = new DirectionData()
                {
                    heading = hdg, TimeStamp = timestamp
                };

                lastDirDataChanged = true;
            }

            if (aira.sensorsState.parkingSensorsValid)
            {
                lastPsiData = new ParkingSensorData()
                {
                    parkingSensorMetersLB = aira.sensorsState.parkingSensorMetersLB,
                    parkingSensorMetersLF = aira.sensorsState.parkingSensorMetersLF,
                    parkingSensorMetersRB = aira.sensorsState.parkingSensorMetersRB,
                    parkingSensorMetersRF = aira.sensorsState.parkingSensorMetersRF,
                    TimeStamp             = timestamp
                };

                lastPsiDataChanged = true;
            }

            // frames that are marked "" feed the sonar sweep view controls. They are updated in real time:

            if (aira.fromPingScanStop)
            {
                int    angleRaw1 = (int)aira.dPos1Mks;
                double distM1    = aira.dPing1DistanceM;

                int    angleRaw2 = (int)aira.dPos2Mks;
                double distM2    = aira.dPing2DistanceM;


                if (inTestSamples > 0)
                {
                    // prerun - for a while just try figuring out what comes in - sweep angle ranges for both sides

                    inTestSamples--;

                    if (inTestSamples < TEST_SAMPLES_COUNT - 10)        // first few frames are garbled
                    {
                        board.registerAnglesRaw(angleRaw1, angleRaw2);

                        if (inTestSamples == 0)     // last count
                        {
                            board.finishPrerun();

                            Tracer.Trace(board.ToString());
                        }
                    }
                }
                else
                {
                    // real sonar data is coming, and we finished prerun and know how many beams per sweep we are dealing with

                    lastRangeReadingSet = new RangeReadingSet()
                    {
                        left = board.angleRawToSonarAngle(new RangeReading(angleRaw1, distM1, timestamp)), right = board.angleRawToSonarAngle(new RangeReading(angleRaw2, distM2, timestamp))
                    };

                    lastRangeReadingSetChanged = true;

                    lastRangeReadingSet.combo1   = board.angleRawToSonarAngleCombo(1, angleRaw1, distM1, timestamp);
                    lastRangeReadingSet.combo2   = board.angleRawToSonarAngleCombo(2, angleRaw2, distM2, timestamp);
                    lastRangeReadingSet.hasCombo = true;

                    if (angleRaw1 == board.rawAngle1_Min || angleRaw1 == board.rawAngle1_Max)
                    {
                        lastRangeReadingSet.sweepFrameReady = true;
                    }
                }
            }

            // sanity check:
            if (lastRangeReadingSetChanged && lastRangeReadingSet.sweepFrameReady && lastDirData == null)
            {
                // we probably don't have compass connected - have a fake dir data for now.
                lastDirData = new DirectionData()
                {
                    heading = 0.0d, TimeStamp = timestamp
                };
                lastDirDataChanged = true;
            }

            // update all controls with collected data:

            setSonarViewControls(timestamp);

            updateMapperVicinity(timestamp, sweepViewControlCombo.sonarData);

            lastRangeReadingSetChanged = false;

            setViewControls(timestamp);
        }
コード例 #8
0
        // =================================================================================================================

        #region DataReadyPort handlers

        /// <summary>
        /// This handler is activated by empty Recv messages coming to internal DataReadyPort.
        /// The data comes here from pmFrameCompleteHandler
        /// This is our opportunity to purge stale data from the queues.
        /// The data posted to Responses port is then picked up by ProximityBoardCcrServiceCommander:SonarDataHandler() and others,
        /// to be later passed to TrackRoamerBrickProximityBoard.
        /// </summary>
        /// <param name="recv"></param>
        private void DataHandler(Recv recv)
        {
            /*
             * if(_sonarDatas.Count > 1 || _directionDatas.Count > 1 || _accelDatas.Count > 1 || _proxDatas.Count > 1 || _parkingSensorsDatas.Count > 1)
             * {
             *  // for debugging, log if queues get more than 1 piece of each data type:
             *  Tracer.Trace("ProximityBoardManager: DataHandler()  sonars: " + _sonarDatas.Count + "  compass: "******"  accels: " + _accelDatas.Count + "  proxs: " + _proxDatas.Count + "  parking: " + _parkingSensorsDatas.Count);
             * }
             */

            if (_sonarDatas.Count > 0)
            {
                SonarData sonarData = null;

                lock (_sonarDatas)
                {
                    while (_sonarDatas.Count > 0)
                    {
                        sonarData = _sonarDatas.Last();
                        _sonarDatas.Clear();
                    }
                }

                if (sonarData != null)
                {
                    MeasurementsPort.Post(sonarData);
                }
            }

            if (_directionDatas.Count > 0)
            {
                DirectionData directionData = null;

                lock (_directionDatas)
                {
                    while (_directionDatas.Count > 0)
                    {
                        directionData = _directionDatas.Last();
                        _directionDatas.Clear();
                    }
                }

                if (directionData != null)
                {
                    MeasurementsPort.Post(directionData);
                }
            }

            if (_accelDatas.Count > 0)
            {
                AccelerometerData accelerometerData = null;

                lock (_accelDatas)
                {
                    while (_accelDatas.Count > 0)
                    {
                        accelerometerData = _accelDatas.Last();
                        _accelDatas.Clear();
                    }
                }

                if (accelerometerData != null)
                {
                    MeasurementsPort.Post(accelerometerData);
                }
            }

            if (_proxiDatas.Count > 0)
            {
                ProximityData proximityData = null;

                lock (_proxiDatas)
                {
                    while (_proxiDatas.Count > 0)
                    {
                        proximityData = _proxiDatas.Last();
                        _proxiDatas.Clear();
                    }
                }

                if (proximityData != null)
                {
                    MeasurementsPort.Post(proximityData);
                }
            }

            if (_parkingSensorsDatas.Count > 0)
            {
                ParkingSensorData psiData = null;

                lock (_parkingSensorsDatas)
                {
                    while (_parkingSensorsDatas.Count > 0)
                    {
                        psiData = _parkingSensorsDatas.Last();
                        _parkingSensorsDatas.Clear();
                    }
                }

                if (psiData != null)
                {
                    MeasurementsPort.Post(psiData);
                }
            }

            //Tracer.Trace("AnalogData:  current=" + AnalogValue1 + "    prev=" + AnalogValue1Prev);

            // and last but not least - post AnalogData - only if any of the values changed:
            if (AnalogValue1 != AnalogValue1Prev)
            {
                AnalogValue1Prev = AnalogValue1;
                AnalogData analogData = new AnalogData()
                {
                    analogValue1 = AnalogValue1,
                    TimeStamp    = DateTime.Now.Ticks
                };
                MeasurementsPort.Post(analogData);
            }
        }
コード例 #9
0
        // =================================================================================================================

        #region Processing Data Frame from LibPicSensors.ProximityModule - pmFrameCompleteHandler()

        // This will be called whenever the data is read from the board:
        private void pmFrameCompleteHandler(object sender, AsyncInputFrameArgs aira)
        {
            /*
             * Tracer.Trace("Async frame arrived. " + now);
             *
             * StringBuilder frameValue = new StringBuilder();
             *
             * frameValue.AppendFormat("ProximityBoardManager: frame arrived: {0} ", aira.dPos1Mks);
             * frameValue.AppendFormat("{0} ", aira.dPos2Mks);
             * frameValue.AppendFormat("{0} ", aira.dPing1DistanceMm);
             * frameValue.AppendFormat("{0}", aira.dPing2DistanceMm);
             *
             * Tracer.Trace(frameValue.ToString());
             */

            bool haveData = false;

            // IR Proximity sensors data:

            ProximityData proxData = new ProximityData()
            {
                TimeStamp = aira.timestamp
            };

            proxData.setProximityData(aira.sensorsState.irbE1, aira.sensorsState.irbE2, aira.sensorsState.irbE3, aira.sensorsState.irbE4,
                                      aira.sensorsState.irbO1, aira.sensorsState.irbO2, aira.sensorsState.irbO3, aira.sensorsState.irbO4);

            lock (_proxiDatas)
            {
                _proxiDatas.Enqueue(proxData);
            }
            haveData = true;                    // allow DataPort.Post(new Recv()) to happen, with data already enqueued in the ...Datas

            // accelerometer data:

            AccelerometerData accData = new AccelerometerData()
            {
                TimeStamp = aira.timestamp
            };

            accData.setAccelerometerData(aira.sensorsState.accelX, aira.sensorsState.accelY, aira.sensorsState.accelZ);

            lock (_accelDatas)
            {
                _accelDatas.Enqueue(accData);
            }
            haveData = true;                    // allow DataPort.Post(new Recv()) to happen, with data already enqueued in the ...Datas

            // compass data:

            DirectionData dirData = null;

            if (aira.sensorsState.compassHeading >= 0.0d && aira.sensorsState.compassHeading <= 359.999999d)
            {
                dirData = new DirectionData()
                {
                    heading = aira.sensorsState.compassHeading, TimeStamp = aira.timestamp
                };

                lock (_directionDatas)
                {
                    _directionDatas.Enqueue(dirData);
                }
                haveData = true;                    // allow DataPort.Post(new Recv()) to happen, with data already enqueued in the ...Datas
            }

            ParkingSensorData psiData = null;

            if (aira.sensorsState.parkingSensorsValid)
            {
                psiData = new ParkingSensorData()
                {
                    TimeStamp = aira.timestamp
                };

                psiData.setParkingSensorData(aira.sensorsState);

                lock (_parkingSensorsDatas)
                {
                    _parkingSensorsDatas.Enqueue(psiData);
                }
                haveData = true;                    // allow DataPort.Post(new Recv()) to happen, with data already enqueued in the ...Datas
            }

            // frames that are marked "fromPingScanStop" feed the sonar sweep view controls:

            if (aira.fromPingScanStop)
            {
                int    angleRaw1 = (int)aira.dPos1Mks;
                double distM1    = aira.dPing1DistanceM;

                //Tracer.Trace(String.Format("angleRaw1 = {0} us", angleRaw1));
                //Tracer.Trace(String.Format("distMm1 = {0} mm", distMm1));

                int    angleRaw2 = (int)aira.dPos2Mks;
                double distM2    = aira.dPing2DistanceM;

                //Tracer.Trace(String.Format("angleRaw2 = {0} us", angleRaw2));
                //Tracer.Trace(String.Format("distMm2 = {0} mm", distMm2));

                haveData = haveData && setSonarRayReading(angleRaw1, distM1, angleRaw2, distM2, aira.timestamp);
            }

            if (haveData)
            {
                AnalogValue1 = aira.sensorsState.analogValue1;

                // just post internally an empty signal message, the receiver - DataHandler(Recv recv) should examine the ...Datas and forward data to Responses port
                DataReadyPort.Post(new Recv());
            }
        }
コード例 #10
0
        void ProximityDataHandler(ProximityData proximityData)
        {
            //Tracer.Trace("ProximityBoardCcrServiceCommander::ProximityDataHandler()");

            _pbCommanderDataEventsPort.Post(proximityData);
        }