TargetCarBehindWhenReversing.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package main
  2. import (
  3. "cicv-data-closedloop/pjisuv_msgs"
  4. "fmt"
  5. "math"
  6. "sync"
  7. )
  8. type Point struct {
  9. Latitude float64
  10. Longitude float64
  11. }
  12. var (
  13. count1 int64
  14. )
  15. func Topic() string {
  16. return "/cicv_location"
  17. }
  18. // 禁止存在下划线_
  19. func Label() string {
  20. return "TargetCarBehindWhenReversing"
  21. }
  22. func IfObstaclesNearby(shareVars *sync.Map) bool {
  23. ObjDicOfTpperception, ok1 := shareVars.Load("objDicOfTpperception")
  24. ObjDic := ObjDicOfTpperception.(map[uint32][][]float32)
  25. if ok1 {
  26. for _, obj := range ObjDic {
  27. if obj[0][len(obj[0])-1] >= -15 && obj[0][len(obj[0])-1] <= -1 && (math.Abs(float64(obj[1][len(obj[1])-1]))) <= 6 {
  28. return true
  29. }
  30. }
  31. }
  32. return false
  33. }
  34. func calculateDirectionAngle(speedX, speedY float64) float64 {
  35. // 使用反正切函数计算方向角
  36. angle := math.Atan2(speedY, speedX)
  37. // 将角度转换为度数
  38. angleDegree := angle * (180 / math.Pi)
  39. // 将角度限定在 0~360 范围内
  40. if angleDegree < 0 {
  41. angleDegree += 360
  42. } else if angleDegree > 360 {
  43. angleDegree -= 360
  44. }
  45. return angleDegree
  46. }
  47. func Rule(shareVars *sync.Map, data *pjisuv_msgs.PerceptionLocalization) string {
  48. defer func() {
  49. if r := recover(); r != nil {
  50. fmt.Println("Recovered from panic:", r)
  51. }
  52. }()
  53. if count1%100 == 0 {
  54. OutsideWorkshopFlag, _ := shareVars.Load("OutsideWorkshopFlag")
  55. OutsideWorkshopFlag = OutsideWorkshopFlag.(bool)
  56. directionAngle := calculateDirectionAngle(data.VelocityX, data.VelocityY)
  57. diffAngle := math.Abs(float64(directionAngle - data.Yaw))
  58. if OutsideWorkshopFlag == true {
  59. AbsSpeed, _ := shareVars.Load("AbsSpeed")
  60. flag := IfObstaclesNearby(shareVars)
  61. if flag && AbsSpeed.(float64) >= 1 && diffAngle >= 160 && diffAngle <= 200 {
  62. eventLabel := "TargetCarBehindWhenReversing"
  63. fmt.Println(eventLabel)
  64. count1 = 1
  65. return Label()
  66. }
  67. }
  68. }
  69. count1++
  70. return ""
  71. }