for_competition.go 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. package service
  2. //
  3. //import (
  4. // "cicv-data-closedloop/aarch64/pjisuv/common/config"
  5. // commonConfig "cicv-data-closedloop/aarch64/pjisuv/common/config"
  6. // "cicv-data-closedloop/common/config/c_log"
  7. // "cicv-data-closedloop/common/util"
  8. // "cicv-data-closedloop/pjisuv_msgs"
  9. // "github.com/bluenviron/goroslib/v2"
  10. // "github.com/bluenviron/goroslib/v2/pkg/msgs/std_msgs"
  11. // "os"
  12. // "strings"
  13. // "sync"
  14. // "time"
  15. //)
  16. //
  17. //var (
  18. // dir = "/userdata/competition/"
  19. // dirBak = "/userdata/competition-bak/"
  20. // ossPrefix = "competition/"
  21. // // v20240604 添加 /pj_vehicle_fdb_pub 判断人工接管场景
  22. // commandArgs = []string{"record", "--split", "--duration=1", "/pji_gps", "/data_read", "/pj_vehicle_fdb_pub"}
  23. // topic = "/team_name"
  24. // urlExamTick = "http://36.110.106.142:12341/web_server/exam/tick"
  25. // urlExamBegin = "http://36.110.106.142:12341/web_server/exam/begin"
  26. // urlExamEnd = "http://36.110.106.142:12341/web_server/exam/end"
  27. // cacheMutex sync.Mutex
  28. // cacheTeamName = make(map[string]time.Time)
  29. // heartBeatTimeThreshold = 5 * time.Second // 心跳时间
  30. // bakSecondNumber = 3600
  31. // cachePositionX = -999.00
  32. // cachePositionY = -999.00
  33. // cacheAutoMode = -1 // 自动驾驶状态 0 人工 1 自动
  34. // InitialPositionX = 565266.0482367771 // todo 需要比赛确认起点
  35. // InitialPositionY = 4329773.48728322 // todo 需要比赛确认起点
  36. //)
  37. //
  38. //// todo 实车比赛临时使用
  39. //// history record命令无法录制()
  40. //func ForCompetition() {
  41. // go dataCollection()
  42. // go dataCollectionBak(bakSecondNumber) // 需要再车上备份的数据,防止网络差传不回来
  43. // go location() // 记录经纬度和速度
  44. // go mode() // 记录自动驾驶状态
  45. // go tick()
  46. //}
  47. //
  48. //// 全量数据采集
  49. //func dataCollection() {
  50. // c_log.GlobalLogger.Info("开始采集实车算法比赛全量数据。")
  51. // util.CreateDir(dir)
  52. // // 1 打包
  53. // c_log.GlobalLogger.Info("采集实车算法比赛全量数据的环境变量为:", commonConfig.RosbagEnvs)
  54. // command, err := util.ExecuteWithEnvAndDirAsync(commonConfig.RosbagEnvs, dir, commonConfig.RosbagPath, commandArgs...)
  55. // if err != nil {
  56. // c_log.GlobalLogger.Error("程序崩溃。执行record命令", command, "出错:", err)
  57. // os.Exit(-1)
  58. // }
  59. // // 2 扫描目录文件
  60. // for {
  61. // time.Sleep(time.Duration(2) * time.Second)
  62. // files, _ := util.ListAbsolutePathAndSort(dir)
  63. // if len(files) >= 2 {
  64. // //c_log.GlobalLogger.Info("扫描实车比赛数据采集目录,", files)
  65. // for i := range files {
  66. // if i == len(files)-1 { // 最后一个包在录制中,不上传
  67. // break
  68. // }
  69. // c_log.GlobalLogger.Debug("上传实车算法比赛全量数据包", files[i])
  70. // bagSlice := strings.Split(files[i], "/")
  71. // commonConfig.OssMutex.Lock()
  72. // _ = commonConfig.OssBucket.PutObjectFromFile(ossPrefix+config.LocalConfig.EquipmentNo+"/"+bagSlice[len(bagSlice)-1], files[i])
  73. // commonConfig.OssMutex.Unlock()
  74. // _ = util.DeleteFile(files[i])
  75. // }
  76. // }
  77. // }
  78. //}
  79. //
  80. //// 全量数据采集
  81. //func dataCollectionBak(bakSecondNumber int) {
  82. // c_log.GlobalLogger.Info("开始备份实车算法比赛全量数据。")
  83. // util.CreateDir(dirBak)
  84. // // 1 打包
  85. // command, err := util.ExecuteWithEnvAndDirAsync(commonConfig.RosbagEnvs, dirBak, commonConfig.RosbagPath, commandArgs...)
  86. // if err != nil {
  87. // c_log.GlobalLogger.Error("程序崩溃。备份目录执行record命令", command, "出错:", err)
  88. // os.Exit(-1)
  89. // }
  90. // // 2 扫描目录文件
  91. // for {
  92. // time.Sleep(time.Duration(2) * time.Second)
  93. // files, _ := util.ListAbsolutePathAndSort(dirBak)
  94. // if len(files) >= bakSecondNumber {
  95. // // 超出阈值就删除心跳+1个文件
  96. // _ = util.DeleteFile(files[0])
  97. // _ = util.DeleteFile(files[1])
  98. // _ = util.DeleteFile(files[2])
  99. // }
  100. // }
  101. //}
  102. //
  103. //// data格式为队伍编号
  104. //// 保存单次考试时间区间
  105. //func location() {
  106. // _, _ = goroslib.NewSubscriber(goroslib.SubscriberConf{
  107. // Node: commonConfig.RosNode,
  108. // Topic: "/cicv_location",
  109. // Callback: func(data *pjisuv_msgs.PerceptionLocalization) {
  110. // cachePositionX = data.PositionX
  111. // cachePositionY = data.PositionY
  112. // },
  113. // })
  114. //}
  115. //
  116. //func mode() {
  117. // _, _ = goroslib.NewSubscriber(goroslib.SubscriberConf{
  118. // Node: commonConfig.RosNode,
  119. // Topic: "/pj_vehicle_fdb_pub",
  120. // Callback: func(data *pjisuv_msgs.VehicleFdb) {
  121. // cacheAutoMode = int(data.Automode)
  122. // },
  123. // })
  124. //}
  125. //
  126. //// data格式为队伍编号
  127. //// 保存单次考试时间区间
  128. //func tick() {
  129. // _, _ = goroslib.NewSubscriber(goroslib.SubscriberConf{
  130. // Node: commonConfig.RosNode,
  131. // Topic: topic,
  132. // Callback: func(data *std_msgs.String) {
  133. // if cacheAutoMode == 1 { // 只有在自动驾驶状态才发送心跳
  134. // //if math.Abs(positionX-InitialPositionX) > 5.00 || math.Abs(positionY-InitialPositionY) > 5.00 { // todo 测试临时使用起点判断
  135. // teamName := data.Data
  136. // response, err := util.HttpPostJsonWithHeaders(
  137. // urlExamTick,
  138. // map[string]string{"Authorization": "U9yKpD6kZZDDe4LFKK6myAxBUT1XRrDM"},
  139. // map[string]string{
  140. // "teamName": teamName,
  141. // "positionX": util.ToString(cachePositionX),
  142. // "positionY": util.ToString(cachePositionY),
  143. // "equipmentNo": config.LocalConfig.EquipmentNo, // 设备编号
  144. // },
  145. // )
  146. // if err != nil {
  147. // c_log.GlobalLogger.Infof("队伍 %v 的心跳发送到云端报错,错误信息为:%v。", teamName, err)
  148. // }
  149. // c_log.GlobalLogger.Infof("队伍 %v 的心跳发送到云端,响应结果为:%v。", teamName, response)
  150. // }
  151. // },
  152. // })
  153. //}
  154. //
  155. ////// data格式为队伍编号
  156. ////// 保存单次考试时间区间
  157. ////func examBeginBak() {
  158. //// _, _ = goroslib.NewSubscriber(goroslib.SubscriberConf{
  159. //// Node: commonConfig.RosNode,
  160. //// Topic: topic,
  161. //// Callback: func(data *std_msgs.String) {
  162. //// teamName := data.Data
  163. //// cacheMutex.Lock()
  164. //// {
  165. //// if !util.ContainsKey(cacheTeamName, teamName) { // 1 如果缓存数组中没有此队名,代表考试开始,缓存此队名,和当前时间戳
  166. //// examBeginTime := time.Now()
  167. //// cacheTeamName[teamName] = examBeginTime
  168. //// _, _ = util.HttpPostJsonWithHeaders(
  169. //// urlExamBegin,
  170. //// map[string]string{"Authorization": "U9yKpD6kZZDDe4LFKK6myAxBUT1XRrDM"},
  171. //// map[string]string{"teamName": teamName},
  172. //// )
  173. //// c_log.GlobalLogger.Infof("队伍 %v 的考试开始。", teamName)
  174. //// } else { // 2 如果缓存数组中有此队名,代表考试进行中,刷新时间戳
  175. //// cacheTeamName[teamName] = time.Now()
  176. //// }
  177. //// }
  178. //// cacheMutex.Unlock()
  179. //// },
  180. //// })
  181. ////}
  182. ////
  183. ////func examEndBak() {
  184. //// for {
  185. //// time.Sleep(time.Duration(1) * time.Second)
  186. //// cacheMutex.Lock()
  187. //// {
  188. //// var keysToDelete []string
  189. //// for teamName, heartBeatTime := range cacheTeamName {
  190. //// if time.Since(heartBeatTime) > heartBeatTimeThreshold { // 检查缓存中的队名,如果超过心跳时间,则代表考试结束,删除缓存中的队名
  191. //// keysToDelete = append(keysToDelete, teamName)
  192. //// }
  193. //// }
  194. //// for _, teamName := range keysToDelete { // 检查缓存中的队名,如果超过心跳时间,则代表考试结束,删除缓存中的队名
  195. //// delete(cacheTeamName, teamName)
  196. //// _, _ = util.HttpPostJsonWithHeaders(
  197. //// urlExamEnd,
  198. //// map[string]string{"Authorization": "U9yKpD6kZZDDe4LFKK6myAxBUT1XRrDM"},
  199. //// map[string]string{"teamName": teamName},
  200. //// )
  201. //// c_log.GlobalLogger.Infof("队伍 %v 的考试结束。", teamName)
  202. //// }
  203. //// }
  204. //// cacheMutex.Unlock()
  205. //// }
  206. ////}