Example #1
0
        private bool amIStuck(out string escapeRecommendation)
        {
            double commandedVelocity = behaviorData.driveInputs.velocity;    // behaviorData.driveInputs guaranteed not null
            double commandedOmega    = behaviorData.driveInputs.omega;

            escapeRecommendation = commandedVelocity > 0.0d ? "Escape" : "EscapeForward";

            ISensorsData sensorsData = behaviorData.sensorsData;

            if (Math.Abs(commandedVelocity) < 0.001 && Math.Abs(commandedOmega) < 0.001)
            {
                // no movement expected, keep resetting the measurement start:
                last           = DateTime.Now;
                LeftTicksLast  = sensorsData.WheelEncoderLeftTicks;
                RightTicksLast = sensorsData.WheelEncoderRightTicks;

                return(false);
            }

            bool ret = false;

            if ((DateTime.Now - last).TotalSeconds >= stuckIntervalSeconds)
            {
                if (sensorsData.WheelEncoderLeftTicks == LeftTicksLast && sensorsData.WheelEncoderRightTicks == RightTicksLast)
                {
                    ret = true;
                }

                last           = DateTime.Now;
                LeftTicksLast  = sensorsData.WheelEncoderLeftTicks;
                RightTicksLast = sensorsData.WheelEncoderRightTicks;
            }

            return(ret);
        }
Example #2
0
        /// <summary>
        /// makes a copy of the source, and fills the instance timestamp with current time.
        /// preserves individual timestamps.
        /// </summary>
        /// <param name="src"></param>
        public SensorsData(ISensorsData src)
            : this()
        {
            this.RangerSensors = src.RangerSensors;

            this.IrLeftMeters          = src.IrLeftMeters;
            this.IrLeftMetersTimestamp = src.IrLeftMetersTimestamp;

            this.IrRightMeters          = src.IrRightMeters;
            this.IrRightMetersTimestamp = src.IrRightMetersTimestamp;

            this.IrFrontMeters          = src.IrFrontMeters;
            this.IrFrontMetersTimestamp = src.IrFrontMetersTimestamp;

            this.IrRearMeters          = src.IrRearMeters;
            this.IrRearMetersTimestamp = src.IrRearMetersTimestamp;

            this.RangerFrontLeftMeters          = src.RangerFrontLeftMeters;
            this.RangerFrontLeftMetersTimestamp = src.RangerFrontLeftMetersTimestamp;

            this.RangerFrontRightMeters          = src.RangerFrontRightMeters;
            this.RangerFrontRightMetersTimestamp = src.RangerFrontRightMetersTimestamp;

            this.RangerRearLeftMeters          = src.RangerRearLeftMeters;
            this.RangerRearLeftMetersTimestamp = src.RangerRearLeftMetersTimestamp;

            this.RangerRearRightMeters          = src.RangerRearRightMeters;
            this.RangerRearRightMetersTimestamp = src.RangerRearRightMetersTimestamp;

            this.WheelEncoderLeftTicks  = src.WheelEncoderLeftTicks;
            this.WheelEncoderRightTicks = src.WheelEncoderRightTicks;

            this.CompassHeadingDegrees = src.CompassHeadingDegrees;

            this.GpsFixType   = src.GpsFixType;
            this.GpsLatitude  = src.GpsLatitude;
            this.GpsLongitude = src.GpsLongitude;
            this.GpsAltitude  = src.GpsAltitude;
            this.GpsNsat      = src.GpsNsat;
            this.GpsHdop      = src.GpsHdop;
            this.FixAgeMs     = src.FixAgeMs;
            this.GpsTimeUTC   = src.GpsTimeUTC;
            this.GpsTimestamp = src.GpsTimestamp;

            this.TargetingCameraBearingDegrees     = src.TargetingCameraBearingDegrees;
            this.TargetingCameraInclinationDegrees = src.TargetingCameraInclinationDegrees;
            this.TargetingCameraTimestamp          = src.TargetingCameraTimestamp;

            this._BatteryVoltage         = src.BatteryVoltage;
            this.BatteryVoltageTimestamp = src.BatteryVoltageTimestamp;

            //this.timestamp = src.timestamp;
        }
Example #3
0
 public SensorsDataPlucky(ISensorsData src)
     : base(src)
 {
 }
