DescendingSteepHill.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package main
  2. import (
  3. "awesomeProject/entity"
  4. "awesomeProject/pjisuv_msgs"
  5. "fmt"
  6. "github.com/bluenviron/goroslib/v2"
  7. "math"
  8. "os"
  9. "os/signal"
  10. "time"
  11. )
  12. // //道路坡度大于6%就可以被认为是陡坡
  13. var (
  14. param entity.PjisuvParam
  15. threshold = -0.05
  16. AngleSlice = [][]float64{{}, {}, {}, {}}
  17. count1 = 0
  18. )
  19. func main() {
  20. ticker := time.NewTicker(2 * time.Second)
  21. defer ticker.Stop()
  22. go listener()
  23. for {
  24. select {
  25. case <-ticker.C:
  26. FinalCallback()
  27. }
  28. }
  29. }
  30. // QuaternionToEuler 将四元数转换为欧拉角
  31. func QuaternionToEuler(x, y, z, w float64) float64 {
  32. // 归一化四元数
  33. length := math.Sqrt(x*x + y*y + z*z + w*w)
  34. x /= length
  35. y /= length
  36. z /= length
  37. w /= length
  38. // 计算欧拉角
  39. pitch := math.Asin(2 * (w*y - z*x))
  40. return pitch
  41. }
  42. func countChanges(AngleSlice [][]float64) int {
  43. num := 0
  44. for i := 0; i < len(AngleSlice[1]); i++ {
  45. pitch := QuaternionToEuler(AngleSlice[0][i], AngleSlice[1][i], AngleSlice[2][i], AngleSlice[3][i])
  46. if pitch < threshold {
  47. num++
  48. }
  49. }
  50. return num
  51. }
  52. func FinalCallback() {
  53. count := countChanges(AngleSlice)
  54. if count >= 5 {
  55. event_lable := "DescendingSteepHill"
  56. fmt.Println(event_lable)
  57. }
  58. AngleSlice = [][]float64{{}, {}, {}, {}}
  59. }
  60. func CallbackCicvLocation(data *pjisuv_msgs.PerceptionLocalization) {
  61. if count1%10 == 0 {
  62. AngleSlice[0] = append(AngleSlice[0], data.Qx)
  63. AngleSlice[1] = append(AngleSlice[1], data.Qy)
  64. AngleSlice[2] = append(AngleSlice[2], data.Qz)
  65. AngleSlice[3] = append(AngleSlice[3], data.Qw)
  66. count1 = 1
  67. }
  68. count1++
  69. }
  70. func listener() {
  71. // create a node and connect to the master
  72. n, err := goroslib.NewNode(goroslib.NodeConf{
  73. Name: "goroslib_sub",
  74. MasterAddress: "127.0.0.1:11311",
  75. })
  76. if err != nil {
  77. panic(err)
  78. }
  79. defer n.Close()
  80. // create a subscriber
  81. subCicvLocation, err := goroslib.NewSubscriber(goroslib.SubscriberConf{
  82. Node: n,
  83. Topic: "/cicv_location",
  84. Callback: CallbackCicvLocation,
  85. })
  86. if err != nil {
  87. panic(err)
  88. }
  89. defer subCicvLocation.Close()
  90. // wait for CTRL-C
  91. c := make(chan os.Signal, 1)
  92. signal.Notify(c, os.Interrupt)
  93. <-c
  94. }