trigger_init.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. package config
  2. import (
  3. "cicv-data-closedloop/aarch64/pjisuv/common/config"
  4. "cicv-data-closedloop/common/config/c_log"
  5. "cicv-data-closedloop/common/util"
  6. "cicv-data-closedloop/pjisuv_msgs"
  7. entity "cicv-data-closedloop/pjisuv_param"
  8. "github.com/bluenviron/goroslib/v2/pkg/msgs/geometry_msgs"
  9. "github.com/bluenviron/goroslib/v2/pkg/msgs/nav_msgs"
  10. "github.com/bluenviron/goroslib/v2/pkg/msgs/sensor_msgs"
  11. "github.com/bluenviron/goroslib/v2/pkg/msgs/tf2_msgs"
  12. "github.com/bluenviron/goroslib/v2/pkg/msgs/visualization_msgs"
  13. "plugin"
  14. )
  15. func InitTriggerConfig() {
  16. var triggerLocalPaths []string
  17. c_log.GlobalLogger.Info("主节点加载触发器插件 - 开始。")
  18. // 1 获取数采任务的触发器列表
  19. cloudTriggers := &config.PlatformConfig.TaskTriggers
  20. // 2 获取本地触发器列表(触发器目录的一级子目录为【触发器ID_触发器Label】)
  21. localTriggerIds := util.GetFirstLevelSubdirectories(config.CloudConfig.TriggersDir)
  22. // 3 对比触发器列表,本地没有的则下载
  23. for _, trigger := range *cloudTriggers {
  24. id := util.ToString(trigger.TriggerId)
  25. hasIdDir, _ := util.ContainsElement(localTriggerIds, id)
  26. triggerLocalDir := config.CloudConfig.TriggersDir + id + "/"
  27. hasLabelSo, soPaths := util.CheckSoFilesInDirectory(triggerLocalDir)
  28. var triggerLocalPath string
  29. if hasIdDir && hasLabelSo { // 已存在的触发器不需要再次下载
  30. triggerLocalPath = soPaths[0]
  31. c_log.GlobalLogger.Info("触发器插件从 ", triggerLocalPath, " 存在。")
  32. triggerLocalPaths = append(triggerLocalPaths, triggerLocalPath)
  33. continue
  34. }
  35. label := util.GetFileNameWithoutExtension(config.CloudConfig.TriggersDir + trigger.TriggerScriptPath)
  36. triggerLocalPath = config.CloudConfig.TriggersDir + id + "/" + label + ".so"
  37. c_log.GlobalLogger.Info("下载触发器插件从 ", trigger.TriggerScriptPath, " 到 ", triggerLocalPath)
  38. config.OssMutex.Lock()
  39. _ = util.CreateParentDir(triggerLocalPath)
  40. err := config.OssBucket.GetObjectToFile(trigger.TriggerScriptPath, triggerLocalPath)
  41. config.OssMutex.Unlock()
  42. if err != nil {
  43. c_log.GlobalLogger.Error("下载 OSS 上的触发器插件失败:", err)
  44. continue
  45. }
  46. triggerLocalPaths = append(triggerLocalPaths, triggerLocalPath)
  47. }
  48. // 下载所有触发器的文件
  49. for _, triggerLocalPath := range triggerLocalPaths {
  50. // 载入插件到数组
  51. open, err := plugin.Open(triggerLocalPath)
  52. if err != nil {
  53. c_log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "失败。", err)
  54. continue
  55. }
  56. topic0, err := open.Lookup("Topic")
  57. if err != nil {
  58. c_log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "中的Topic方法失败。", err)
  59. continue
  60. }
  61. topic1, ok := topic0.(func() string)
  62. if ok != true {
  63. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func() string):", err)
  64. continue
  65. }
  66. topic2 := topic1()
  67. rule, err := open.Lookup("Rule")
  68. if err != nil {
  69. c_log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "中的Rule方法失败。", err)
  70. continue
  71. }
  72. if TopicOfCicvExtend == topic2 { // 自定义扩展
  73. f, ok := rule.(func(param entity.PjisuvParam) string)
  74. if ok != true {
  75. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(param entity.ExtendParam):", err)
  76. continue
  77. }
  78. RuleOfCicvExtend = append(RuleOfCicvExtend, f)
  79. } else if TopicOfAmrPose == topic2 { //1
  80. f, ok := rule.(func(data *visualization_msgs.MarkerArray) string)
  81. if ok != true {
  82. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *visualization_msgs.MarkerArray) string):", err)
  83. continue
  84. }
  85. RuleOfAmrPose = append(RuleOfAmrPose, f)
  86. } else if TopicOfBoundingBoxesFast == topic2 { //2
  87. f, ok := rule.(func(data *pjisuv_msgs.BoundingBoxArray) string)
  88. if ok != true {
  89. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.BoundingBoxArray) string):", err)
  90. continue
  91. }
  92. RuleOfBoundingBoxesFast = append(RuleOfBoundingBoxesFast, f)
  93. } else if TopicOfCameraFault == topic2 { //3
  94. f, ok := rule.(func(data *pjisuv_msgs.FaultVec) string)
  95. if ok != true {
  96. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.FaultVec) string):", err)
  97. continue
  98. }
  99. RuleOfCameraFault = append(RuleOfCameraFault, f)
  100. } else if TopicOfCanData == topic2 { //4
  101. f, ok := rule.(func(data *pjisuv_msgs.Frame) string)
  102. if ok != true {
  103. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.Frame) string):", err)
  104. continue
  105. }
  106. RuleOfCanData = append(RuleOfCanData, f)
  107. } else if TopicOfCh128x1LslidarPointCloud == topic2 { //5
  108. f, ok := rule.(func(data *sensor_msgs.PointCloud2) string)
  109. if ok != true {
  110. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *sensor_msgs.PointCloud2) string):", err)
  111. continue
  112. }
  113. RuleOfCh128x1LslidarPointCloud = append(RuleOfCh128x1LslidarPointCloud, f)
  114. } else if TopicOfCh64wLLslidarPointCloud == topic2 { //6
  115. f, ok := rule.(func(data *sensor_msgs.PointCloud2) string)
  116. if ok != true {
  117. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *sensor_msgs.PointCloud2) string):", err)
  118. continue
  119. }
  120. RuleOfCh64wLLslidarPointCloud = append(RuleOfCh64wLLslidarPointCloud, f)
  121. } else if TopicOfCh64wLScan == topic2 { //7
  122. f, ok := rule.(func(data *sensor_msgs.LaserScan) string)
  123. if ok != true {
  124. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *sensor_msgs.LaserScan) string):", err)
  125. continue
  126. }
  127. RuleOfCh64wLScan = append(RuleOfCh64wLScan, f)
  128. } else if TopicOfCh64wRLslidarPointCloud == topic2 { //8
  129. f, ok := rule.(func(data *sensor_msgs.PointCloud2) string)
  130. if ok != true {
  131. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *sensor_msgs.PointCloud2) string):", err)
  132. continue
  133. }
  134. RuleOfCh64wRLslidarPointCloud = append(RuleOfCh64wRLslidarPointCloud, f)
  135. } else if TopicOfCh64wRScan == topic2 { //9
  136. f, ok := rule.(func(data *sensor_msgs.LaserScan) string)
  137. if ok != true {
  138. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *sensor_msgs.LaserScan) string):", err)
  139. continue
  140. }
  141. RuleOfCh64wRScan = append(RuleOfCh64wRScan, f)
  142. } else if TopicOfCicvLidarclusterMovingObjects == topic2 { //10
  143. f, ok := rule.(func(data *pjisuv_msgs.PerceptionCicvMovingObjects) string)
  144. if ok != true {
  145. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.PerceptionCicvMovingObjects) string):", err)
  146. continue
  147. }
  148. RuleOfCicvLidarclusterMovingObjects = append(RuleOfCicvLidarclusterMovingObjects, f)
  149. } else if TopicOfCicvAmrTrajectory == topic2 { //11
  150. f, ok := rule.(func(data *pjisuv_msgs.Trajectory, param entity.PjisuvParam) string)
  151. if ok != true {
  152. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.Trajectory,param entity.PjisuvParam) string):", err)
  153. continue
  154. }
  155. RuleOfCicvAmrTrajectory = append(RuleOfCicvAmrTrajectory, f)
  156. } else if TopicOfCicvLocation == topic2 { //12
  157. f, ok := rule.(func(data *pjisuv_msgs.PerceptionLocalization) string)
  158. if ok != true {
  159. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.PerceptionLocalization) string):", err)
  160. continue
  161. }
  162. RuleOfCicvLocation = append(RuleOfCicvLocation, f)
  163. } else if TopicOfCloudClusters == topic2 { //13
  164. f, ok := rule.(func(data *pjisuv_msgs.AutowareCloudClusterArray) string)
  165. if ok != true {
  166. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.AutowareCloudClusterArray) string):", err)
  167. continue
  168. }
  169. RuleOfCloudClusters = append(RuleOfCloudClusters, f)
  170. } else if TopicOfHeartbeatInfo == topic2 { //14
  171. f, ok := rule.(func(data *pjisuv_msgs.HeartBeatInfo) string)
  172. if ok != true {
  173. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.HeartBeatInfo) string):", err)
  174. continue
  175. }
  176. RuleOfHeartbeatInfo = append(RuleOfHeartbeatInfo, f)
  177. } else if TopicOfLidarPretreatmentCost == topic2 { //15
  178. f, ok := rule.(func(data *geometry_msgs.Vector3Stamped) string)
  179. if ok != true {
  180. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *geometry_msgs.Vector3Stamped) string):", err)
  181. continue
  182. }
  183. RuleOfLidarPretreatmentCost = append(RuleOfLidarPretreatmentCost, f)
  184. } else if TopicOfLidarPretreatmentOdometry == topic2 { //16
  185. f, ok := rule.(func(data *nav_msgs.Odometry) string)
  186. if ok != true {
  187. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *nav_msgs.Odometry) string):", err)
  188. continue
  189. }
  190. RuleOfLidarPretreatmentOdometry = append(RuleOfLidarPretreatmentOdometry, f)
  191. } else if TopicOfLidarRoi == topic2 { //17
  192. f, ok := rule.(func(data *geometry_msgs.PolygonStamped) string)
  193. if ok != true {
  194. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *geometry_msgs.PolygonStamped) string):", err)
  195. continue
  196. }
  197. RuleOfLidarRoi = append(RuleOfLidarRoi, f)
  198. } else if TopicOfLine1 == topic2 { //18
  199. f, ok := rule.(func(data *nav_msgs.Path) string)
  200. if ok != true {
  201. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *nav_msgs.Path) string):", err)
  202. continue
  203. }
  204. RuleOfLine1 = append(RuleOfLine1, f)
  205. } else if TopicOfLine2 == topic2 { //19
  206. f, ok := rule.(func(data *nav_msgs.Path) string)
  207. if ok != true {
  208. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *nav_msgs.Path) string):", err)
  209. continue
  210. }
  211. RuleOfLine2 = append(RuleOfLine2, f)
  212. } else if TopicOfMapPolygon == topic2 { //20
  213. f, ok := rule.(func(data *pjisuv_msgs.PolygonStamped) string)
  214. if ok != true {
  215. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.PolygonStamped) string):", err)
  216. continue
  217. }
  218. RuleOfMapPolygon = append(RuleOfMapPolygon, f)
  219. } else if TopicOfObstacleDisplay == topic2 { //21
  220. f, ok := rule.(func(data *visualization_msgs.MarkerArray) string)
  221. if ok != true {
  222. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *visualization_msgs.MarkerArray) string):", err)
  223. continue
  224. }
  225. RuleOfObstacleDisplay = append(RuleOfObstacleDisplay, f)
  226. } else if TopicOfPjControlPub == topic2 { //22
  227. f, ok := rule.(func(data *pjisuv_msgs.CommonVehicleCmd) string)
  228. if ok != true {
  229. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.CommonVehicleCmd) string):", err)
  230. continue
  231. }
  232. RuleOfPjControlPub = append(RuleOfPjControlPub, f)
  233. } else if TopicOfPointsCluster == topic2 { //23
  234. f, ok := rule.(func(data *sensor_msgs.PointCloud2) string)
  235. if ok != true {
  236. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *sensor_msgs.PointCloud2) string):", err)
  237. continue
  238. }
  239. RuleOfPointsCluster = append(RuleOfPointsCluster, f)
  240. } else if TopicOfPointsConcat == topic2 { //24
  241. f, ok := rule.(func(data *sensor_msgs.PointCloud2) string)
  242. if ok != true {
  243. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *sensor_msgs.PointCloud2) string):", err)
  244. continue
  245. }
  246. RuleOfPointsConcat = append(RuleOfPointsConcat, f)
  247. } else if TopicOfReferenceDisplay == topic2 { //25
  248. f, ok := rule.(func(data *nav_msgs.Path) string)
  249. if ok != true {
  250. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *nav_msgs.Path) string):", err)
  251. continue
  252. }
  253. RuleOfReferenceDisplay = append(RuleOfReferenceDisplay, f)
  254. } else if TopicOfReferenceTrajectory == topic2 { //26
  255. f, ok := rule.(func(data *pjisuv_msgs.Trajectory) string)
  256. if ok != true {
  257. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.Trajectory) string):", err)
  258. continue
  259. }
  260. RuleOfReferenceTrajectory = append(RuleOfReferenceTrajectory, f)
  261. } else if TopicOfRoiPoints == topic2 { //27
  262. f, ok := rule.(func(data *sensor_msgs.PointCloud2) string)
  263. if ok != true {
  264. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *sensor_msgs.PointCloud2) string):", err)
  265. continue
  266. }
  267. RuleOfRoiPoints = append(RuleOfRoiPoints, f)
  268. } else if TopicOfRoiPolygon == topic2 { //28
  269. f, ok := rule.(func(data *nav_msgs.Path) string)
  270. if ok != true {
  271. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *nav_msgs.Path) string):", err)
  272. continue
  273. }
  274. RuleOfRoiPolygon = append(RuleOfRoiPolygon, f)
  275. } else if TopicOfTf == topic2 { //29
  276. f, ok := rule.(func(data *tf2_msgs.TFMessage) string)
  277. if ok != true {
  278. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *tf2_msgs.TFMessage) string):", err)
  279. continue
  280. }
  281. RuleOfTf = append(RuleOfTf, f)
  282. } else if TopicOfTpperception == topic2 { //30
  283. f, ok := rule.(func(data *pjisuv_msgs.PerceptionObjects, param entity.PjisuvParam) string)
  284. if ok != true {
  285. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.PerceptionObjects, param entity.ExtendParam) string):", err)
  286. continue
  287. }
  288. RuleOfTpperception = append(RuleOfTpperception, f)
  289. } else if TopicOfTpperceptionVis == topic2 { //31
  290. f, ok := rule.(func(data *visualization_msgs.MarkerArray) string)
  291. if ok != true {
  292. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *visualization_msgs.MarkerArray) string):", err)
  293. continue
  294. }
  295. RuleOfTpperceptionVis = append(RuleOfTpperceptionVis, f)
  296. } else if TopicOfTprouteplan == topic2 { //32
  297. f, ok := rule.(func(data *pjisuv_msgs.RoutePlan) string)
  298. if ok != true {
  299. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.RoutePlan) string):", err)
  300. continue
  301. }
  302. RuleOfTprouteplan = append(RuleOfTprouteplan, f)
  303. } else if TopicOfTrajectoryDisplay == topic2 { //33
  304. f, ok := rule.(func(data *nav_msgs.Path) string)
  305. if ok != true {
  306. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *nav_msgs.Path) string):", err)
  307. continue
  308. }
  309. RuleOfTrajectoryDisplay = append(RuleOfTrajectoryDisplay, f)
  310. } else if TopicOfUngroundCloudpoints == topic2 { //34
  311. f, ok := rule.(func(data *sensor_msgs.PointCloud2) string)
  312. if ok != true {
  313. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *sensor_msgs.PointCloud2) string):", err)
  314. continue
  315. }
  316. RuleOfUngroundCloudpoints = append(RuleOfUngroundCloudpoints, f)
  317. } else if TopicOfCameraImage == topic2 { //35
  318. f, ok := rule.(func(data *sensor_msgs.Image) string)
  319. if ok != true {
  320. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *sensor_msgs.Image) string):", err)
  321. continue
  322. }
  323. RuleOfCameraImage = append(RuleOfCameraImage, f)
  324. } else if TopicOfDataRead == topic2 { //36
  325. f, ok := rule.(func(data *pjisuv_msgs.Retrieval) string)
  326. if ok != true {
  327. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.Retrieval) string):", err)
  328. continue
  329. }
  330. RuleOfDataRead = append(RuleOfDataRead, f)
  331. } else if TopicOfPjVehicleFdbPub == topic2 { //39
  332. f, ok := rule.(func(data *pjisuv_msgs.VehicleFdb, param *entity.PjisuvParam) string)
  333. if ok != true {
  334. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.VehicleFdb) string):", err)
  335. continue
  336. }
  337. RuleOfPjVehicleFdbPub = append(RuleOfPjVehicleFdbPub, f)
  338. } else {
  339. c_log.GlobalLogger.Error("未知的topic:", topic2)
  340. continue
  341. }
  342. _, err = open.Lookup("Label")
  343. if err != nil {
  344. c_log.GlobalLogger.Error("加载本地插件 ", triggerLocalPath, " 中的 Label 方法失败。", err)
  345. continue
  346. }
  347. }
  348. c_log.GlobalLogger.Info("一共有", len(config.PlatformConfig.TaskTriggers), "个触发器。")
  349. }