CCFtap.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package main
  2. import (
  3. "cicv-data-closedloop/pjisuv_msgs"
  4. "fmt"
  5. "math"
  6. "sync"
  7. )
  8. var (
  9. Framenum int64 = 0
  10. PosxofCicvLocation any
  11. PosyofCicvLocation any
  12. posx float64
  13. posy float64
  14. ObjDicOfTpperception any
  15. objDic = make(map[uint32][][]float32)
  16. yaw float64
  17. Trajcetorypoint any
  18. trajcetory []pjisuv_msgs.TrajectoryPoint
  19. objId uint32
  20. ok1 bool
  21. ok2 bool
  22. ok3 bool
  23. ok4 bool
  24. LeftCurveFlag = false
  25. RightCurveFlag = false
  26. )
  27. func Topic() string {
  28. return "/tpperception"
  29. }
  30. // 禁止存在下划线_
  31. func Label() string {
  32. return "CCFtap"
  33. }
  34. func Rule(shareVars *sync.Map, data *pjisuv_msgs.PerceptionObjects) string {
  35. defer func() {
  36. if r := recover(); r != nil {
  37. fmt.Println("Recovered from panic:", r)
  38. }
  39. }()
  40. PosxofCicvLocation, ok1 = shareVars.Load("PositionXOfCicvLocation")
  41. PosyofCicvLocation, ok2 = shareVars.Load("PositionYOfCicvLocation")
  42. if !ok1 && !ok2 {
  43. return ""
  44. }
  45. posx = PosxofCicvLocation.(float64)
  46. posy = PosyofCicvLocation.(float64)
  47. Framenum += 1
  48. ObjDicOfTpperception, ok3 = shareVars.Load("ObjDicOfTpperception")
  49. if !ok3 {
  50. return ""
  51. }
  52. objDic = ObjDicOfTpperception.(map[uint32][][]float32)
  53. // Trajcetorypoint的类型?
  54. Trajcetorypoint, ok4 = shareVars.Load("Trajcetorypoint")
  55. if !ok4 {
  56. return ""
  57. }
  58. trajcetory = Trajcetorypoint.([]pjisuv_msgs.TrajectoryPoint)
  59. if len(trajcetory) > 2 {
  60. StartHeading := trajcetory[0].Heading
  61. EndHeading := trajcetory[len(trajcetory)-1].Heading
  62. diffHeading := StartHeading - EndHeading
  63. if diffHeading < -1.0 && diffHeading > -3.0 {
  64. LeftCurveFlag = true
  65. } else {
  66. LeftCurveFlag = false
  67. }
  68. if diffHeading > 1.0 && diffHeading < 3.0 {
  69. RightCurveFlag = true
  70. //fmt.Println(diffHeading)
  71. } else {
  72. RightCurveFlag = false
  73. }
  74. } else {
  75. LeftCurveFlag = false
  76. RightCurveFlag = false
  77. }
  78. if LeftCurveFlag == true {
  79. for objid, objVal := range objDic {
  80. if objVal[objid][6] != 100 { //简化条件
  81. //if obj.Type == 2 || obj.Type == 3 {//理论条件
  82. absspeed := math.Sqrt(math.Pow(float64(objVal[objid][2]), 2) + math.Pow(float64(objVal[objid][3]), 2))
  83. Distance := math.Sqrt(math.Pow(posy-float64(objVal[objid][0]), 2) + math.Pow(posy-float64(objVal[objid][1]), 2))
  84. //fmt.Println("Distance:", Distance)
  85. if objVal[objid][0] >= 2.0 && objVal[objid][0] <= 15.0 && (math.Abs(float64(objVal[objid][1])) <= 4.0 || Distance <= 15.0) && absspeed > 1.5 {
  86. return Label()
  87. break
  88. }
  89. }
  90. }
  91. }
  92. return ""
  93. }