Example #4
0
        /// <summary>
        /// makes a copy of the source, and fills the instance timestamp with current time.
        /// preserves individual timestamps.
        /// </summary>
        /// <param name="src"></param>
        public SensorsData(ISensorsData src)
            : this()
        {
            this.RangerSensors = src.RangerSensors;

            this.IrLeftMeters = src.IrLeftMeters;
            this.IrLeftMetersTimestamp = src.IrLeftMetersTimestamp;

            this.IrRightMeters = src.IrRightMeters;
            this.IrRightMetersTimestamp = src.IrRightMetersTimestamp;

            this.IrFrontMeters = src.IrFrontMeters;
            this.IrFrontMetersTimestamp = src.IrFrontMetersTimestamp;

            this.IrRearMeters = src.IrRearMeters;
            this.IrRearMetersTimestamp = src.IrRearMetersTimestamp;

            this.RangerFrontLeftMeters = src.RangerFrontLeftMeters;
            this.RangerFrontLeftMetersTimestamp = src.RangerFrontLeftMetersTimestamp;

            this.RangerFrontRightMeters = src.RangerFrontRightMeters;
            this.RangerFrontRightMetersTimestamp = src.RangerFrontRightMetersTimestamp;

            this.RangerRearLeftMeters = src.RangerRearLeftMeters;
            this.RangerRearLeftMetersTimestamp = src.RangerRearLeftMetersTimestamp;

            this.RangerRearRightMeters = src.RangerRearRightMeters;
            this.RangerRearRightMetersTimestamp = src.RangerRearRightMetersTimestamp;

            this.WheelEncoderLeftTicks = src.WheelEncoderLeftTicks;
            this.WheelEncoderRightTicks = src.WheelEncoderRightTicks;

            this.CompassHeadingDegrees = src.CompassHeadingDegrees;

            this.GpsFixType = src.GpsFixType;
            this.GpsLatitude = src.GpsLatitude;
            this.GpsLongitude = src.GpsLongitude;
            this.GpsAltitude = src.GpsAltitude;
            this.GpsNsat = src.GpsNsat;
            this.GpsHdop = src.GpsHdop;
            this.FixAgeMs = src.FixAgeMs;
            this.GpsTimeUTC = src.GpsTimeUTC;
            this.GpsTimestamp = src.GpsTimestamp;

            this.TargetingCameraBearingDegrees = src.TargetingCameraBearingDegrees;
            this.TargetingCameraInclinationDegrees = src.TargetingCameraInclinationDegrees;
            this.TargetingCameraTimestamp = src.TargetingCameraTimestamp;

            this._BatteryVoltage = src.BatteryVoltage;
            this.BatteryVoltageTimestamp = src.BatteryVoltageTimestamp;

            //this.timestamp = src.timestamp;
        }
