goroslib_test.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package test
  2. import (
  3. "cicv-data-closedloop/pjisuv_msgs"
  4. "fmt"
  5. "github.com/bluenviron/goroslib/v2"
  6. "log"
  7. "math"
  8. "testing"
  9. "time"
  10. )
  11. // speedCheck 目标物速度检测
  12. func speedCheck(obj *pjisuv_msgs.PerceptionObject) bool {
  13. var targetMinSpeed float32 = 2 / 3.6 // m/s
  14. var targetMaxSpeed float32 = 20 / 3.6 // m/s
  15. if targetMinSpeed < obj.Speed && obj.Speed < targetMaxSpeed {
  16. return true
  17. }
  18. return false
  19. }
  20. // typeCheck 目标物类型检测
  21. // × 金龙车:CAR_TYPE=0, TRUCK_TYPE=1, PEDESTRIAN_TYPE=2, CYCLIST_TYPE=3, UNKNOWN_TYPE=4, UNKNOWN_MOVABLE_TYPE=5, UNKNOWN_UNMOVABLE_TYPE=6
  22. // √ 多功能车:UNKNOWN TYPE=O, PEDESTRIAN TYPE=1, CAR TYPE=2, TRUCK TYPE=3, Bicycle TYPE=4, Tricycle TYPE=5, Traffic Cone TYPE=6
  23. func typeCheck(obj *pjisuv_msgs.PerceptionObject) bool {
  24. var targetType uint8 = 3
  25. if targetType == obj.Type {
  26. return true
  27. }
  28. return false
  29. }
  30. // sizeCheck 目标物大小检测
  31. func sizeCheck(obj *pjisuv_msgs.PerceptionObject) bool {
  32. // 多功能车
  33. var targetMinLength float32 = 3.6 // m
  34. var targetMinWidth float32 = 1.605 // m
  35. var targetMinHeight float32 = 1.995 // m
  36. // 金龙车
  37. //targetMinLength := 5.99
  38. //targetMinWidth := 2.065
  39. //targetMinHeight := 2.82
  40. if obj.Length > targetMinLength || obj.Width > targetMinWidth || obj.Height > targetMinHeight {
  41. return true
  42. }
  43. return false
  44. }
  45. // posCheck 判断目标物位置关系
  46. func posCheck(obj *pjisuv_msgs.PerceptionObject) bool {
  47. laneWidth := 3.5 // m
  48. if obj.X > 0 && math.Abs(float64(obj.Y)) < laneWidth*1.5 {
  49. return true
  50. }
  51. return false
  52. }
  53. // Rule 感知算法识别大车、有车辆在前方车道且低速行驶
  54. func Rule(msg *pjisuv_msgs.PerceptionObjects) string {
  55. defer func() {
  56. if r := recover(); r != nil {
  57. fmt.Println("Recovered from panic:", r)
  58. }
  59. }()
  60. CGCS2000_X := 456256.260152
  61. CGCS2000_Y := 4397809.886833
  62. fmt.Println()
  63. fmt.Println(time.Unix(int64(msg.Header.TimeStamp), 0).Format(time.DateTime))
  64. for _, obj := range msg.Objs {
  65. fmt.Println(fmt.Sprintf("id: [%d], type: [%d], x/yrel: [%f, %f], x/yabs: [%f, %f], speed: [%f], size: [%f/%f/%f]",
  66. obj.Id, obj.Type, obj.X, obj.Y, obj.Xabs-CGCS2000_X, obj.Yabs-CGCS2000_Y, obj.Speed, obj.Length, obj.Width, obj.Height))
  67. // todo: 对各判断条件单独进行稳定性校验?
  68. if speedCheck(&obj) && posCheck(&obj) && (typeCheck(&obj) || sizeCheck(&obj)) {
  69. fmt.Println("!!!")
  70. //return "LowSpdTruckAhead"
  71. }
  72. }
  73. return ""
  74. }
  75. func TestGoRosLib(t *testing.T) {
  76. defer func() {
  77. if err := recover(); err != nil {
  78. log.Println(err, fmt.Sprintf("recover: [%#v]", err), false)
  79. }
  80. }()
  81. rosNode, err := goroslib.NewNode(goroslib.NodeConf{
  82. Name: "eyTest",
  83. MasterAddress: "localhost:11311",
  84. })
  85. if err != nil {
  86. log.Panicln(err, fmt.Sprintf("failed to create rosNode: [%#v]", err), false)
  87. }
  88. _, err = goroslib.NewSubscriber(goroslib.SubscriberConf{
  89. Node: rosNode,
  90. Topic: "/tpperception",
  91. Callback: func(msg *pjisuv_msgs.PerceptionObjects) {
  92. Rule(msg)
  93. },
  94. })
  95. if err != nil {
  96. log.Panicln(err, fmt.Sprintf("failed to create subscriber: [%#v]", err), false)
  97. }
  98. select {}
  99. }