ReverseAndOverspeed.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package main
  2. import (
  3. "cicv-data-closedloop/pjisuv_msgs"
  4. "fmt"
  5. "math"
  6. "sync"
  7. )
  8. var (
  9. threshold float64 = 15 / 3.6
  10. count1 int = 0
  11. )
  12. func Topic() string {
  13. return "/cicv_location"
  14. }
  15. // 禁止存在下划线_
  16. func Label() string {
  17. return "ReverseAndOverspeed"
  18. }
  19. func calculateDirectionAngle(speedX, speedY float64) float64 {
  20. // 使用反正切函数计算方向角
  21. angle := math.Atan2(speedY, speedX)
  22. // 将角度转换为度数
  23. angleDegree := angle * (180 / math.Pi)
  24. // 将角度限定在 0~360 范围内
  25. if angleDegree < 0 {
  26. angleDegree += 360
  27. } else if angleDegree > 360 {
  28. angleDegree -= 360
  29. }
  30. return angleDegree
  31. }
  32. // 主进程的逻辑是先判断触发再缓存全局变量
  33. func Rule(shareVars *sync.Map, data *pjisuv_msgs.PerceptionLocalization) string {
  34. defer func() {
  35. if r := recover(); r != nil {
  36. fmt.Println("Recovered from panic:", r)
  37. }
  38. }()
  39. if count1%200 == 0 {
  40. OutsideWorkshopFlag, ok3 := shareVars.Load("OutsideWorkshopFlag")
  41. if ok3 {
  42. directionAngle := calculateDirectionAngle(data.VelocityX, data.VelocityY)
  43. AbsSpeed, _ := shareVars.Load("AbsSpeed")
  44. diffAngle := math.Abs(float64(directionAngle - data.Yaw))
  45. //fmt.Println(diffAngle)
  46. if AbsSpeed.(float64) >= threshold && diffAngle >= 160 && diffAngle <= 200 && OutsideWorkshopFlag.(bool) {
  47. eventLabel := "ReverseAndOverspeed"
  48. fmt.Println(eventLabel)
  49. count1 = 1
  50. return Label()
  51. }
  52. }
  53. }
  54. count1++
  55. return ""
  56. }