ey_common_test.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  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. type Record struct {
  12. StableFrame int
  13. LastExistingTime float64
  14. }
  15. var record *Record = nil
  16. // Label todo 禁止存在下划线_
  17. func Label() string {
  18. return "test"
  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. const targetType uint8 = 4
  25. return targetType == obj.Type
  26. }
  27. // posCheck 判断目标物位置关系
  28. func posCheck(obj *pjisuv_msgs.PerceptionObject) bool {
  29. const laneWidth = 3.5 // m
  30. return obj.X > 0 && math.Abs(float64(obj.Y)) < laneWidth*1.5
  31. }
  32. // Rule 检测前方指定目标物数量
  33. func Rule(msg *pjisuv_msgs.PerceptionObjects) string {
  34. defer func() {
  35. if r := recover(); r != nil {
  36. fmt.Println("Recovered from panic:", r)
  37. }
  38. }()
  39. const Cgcs2000X = 456256.260152
  40. const Cgcs2000Y = 4397809.886833
  41. const MinStableFrameCount = 5 // frame
  42. const MaxTimeBetweenFrame = 0.5 // second
  43. const minTargetNum = 4
  44. fmt.Println("\n", time.Unix(int64(msg.Header.TimeStamp), int64(msg.Header.TimeStamp*1e9)%1e9).Format(time.StampNano))
  45. if len(msg.Objs) >= minTargetNum {
  46. currTargetNum := 0
  47. for _, obj := range msg.Objs {
  48. // 判断目标物是否满足筛选条件
  49. if typeCheck(&obj) && posCheck(&obj) {
  50. fmt.Println(fmt.Sprintf("id: [%d], type: [%d], x/yrel: [%f, %f], x/yabs: [%f, %f], speed: [%f], size: [%f/%f/%f]",
  51. obj.Id, obj.Type, obj.X, obj.Y, obj.Xabs-Cgcs2000X, obj.Yabs-Cgcs2000Y, obj.Speed, obj.Length, obj.Width, obj.Height))
  52. currTargetNum++
  53. }
  54. }
  55. if currTargetNum >= minTargetNum {
  56. if nil == record {
  57. record = &Record{
  58. StableFrame: 1,
  59. LastExistingTime: msg.Header.TimeStamp,
  60. }
  61. fmt.Println("---------- create ----------")
  62. } else {
  63. newRecord := Record{
  64. StableFrame: 1,
  65. LastExistingTime: msg.Header.TimeStamp,
  66. }
  67. if newRecord.LastExistingTime-record.LastExistingTime <= MaxTimeBetweenFrame {
  68. newRecord.StableFrame = record.StableFrame + 1
  69. if newRecord.StableFrame == MinStableFrameCount {
  70. record = nil
  71. fmt.Println("!!!!!!!!!! found !!!!!!!!!!") // todo
  72. return Label()
  73. } else {
  74. fmt.Println("---------- update ----------")
  75. }
  76. } else {
  77. fmt.Println("---------- reset ----------")
  78. }
  79. record = &newRecord
  80. }
  81. }
  82. }
  83. return ""
  84. }
  85. func TestGoRosLib(t *testing.T) {
  86. defer func() {
  87. if err := recover(); err != nil {
  88. log.Println(err, fmt.Sprintf("recover: [%#v]", err), false)
  89. }
  90. }()
  91. rosNode, err := goroslib.NewNode(goroslib.NodeConf{
  92. Name: "eyTest",
  93. MasterAddress: "localhost:11311",
  94. })
  95. if err != nil {
  96. log.Panicln(err, fmt.Sprintf("failed to create rosNode: [%#v]", err), false)
  97. }
  98. _, err = goroslib.NewSubscriber(goroslib.SubscriberConf{
  99. Node: rosNode,
  100. Topic: "/tpperception",
  101. Callback: func(msg *pjisuv_msgs.PerceptionObjects) {
  102. Rule(msg)
  103. },
  104. })
  105. if err != nil {
  106. log.Panicln(err, fmt.Sprintf("failed to create subscriber: [%#v]", err), false)
  107. }
  108. select {}
  109. }