Example #5
0
        /// <summary>
        /// determines if an obstacle is too close and comes up with an escape recommendation
        /// </summary>
        /// <param name="behaviorData"></param>
        /// <param name="escapeRecommendation">output</param>
        /// <returns></returns>
        protected override bool TooClose(IBehaviorData behaviorData)
        {
            escapeRecommendation = string.Empty;

            ISensorsData sensorsData = behaviorData.sensorsData;
            double       velocity    = behaviorData.driveInputs.velocity;                                                        // behaviorData.driveInputs guaranteed not null

            double adjustedTresholdStopMeters = Math.Max(Math.Min(Math.Abs(tresholdStopMeters * velocity / 0.2d), 0.4d), 0.15d); // limit 0.15 ... 0.4 meters depending on velocity

            if (velocity > 0.0d && (sensorsData.IrFrontMeters <= tresholdIrStopMeters || sensorsData.RangerFrontLeftMeters <= adjustedTresholdStopMeters || sensorsData.RangerFrontRightMeters <= adjustedTresholdStopMeters))
            {
                bool leftSideFree  = sensorsData.RangerFrontLeftMeters > adjustedTresholdStopMeters && sensorsData.IrLeftMeters > adjustedTresholdStopMeters;     // IR left and right - 10..80 cm
                bool rightSideFree = sensorsData.RangerFrontRightMeters > adjustedTresholdStopMeters && sensorsData.IrRightMeters > adjustedTresholdStopMeters;

                if (!leftSideFree)
                {
                    escapeRecommendation = "EscapeRight";
                }
                else if (!rightSideFree)
                {
                    escapeRecommendation = "EscapeLeft";
                }
                else
                {
                    escapeRecommendation = "Escape";    // advise random turn
                }

                return(true);    // activate stop, with escape recommendation
            }

            if (velocity < 0.0d && (sensorsData.IrRearMeters < adjustedTresholdStopMeters))
            {
                escapeRecommendation = "EscapeForward";
                return(true);    // activate stop, with escape recommendation
            }

            //if (velocity == 0.0d && behaviorData.driveInputs.omega == 0.0d)
            //{
            //    bool leftSideFree = sensorsData.IrLeftMeters > adjustedTresholdStopMeters;
            //    bool rightSideFree = sensorsData.IrRightMeters > adjustedTresholdStopMeters;
            //    bool rearFree = sensorsData.IrRearMeters > adjustedTresholdStopMeters;

            //    if (leftSideFree)
            //    {
            //        escapeRecommendation = "EscapeLeftTurn";
            //    }
            //    else if (rightSideFree)
            //    {
            //        escapeRecommendation = "EscapeRightTurn";
            //    }
            //    else if (rearFree)
            //    {
            //        escapeRecommendation = "EscapeFullTurn";
            //    }
            //    else
            //    {
            //        escapeRecommendation = "EscapeNone";
            //    }

            //    return true;    // activate stop, with escape recommendation
            //}

            return(false);    // deactivate, no stopping and no escape recommendation
        }
        public void DisplayRobotSensors(ISensorsData sensorsData)
        {
            //Debug.WriteLine("RobotDashboard: DisplayRobotSensors()   sensors: " + sensorsData.ToString());

            sensorsDashboard1.SensorsDataBlock.Post(sensorsData);

            /*
            RobotPoseBase robotPose = new RobotPoseBase() { X = xLast, Y = yLast, Theta = thetaLast };
            PoseBase obstaclePoseRel = new PoseBase() { X = 0.0d, Y = 0.0d, Theta = 0.0d };    // relative to sensor

            double distanceMeters = sensorsData.IrLeftMeters;    // range 10...80 cm
            IRangerSensor sensor = sensorsData.RangerSensors["IrLeft"];

            if (sensor.InRange(distanceMeters))
            {
                obstaclePoseRel.X = distanceMeters;
                //PoseBase sensorPose = robotPose * irLeftSensor.Pose;        // sensor Pose absolute
                //PoseBase obstaclePose = sensorPose * obstaclePoseRel;       // obstacle Pose absolute

                PoseBase obstaclePose = robotPose * sensor.Pose * obstaclePoseRel;       // obstacle Pose absolute

                mainWindow1.AddMapable(new ObstacleData(obstaclePose.X, obstaclePose.Y, Colors.Magenta));
            }

            distanceMeters = sensorsData.IrRightMeters;   // range 10...80 cm
            sensor = sensorsData.RangerSensors["IrRight"];
            if (sensor.InRange(distanceMeters))
            {
                obstaclePoseRel.X = distanceMeters;
                PoseBase obstaclePose = robotPose * sensor.Pose * obstaclePoseRel;       // obstacle Pose absolute

                mainWindow1.AddMapable(new ObstacleData(obstaclePose.X, obstaclePose.Y, Colors.Green));
            }

            distanceMeters = sensorsData.IrFrontMeters;   // range 10...80 cm
            sensor = sensorsData.RangerSensors["IrFront"];
            if (sensor.InRange(distanceMeters))
            {
                obstaclePoseRel.X = distanceMeters;
                PoseBase obstaclePose = robotPose * sensor.Pose * obstaclePoseRel;       // obstacle Pose absolute

                mainWindow1.AddMapable(new ObstacleData(obstaclePose.X, obstaclePose.Y, Colors.Blue));
            }

            distanceMeters = sensorsData.IrRearMeters;   // range 10...80 cm
            sensor = sensorsData.RangerSensors["IrRear"];
            if (sensor.InRange(distanceMeters))
            {
                obstaclePoseRel.X = distanceMeters;
                PoseBase obstaclePose = robotPose * sensor.Pose * obstaclePoseRel;       // obstacle Pose absolute

                mainWindow1.AddMapable(new ObstacleData(obstaclePose.X, obstaclePose.Y, Colors.Blue));
            }

            distanceMeters = sensorsData.SonarLeftMeters;   // range 3...250 cm
            sensor = sensorsData.RangerSensors["SonarLeft"];
            if (sensor.InRange(distanceMeters))
            {
                obstaclePoseRel.X = distanceMeters;
                PoseBase obstaclePose = robotPose * sensor.Pose * obstaclePoseRel;       // obstacle Pose absolute

                mainWindow1.AddMapable(new ObstacleData(obstaclePose.X, obstaclePose.Y, Colors.Purple));
            }

            distanceMeters = sensorsData.SonarRightMeters;   // range 3...250 cm
            sensor = sensorsData.RangerSensors["SonarRight"];
            if (sensor.InRange(distanceMeters))
            {
                obstaclePoseRel.X = distanceMeters;
                PoseBase obstaclePose = robotPose * sensor.Pose * obstaclePoseRel;       // obstacle Pose absolute

                mainWindow1.AddMapable(new ObstacleData(obstaclePose.X, obstaclePose.Y, Colors.Purple));
            }
            */
        }
