123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- package main
- import (
- "cicv-data-closedloop/pjisuv_msgs"
- "fmt"
- "math"
- "sync"
- )
- type Object struct {
- ID uint32
- StableAge int
- LastExistTime float64
- }
- var objectsStability = make(map[uint32]Object)
- func Topic() string {
- return "/tpperception"
- }
- // 禁止存在下划线_
- func Label() string {
- return "LowSpdTruckAhead"
- }
- // objSpeedCheck 目标物速度检测
- func objSpeedCheck(obj *pjisuv_msgs.PerceptionObject) bool {
- const targetMinSpeed = 2 / 3.6 // m/s
- const targetMaxSpeed = 20 / 3.6 // m/s
- return targetMinSpeed < obj.Speed && obj.Speed < targetMaxSpeed
- }
- // objTypeCheck 目标物类型检测
- // × 金龙车:CAR_TYPE=0, TRUCK_TYPE=1, PEDESTRIAN_TYPE=2, CYCLIST_TYPE=3, UNKNOWN_TYPE=4, UNKNOWN_MOVABLE_TYPE=5, UNKNOWN_UNMOVABLE_TYPE=6
- // √ 多功能车:UNKNOWN TYPE=O, PEDESTRIAN TYPE=1, CAR TYPE=2, TRUCK TYPE=3, Bicycle TYPE=4, Tricycle TYPE=5, Traffic Cone TYPE=6
- func objTypeCheck(obj *pjisuv_msgs.PerceptionObject) bool {
- const targetType uint8 = 3
- return targetType == obj.Type
- }
- // objPosCheck 判断目标物位置关系
- func objPosCheck(obj *pjisuv_msgs.PerceptionObject) bool {
- const laneWidth = 3.5 // m
- return obj.X > 0 && math.Abs(float64(obj.Y)) < laneWidth*1.5
- }
- // isEgoStationary 判断主车是否“静止”(速度低于阈值)
- func isEgoStationary(shareVars *sync.Map) bool {
- const minSpeed = 1 // m/s
- VelocityXOfCicvLocation, _ := shareVars.Load("VelocityXOfCicvLocation") // float64
- VelocityYOfCicvLocation, _ := shareVars.Load("VelocityYOfCicvLocation")
- speed := math.Sqrt(math.Pow(VelocityXOfCicvLocation.(float64), 2) + math.Pow(VelocityYOfCicvLocation.(float64), 2))
- return speed > minSpeed
- }
- // Rule 检测前方大车低速行驶
- func Rule(shareVars *sync.Map, msg *pjisuv_msgs.PerceptionObjects) string {
- defer func() {
- if r := recover(); r != nil {
- fmt.Println(fmt.Sprintf("Recovered from panic: [%s], [%#v]", Label(), r))
- }
- }()
- // 判断主车所在位置 & 行驶速度
- outsideWorkshopFlag, _ := shareVars.Load("OutsideWorkshopFlag")
- if !outsideWorkshopFlag.(bool) || !isEgoStationary(shareVars) {
- return ""
- }
- //const Cgcs2000X = 456256.260152
- //const Cgcs2000Y = 4397809.886833
- const MinStableFrameCount = 5
- const MaxTimeBetweenFrame = 0.5
- //fmt.Println("\n", time.Unix(int64(msg.Header.TimeStamp), int64(msg.Header.TimeStamp*1e9)%1e9).Format(time.StampNano))
- for _, obj := range msg.Objs {
- // 判断目标物是否满足筛选条件
- if objSpeedCheck(&obj) && objPosCheck(&obj) && objTypeCheck(&obj) {
- //fmt.Println(fmt.Sprintf("id: [%d], type: [%d], x/yrel: [%f, %f], x/yabs: [%f, %f], speed: [%f], size: [%f/%f/%f]",
- // obj.Id, obj.Type, obj.X, obj.Y, obj.Xabs-Cgcs2000X, obj.Yabs-Cgcs2000Y, obj.Speed, obj.Length, obj.Width, obj.Height))
- // 目标物初见存档
- if prevObjRecord, exists := objectsStability[obj.Id]; exists == false {
- objectsStability[obj.Id] = Object{
- ID: obj.Id,
- StableAge: 1,
- LastExistTime: msg.Header.TimeStamp,
- }
- //fmt.Println("---------- create ----------")
- } else {
- currObjRecord := Object{
- ID: obj.Id,
- StableAge: 1,
- LastExistTime: msg.Header.TimeStamp,
- }
- // 目标物确认/更新/重置
- if currObjRecord.LastExistTime-prevObjRecord.LastExistTime <= MaxTimeBetweenFrame { // 目标物消失不超过0.5s
- currObjRecord.StableAge = prevObjRecord.StableAge + 1
- if currObjRecord.StableAge == MinStableFrameCount {
- delete(objectsStability, obj.Id)
- //fmt.Println("!!!!!!!!!! found !!!!!!!!!!")
- return Label()
- } else {
- //fmt.Println("---------- update ----------")
- }
- } else {
- //fmt.Println("---------- reset ----------")
- }
- objectsStability[obj.Id] = currObjRecord
- }
- }
- }
- return ""
- }
|