Esempio n. 1
0
    public void SendRadarData()
    {
        if (Bridge == null || Bridge.Status != Comm.BridgeStatus.Connected)
        {
            return;
        }

        var radarPos   = transform.position;
        var radarAim   = transform.forward;
        var radarRight = transform.right;

        radarObjList.Clear();

        utilColList.Clear();
        utilColList.AddRange(radarDetectedColliders.Keys);
        utilColList.RemoveAll(c => c == null);

        //Debug.Log("radarDetectedColliders.Count: " + radarDetectedColliders.Count);

        System.Func <Collider, int> GetDynPropInt = ((col) => {
            var trafAiMtr = col.GetComponentInParent <TrafAIMotor>();
            if (trafAiMtr != null)
            {
                return(trafAiMtr.currentSpeed > 1.0f ? 0 : 1);
            }
            return(1);
        });

        System.Func <Collider, Vector3> GetLinVel = ((col) => {
            var trafAiMtr = col.GetComponentInParent <TrafAIMotor>();
            if (trafAiMtr != null)
            {
                return(trafAiMtr.currentVelocity);
            }
            else
            {
                return(col.attachedRigidbody == null ? Vector3.zero : col.attachedRigidbody.velocity);
            }
        });

        if (TargetEnvironment == ROSTargetEnvironment.APOLLO35)
        {
            var apolloHeader = new Apollo.Common.Header()
            {
                TimestampSec = (System.DateTime.UtcNow - originTime).TotalSeconds,
                ModuleName   = "conti_radar",
                SequenceNum  = seqId
            };

            var msg = new Apollo.Drivers.ContiRadar()
            {
                Header           = apolloHeader,
                ObjectListStatus = new Apollo.Drivers.ObjectListStatus_60A
                {
                    NofObjects       = utilColList.Count,
                    MeasCounter      = 22800,
                    InterfaceVersion = 0
                }
            };

            for (int i = 0; i < utilColList.Count; i++)
            {
                Collider col    = utilColList[i];
                Vector3  point  = radarDetectedColliders[col].point;
                Vector3  relPos = point - radarPos;
                Vector3  carVel = gameObject.GetComponentInParent <Rigidbody>().velocity;
                Vector3  relVel = carVel - GetLinVel(col);

                //Debug.Log("id to be assigned to obstacle_id is " + radarDetectedColliders[col].id);
                Vector3 size = col.bounds.size;

                // angle is orientation of the obstacle in degrees as seen by radar, counterclockwise is positive
                double angle = -Vector3.SignedAngle(transform.forward, col.transform.forward, transform.up);
                if (angle > 90)
                {
                    angle -= 180;
                }
                else if (angle < -90)
                {
                    angle += 180;
                }

                msg.Contiobs.Add(new Apollo.Drivers.ContiRadarObs()
                {
                    Header            = apolloHeader,
                    Clusterortrack    = false,
                    ObstacleId        = radarDetectedColliders[col].id,
                    LongitudeDist     = Vector3.Project(relPos, radarAim).magnitude,
                    LateralDist       = Vector3.Project(relPos, radarRight).magnitude *(Vector3.Dot(relPos, radarRight) > 0 ? -1 : 1),
                    LongitudeVel      = Vector3.Project(relVel, radarAim).magnitude *(Vector3.Dot(relVel, radarAim) > 0 ? -1 : 1),
                    LateralVel        = Vector3.Project(relVel, radarRight).magnitude *(Vector3.Dot(relVel, radarRight) > 0 ? -1 : 1),
                    Rcs               = 11.0,               //
                    Dynprop           = GetDynPropInt(col), // seem to seqIdbe constant
                    LongitudeDistRms  = 0,
                    LateralDistRms    = 0,
                    LongitudeVelRms   = 0,
                    LateralVelRms     = 0,
                    Probexist         = 1.0,                                              //prob confidence
                    MeasState         = radarDetectedColliders[col].newDetection ? 1 : 2, //1 new 2 exist
                    LongitudeAccel    = 0,
                    LateralAccel      = 0,
                    OritationAngle    = angle,
                    LongitudeAccelRms = 0,
                    LateralAccelRms   = 0,
                    OritationAngleRms = 0,
                    Length            = size.z,
                    Width             = size.x,
                    ObstacleClass     = size.z > 5 ? 2 : 1, // 0: point; 1: car; 2: truck; 3: pedestrian; 4: motorcycle; 5: bicycle; 6: wide; 7: unknown
                });
            }

            Apollo35WriterContiRadar.Publish(msg);
        }

        else
        {
            var apolloHeader = new Ros.ApolloHeader()
            {
                timestamp_sec = (System.DateTime.UtcNow - originTime).TotalSeconds,
                module_name   = "conti_radar",
                sequence_num  = seqId
            };

            for (int i = 0; i < utilColList.Count; i++)
            {
                Collider col    = utilColList[i];
                Vector3  point  = radarDetectedColliders[col].point;
                Vector3  relPos = point - radarPos;
                Vector3  carVel = gameObject.GetComponentInParent <Rigidbody>().velocity;
                Vector3  relVel = carVel - GetLinVel(col);

                //Debug.Log("id to be assigned to obstacle_id is " + radarDetectedColliders[col].id);
                Vector3 size = col.bounds.size;

                // angle is orientation of the obstacle in degrees as seen by radar, counterclockwise is positive
                double angle = -Vector3.SignedAngle(transform.forward, col.transform.forward, transform.up);
                if (angle > 90)
                {
                    angle -= 180;
                }
                else if (angle < -90)
                {
                    angle += 180;
                }

                radarObjList.Add(new Ros.Apollo.Drivers.ContiRadarObs()
                {
                    header              = apolloHeader,
                    clusterortrack      = false,
                    obstacle_id         = radarDetectedColliders[col].id,
                    longitude_dist      = Vector3.Project(relPos, radarAim).magnitude,
                    lateral_dist        = Vector3.Project(relPos, radarRight).magnitude *(Vector3.Dot(relPos, radarRight) > 0 ? -1 : 1),
                    longitude_vel       = Vector3.Project(relVel, radarAim).magnitude *(Vector3.Dot(relVel, radarAim) > 0 ? -1 : 1),
                    lateral_vel         = Vector3.Project(relVel, radarRight).magnitude *(Vector3.Dot(relVel, radarRight) > 0 ? -1 : 1),
                    rcs                 = 11.0,               //
                    dynprop             = GetDynPropInt(col), // seem to seqIdbe constant
                    longitude_dist_rms  = 0,
                    lateral_dist_rms    = 0,
                    longitude_vel_rms   = 0,
                    lateral_vel_rms     = 0,
                    probexist           = 1.0,                                              //prob confidence
                    meas_state          = radarDetectedColliders[col].newDetection ? 1 : 2, //1 new 2 exist
                    longitude_accel     = 0,
                    lateral_accel       = 0,
                    oritation_angle     = angle,
                    longitude_accel_rms = 0,
                    lateral_accel_rms   = 0,
                    oritation_angle_rms = 0,
                    length              = size.z,
                    width               = size.x,
                    obstacle_class      = size.z > 5 ? 2 : 1, // 0: point; 1: car; 2: truck; 3: pedestrian; 4: motorcycle; 5: bicycle; 6: wide; 7: unknown
                });
            }

            var msg = new Ros.Apollo.Drivers.ContiRadar
            {
                header             = apolloHeader,
                contiobs           = radarObjList,
                object_list_status = new Ros.Apollo.Drivers.ObjectListStatus_60A
                {
                    nof_objects       = utilColList.Count,
                    meas_counter      = 22800,
                    interface_version = 0
                }
            };

            ApolloWriterContiRadar.Publish(msg);
        }

        ++seqId;
    }