Example #7
0
 public SensorsDataShorty(ISensorsData src)
     : base(src)
 {
 }
Example #8
0
 public void DisplayRobotSensors(ISensorsData sensorsData)
 {
     Debug.WriteLine("HttpServer: DisplayRobotSensors()   sensors: " + sensorsData.ToString());
 }
Example #9
0
 public void DisplayRobotSensors(ISensorsData sensorsData)
 {
     Debug.WriteLine("HttpServer: DisplayRobotSensors()   sensors: " + sensorsData.ToString());
 }
        private bool computeAvoidanceOmega(ref double velocity, ref double avoidanceOmega)
        {
            bool avoid = false;

            ISensorsData sensorsData = behaviorData.sensorsData;

            double adjustedAvoidanceTresholdMeters = Math.Max(Math.Min(Math.Abs(avoidanceTresholdMeters * velocity / 0.2d), 0.6d), 0.20d); // limit 0.2 ... 0.6 meters depending on velocity

            bool fronIrClose     = sensorsData.IrFrontMeters <= tresholdIrAvoidanceMeters;
            bool leftSonarClose  = sensorsData.RangerFrontLeftMeters <= adjustedAvoidanceTresholdMeters;
            bool rightSonarClose = sensorsData.RangerFrontRightMeters <= adjustedAvoidanceTresholdMeters;
            bool leftIrClose     = sensorsData.IrLeftMeters <= adjustedAvoidanceTresholdMeters;
            bool rightIrClose    = sensorsData.IrRightMeters <= adjustedAvoidanceTresholdMeters;

            if (velocity > 0.0d &&
                (fronIrClose || leftSonarClose || rightSonarClose || leftIrClose || rightIrClose))
            {
                bool leftSideFree  = !leftSonarClose && !leftIrClose;
                bool rightSideFree = !rightSonarClose && !rightIrClose;

                if (!leftSideFree && !rightSideFree)
                {
                    avoidanceOmega = avoidanceFactorOmega * Math.Sign(sensorsData.RangerFrontLeftMeters - sensorsData.RangerFrontRightMeters);
                    velocity      *= avoidanceFactorVelocity;
                    avoid          = true;
                }
                else if (!leftSideFree)
                {
                    avoidanceOmega = -avoidanceFactorOmega;  // weer to the right
                    velocity      *= avoidanceFactorVelocity;
                    avoid          = true;
                }
                else if (!rightSideFree)
                {
                    avoidanceOmega = avoidanceFactorOmega;  // weer to the left
                    velocity      *= avoidanceFactorVelocity;
                    avoid          = true;
                }
                else if (fronIrClose)
                {
                    avoidanceOmega = avoidanceFactorOmega * Math.Sign(sensorsData.RangerFrontLeftMeters - sensorsData.RangerFrontRightMeters);
                    velocity      *= -avoidanceFactorVelocity;
                    avoid          = true;
                }
            }

            if (!avoid)
            {
                if (lostObstacleLast == DateTime.MinValue)
                {
                    lostObstacleLast = DateTime.Now;
                }

                double since = (DateTime.Now - lostObstacleLast).TotalSeconds;
                double adjustmentInterval = 0.5d;

                if (since < adjustmentInterval)
                {
                    // keep avoiding for short time after losing the obstacle:
                    double factor = (adjustmentInterval - since) / adjustmentInterval;                               // 1..0 during the adjustment interval
                    avoidanceOmega = lastAvoidanceOmega * factor;
                    velocity      *= (avoidanceFactorVelocity + (1.0d - avoidanceFactorVelocity) * (1.0d - factor)); // avoidanceFactorVelocity..1 during the adjustment interval
                    avoid          = true;
                }
            }
            else
            {
                lastAvoidanceOmega = avoidanceOmega;
                lostObstacleLast   = DateTime.MinValue;
            }

            return(avoid);
        }
Example #11
0
        public void DisplayRobotSensors(ISensorsData sensorsData)
        {
            //Debug.WriteLine("RobotDashboard: DisplayRobotSensors()   sensors: " + sensorsData.ToString());

            sensorsDashboard1.SensorsDataBlock.Post(sensorsData);

            /*
             * RobotPoseBase robotPose = new RobotPoseBase() { X = xLast, Y = yLast, Theta = thetaLast };
             * PoseBase obstaclePoseRel = new PoseBase() { X = 0.0d, Y = 0.0d, Theta = 0.0d };    // relative to sensor
             *
             * double distanceMeters = sensorsData.IrLeftMeters;    // range 10...80 cm
             * IRangerSensor sensor = sensorsData.RangerSensors["IrLeft"];
             *
             * if (sensor.InRange(distanceMeters))
             * {
             *  obstaclePoseRel.X = distanceMeters;
             *  //PoseBase sensorPose = robotPose * irLeftSensor.Pose;        // sensor Pose absolute
             *  //PoseBase obstaclePose = sensorPose * obstaclePoseRel;       // obstacle Pose absolute
             *
             *  PoseBase obstaclePose = robotPose * sensor.Pose * obstaclePoseRel;       // obstacle Pose absolute
             *
             *  mainWindow1.AddMapable(new ObstacleData(obstaclePose.X, obstaclePose.Y, Colors.Magenta));
             * }
             *
             * distanceMeters = sensorsData.IrRightMeters;   // range 10...80 cm
             * sensor = sensorsData.RangerSensors["IrRight"];
             * if (sensor.InRange(distanceMeters))
             * {
             *  obstaclePoseRel.X = distanceMeters;
             *  PoseBase obstaclePose = robotPose * sensor.Pose * obstaclePoseRel;       // obstacle Pose absolute
             *
             *  mainWindow1.AddMapable(new ObstacleData(obstaclePose.X, obstaclePose.Y, Colors.Green));
             * }
             *
             * distanceMeters = sensorsData.IrFrontMeters;   // range 10...80 cm
             * sensor = sensorsData.RangerSensors["IrFront"];
             * if (sensor.InRange(distanceMeters))
             * {
             *  obstaclePoseRel.X = distanceMeters;
             *  PoseBase obstaclePose = robotPose * sensor.Pose * obstaclePoseRel;       // obstacle Pose absolute
             *
             *  mainWindow1.AddMapable(new ObstacleData(obstaclePose.X, obstaclePose.Y, Colors.Blue));
             * }
             *
             * distanceMeters = sensorsData.IrRearMeters;   // range 10...80 cm
             * sensor = sensorsData.RangerSensors["IrRear"];
             * if (sensor.InRange(distanceMeters))
             * {
             *  obstaclePoseRel.X = distanceMeters;
             *  PoseBase obstaclePose = robotPose * sensor.Pose * obstaclePoseRel;       // obstacle Pose absolute
             *
             *  mainWindow1.AddMapable(new ObstacleData(obstaclePose.X, obstaclePose.Y, Colors.Blue));
             * }
             *
             * distanceMeters = sensorsData.SonarLeftMeters;   // range 3...250 cm
             * sensor = sensorsData.RangerSensors["SonarLeft"];
             * if (sensor.InRange(distanceMeters))
             * {
             *  obstaclePoseRel.X = distanceMeters;
             *  PoseBase obstaclePose = robotPose * sensor.Pose * obstaclePoseRel;       // obstacle Pose absolute
             *
             *  mainWindow1.AddMapable(new ObstacleData(obstaclePose.X, obstaclePose.Y, Colors.Purple));
             * }
             *
             * distanceMeters = sensorsData.SonarRightMeters;   // range 3...250 cm
             * sensor = sensorsData.RangerSensors["SonarRight"];
             * if (sensor.InRange(distanceMeters))
             * {
             *  obstaclePoseRel.X = distanceMeters;
             *  PoseBase obstaclePose = robotPose * sensor.Pose * obstaclePoseRel;       // obstacle Pose absolute
             *
             *  mainWindow1.AddMapable(new ObstacleData(obstaclePose.X, obstaclePose.Y, Colors.Purple));
             * }
             */
        }