master_trigger_config.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474
  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. "github.com/bluenviron/goroslib/v2/pkg/msgs/geometry_msgs"
  8. "github.com/bluenviron/goroslib/v2/pkg/msgs/nav_msgs"
  9. "github.com/bluenviron/goroslib/v2/pkg/msgs/sensor_msgs"
  10. "github.com/bluenviron/goroslib/v2/pkg/msgs/tf2_msgs"
  11. "github.com/bluenviron/goroslib/v2/pkg/msgs/visualization_msgs"
  12. "plugin"
  13. "strconv"
  14. "sync"
  15. )
  16. var (
  17. //1
  18. TopicOfAmrPose = "/amr_pose"
  19. RuleOfAmrPose []func(data *visualization_msgs.MarkerArray) string
  20. //2
  21. TopicOfBoundingBoxesFast = "/bounding_boxes_fast"
  22. RuleOfBoundingBoxesFast []func(data *pjisuv_msgs.BoundingBoxArray) string
  23. //3
  24. TopicOfCameraFault = "/camera_fault"
  25. RuleOfCameraFault []func(data *pjisuv_msgs.FaultVec) string
  26. //4
  27. TopicOfCanData = "/can_data"
  28. RuleOfCanData []func(data *pjisuv_msgs.Frame) string
  29. //5
  30. TopicOfCh128x1LslidarPointCloud = "/ch128x1/lslidar_point_cloud"
  31. RuleOfCh128x1LslidarPointCloud []func(data *sensor_msgs.PointCloud2) string
  32. //6
  33. TopicOfCh64wLLslidarPointCloud = "/ch64w_l/lslidar_point_cloud"
  34. RuleOfCh64wLLslidarPointCloud []func(data *sensor_msgs.PointCloud2) string
  35. //7
  36. TopicOfCh64wLScan = "/ch64w_l/scan"
  37. RuleOfCh64wLScan []func(data *sensor_msgs.LaserScan) string
  38. //8
  39. TopicOfCh64wRLslidarPointCloud = "/ch64w_r/lslidar_point_cloud"
  40. RuleOfCh64wRLslidarPointCloud []func(data *sensor_msgs.PointCloud2) string
  41. //9
  42. TopicOfCh64wRScan = "/ch64w_r/scan"
  43. RuleOfCh64wRScan []func(data *sensor_msgs.LaserScan) string
  44. //10
  45. TopicOfCicvLidarclusterMovingObjects = "/cicv/lidarcluster_moving_objects"
  46. RuleOfCicvLidarclusterMovingObjects []func(data *pjisuv_msgs.PerceptionCicvMovingObjects) string
  47. //11
  48. TopicOfCicvAmrTrajectory = "/cicv_amr_trajectory"
  49. RuleOfCicvAmrTrajectory []func(data *pjisuv_msgs.Trajectory) string
  50. //12
  51. TopicOfCicvLocation = "/cicv_location"
  52. RuleOfCicvLocation []func(data *pjisuv_msgs.PerceptionLocalization) string
  53. //13
  54. TopicOfCloudClusters = "/cloud_clusters"
  55. RuleOfCloudClusters []func(data *pjisuv_msgs.AutowareCloudClusterArray) string
  56. //14
  57. TopicOfHeartbeatInfo = "/heartbeat_info"
  58. RuleOfHeartbeatInfo []func(data *pjisuv_msgs.HeartBeatInfo) string
  59. //15
  60. TopicOfLidarPretreatmentCost = "/lidarPretreatment_Cost"
  61. RuleOfLidarPretreatmentCost []func(data *geometry_msgs.Vector3Stamped) string
  62. //16
  63. TopicOfLidarPretreatmentOdometry = "/lidar_pretreatment/odometry"
  64. RuleOfLidarPretreatmentOdometry []func(data *nav_msgs.Odometry) string
  65. //17
  66. TopicOfLidarRoi = "/lidar_roi"
  67. RuleOfLidarRoi []func(data *geometry_msgs.PolygonStamped) string
  68. //18
  69. TopicOfLine1 = "/line_1"
  70. RuleOfLine1 []func(data *nav_msgs.Path) string
  71. //19
  72. TopicOfLine2 = "/line_2"
  73. RuleOfLine2 []func(data *nav_msgs.Path) string
  74. //20
  75. TopicOfMapPolygon = "/map_polygon"
  76. RuleOfMapPolygon []func(data *pjisuv_msgs.PolygonStamped) string
  77. //21
  78. TopicOfObstacleDisplay = "/obstacle_display"
  79. RuleOfObstacleDisplay []func(data *visualization_msgs.MarkerArray) string
  80. //22
  81. TopicOfPjControlPub = "/pj_control_pub"
  82. RuleOfPjControlPub []func(data *pjisuv_msgs.CommonVehicleCmd) string
  83. //23
  84. TopicOfPointsCluster = "/points_cluster"
  85. RuleOfPointsCluster []func(data *sensor_msgs.PointCloud2) string
  86. //24
  87. TopicOfPointsConcat = "/points_concat"
  88. RuleOfPointsConcat []func(data *sensor_msgs.PointCloud2) string
  89. //25
  90. TopicOfReferenceDisplay = "/reference_display"
  91. RuleOfReferenceDisplay []func(data *nav_msgs.Path) string
  92. //26
  93. TopicOfReferenceTrajectory = "/reference_trajectory"
  94. RuleOfReferenceTrajectory []func(data *pjisuv_msgs.Trajectory) string
  95. //27
  96. TopicOfRoiPoints = "/roi/points"
  97. RuleOfRoiPoints []func(data *sensor_msgs.PointCloud2) string
  98. //28
  99. TopicOfRoiPolygon = "/roi/polygon"
  100. RuleOfRoiPolygon []func(data *nav_msgs.Path) string
  101. //29
  102. TopicOfTf = "/tf"
  103. RuleOfTf []func(data *tf2_msgs.TFMessage) string
  104. //30
  105. TopicOfTpperception = "/tpperception"
  106. RuleOfTpperception []func(data *pjisuv_msgs.PerceptionObjects, velocityX float64, velocityY float64, yaw float64) string
  107. //31
  108. TopicOfTpperceptionVis = "/tpperception/vis"
  109. RuleOfTpperceptionVis []func(data *visualization_msgs.MarkerArray) string
  110. //32
  111. TopicOfTprouteplan = "/tprouteplan"
  112. RuleOfTprouteplan []func(data *pjisuv_msgs.RoutePlan) string
  113. //33
  114. TopicOfTrajectoryDisplay = "/trajectory_display"
  115. RuleOfTrajectoryDisplay []func(data *nav_msgs.Path) string
  116. //34
  117. TopicOfUngroundCloudpoints = "/unground_cloudpoints"
  118. RuleOfUngroundCloudpoints []func(data *sensor_msgs.PointCloud2) string
  119. //35
  120. TopicOfCameraImage = "/camera_image"
  121. RuleOfCameraImage []func(data *sensor_msgs.Image) string
  122. //36
  123. TopicOfDataRead = "/data_read"
  124. RuleOfDataRead []func(data *pjisuv_msgs.Retrieval) string
  125. //37
  126. TopicOfPjiGps = "/pji_gps"
  127. RuleOfPjiGps []func(data *pjisuv_msgs.PerceptionLocalization) string
  128. LabelMapTriggerId sync.Map
  129. )
  130. func InitTriggerConfig() {
  131. c_log.GlobalLogger.Info("主节点加载触发器插件 - 开始。")
  132. // 下载所有触发器的文件
  133. for _, trigger := range config.PlatformConfig.TaskTriggers {
  134. triggerLocalPath := config.CloudConfig.TriggersDir + trigger.TriggerScriptPath
  135. _ = util.CreateParentDir(triggerLocalPath)
  136. c_log.GlobalLogger.Info("下载触发器插件从 ", trigger.TriggerScriptPath, " 到 ", triggerLocalPath)
  137. config.OssMutex.Lock()
  138. err := config.OssBucket.GetObjectToFile(trigger.TriggerScriptPath, triggerLocalPath)
  139. config.OssMutex.Unlock()
  140. if err != nil {
  141. c_log.GlobalLogger.Error("下载 oss 上的触发器插件失败:", err)
  142. continue
  143. }
  144. // 载入插件到数组
  145. open, err := plugin.Open(triggerLocalPath)
  146. if err != nil {
  147. c_log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "失败。", err)
  148. continue
  149. }
  150. topic0, err := open.Lookup("Topic")
  151. if err != nil {
  152. c_log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "中的Topic方法失败。", err)
  153. continue
  154. }
  155. topic1, ok := topic0.(func() string)
  156. if ok != true {
  157. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func() string):", err)
  158. continue
  159. }
  160. topic2 := topic1()
  161. rule, err := open.Lookup("Rule")
  162. if err != nil {
  163. c_log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "中的Rule方法失败。", err)
  164. continue
  165. }
  166. if TopicOfAmrPose == topic2 { //1
  167. f, ok := rule.(func(data *visualization_msgs.MarkerArray) string)
  168. if ok != true {
  169. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *visualization_msgs.MarkerArray) string):", err)
  170. continue
  171. }
  172. RuleOfAmrPose = append(RuleOfAmrPose, f)
  173. } else if TopicOfBoundingBoxesFast == topic2 { //2
  174. f, ok := rule.(func(data *pjisuv_msgs.BoundingBoxArray) string)
  175. if ok != true {
  176. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.BoundingBoxArray) string):", err)
  177. continue
  178. }
  179. RuleOfBoundingBoxesFast = append(RuleOfBoundingBoxesFast, f)
  180. } else if TopicOfCameraFault == topic2 { //3
  181. f, ok := rule.(func(data *pjisuv_msgs.FaultVec) string)
  182. if ok != true {
  183. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.FaultVec) string):", err)
  184. continue
  185. }
  186. RuleOfCameraFault = append(RuleOfCameraFault, f)
  187. } else if TopicOfCanData == topic2 { //4
  188. f, ok := rule.(func(data *pjisuv_msgs.Frame) string)
  189. if ok != true {
  190. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.Frame) string):", err)
  191. continue
  192. }
  193. RuleOfCanData = append(RuleOfCanData, f)
  194. } else if TopicOfCh128x1LslidarPointCloud == topic2 { //5
  195. f, ok := rule.(func(data *sensor_msgs.PointCloud2) string)
  196. if ok != true {
  197. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *sensor_msgs.PointCloud2) string):", err)
  198. continue
  199. }
  200. RuleOfCh128x1LslidarPointCloud = append(RuleOfCh128x1LslidarPointCloud, f)
  201. } else if TopicOfCh64wLLslidarPointCloud == topic2 { //6
  202. f, ok := rule.(func(data *sensor_msgs.PointCloud2) string)
  203. if ok != true {
  204. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *sensor_msgs.PointCloud2) string):", err)
  205. continue
  206. }
  207. RuleOfCh64wLLslidarPointCloud = append(RuleOfCh64wLLslidarPointCloud, f)
  208. } else if TopicOfCh64wLScan == topic2 { //7
  209. f, ok := rule.(func(data *sensor_msgs.LaserScan) string)
  210. if ok != true {
  211. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *sensor_msgs.LaserScan) string):", err)
  212. continue
  213. }
  214. RuleOfCh64wLScan = append(RuleOfCh64wLScan, f)
  215. } else if TopicOfCh64wRLslidarPointCloud == topic2 { //8
  216. f, ok := rule.(func(data *sensor_msgs.PointCloud2) string)
  217. if ok != true {
  218. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *sensor_msgs.PointCloud2) string):", err)
  219. continue
  220. }
  221. RuleOfCh64wRLslidarPointCloud = append(RuleOfCh64wRLslidarPointCloud, f)
  222. } else if TopicOfCh64wRScan == topic2 { //9
  223. f, ok := rule.(func(data *sensor_msgs.LaserScan) string)
  224. if ok != true {
  225. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *sensor_msgs.LaserScan) string):", err)
  226. continue
  227. }
  228. RuleOfCh64wRScan = append(RuleOfCh64wRScan, f)
  229. } else if TopicOfCicvLidarclusterMovingObjects == topic2 { //10
  230. f, ok := rule.(func(data *pjisuv_msgs.PerceptionCicvMovingObjects) string)
  231. if ok != true {
  232. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.PerceptionCicvMovingObjects) string):", err)
  233. continue
  234. }
  235. RuleOfCicvLidarclusterMovingObjects = append(RuleOfCicvLidarclusterMovingObjects, f)
  236. } else if TopicOfCicvAmrTrajectory == topic2 { //11
  237. f, ok := rule.(func(data *pjisuv_msgs.Trajectory) string)
  238. if ok != true {
  239. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.Trajectory) string):", err)
  240. continue
  241. }
  242. RuleOfCicvAmrTrajectory = append(RuleOfCicvAmrTrajectory, f)
  243. } else if TopicOfCicvLocation == topic2 { //12
  244. f, ok := rule.(func(data *pjisuv_msgs.PerceptionLocalization) string)
  245. if ok != true {
  246. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.PerceptionLocalization) string):", err)
  247. continue
  248. }
  249. RuleOfCicvLocation = append(RuleOfCicvLocation, f)
  250. } else if TopicOfCloudClusters == topic2 { //13
  251. f, ok := rule.(func(data *pjisuv_msgs.AutowareCloudClusterArray) string)
  252. if ok != true {
  253. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.AutowareCloudClusterArray) string):", err)
  254. continue
  255. }
  256. RuleOfCloudClusters = append(RuleOfCloudClusters, f)
  257. } else if TopicOfHeartbeatInfo == topic2 { //14
  258. f, ok := rule.(func(data *pjisuv_msgs.HeartBeatInfo) string)
  259. if ok != true {
  260. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.HeartBeatInfo) string):", err)
  261. continue
  262. }
  263. RuleOfHeartbeatInfo = append(RuleOfHeartbeatInfo, f)
  264. } else if TopicOfLidarPretreatmentCost == topic2 { //15
  265. f, ok := rule.(func(data *geometry_msgs.Vector3Stamped) string)
  266. if ok != true {
  267. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *geometry_msgs.Vector3Stamped) string):", err)
  268. continue
  269. }
  270. RuleOfLidarPretreatmentCost = append(RuleOfLidarPretreatmentCost, f)
  271. } else if TopicOfLidarPretreatmentOdometry == topic2 { //16
  272. f, ok := rule.(func(data *nav_msgs.Odometry) string)
  273. if ok != true {
  274. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *nav_msgs.Odometry) string):", err)
  275. continue
  276. }
  277. RuleOfLidarPretreatmentOdometry = append(RuleOfLidarPretreatmentOdometry, f)
  278. } else if TopicOfLidarRoi == topic2 { //17
  279. f, ok := rule.(func(data *geometry_msgs.PolygonStamped) string)
  280. if ok != true {
  281. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *geometry_msgs.PolygonStamped) string):", err)
  282. continue
  283. }
  284. RuleOfLidarRoi = append(RuleOfLidarRoi, f)
  285. } else if TopicOfLine1 == topic2 { //18
  286. f, ok := rule.(func(data *nav_msgs.Path) string)
  287. if ok != true {
  288. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *nav_msgs.Path) string):", err)
  289. continue
  290. }
  291. RuleOfLine1 = append(RuleOfLine1, f)
  292. } else if TopicOfLine2 == topic2 { //19
  293. f, ok := rule.(func(data *nav_msgs.Path) string)
  294. if ok != true {
  295. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *nav_msgs.Path) string):", err)
  296. continue
  297. }
  298. RuleOfLine2 = append(RuleOfLine2, f)
  299. } else if TopicOfMapPolygon == topic2 { //20
  300. f, ok := rule.(func(data *pjisuv_msgs.PolygonStamped) string)
  301. if ok != true {
  302. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.PolygonStamped) string):", err)
  303. continue
  304. }
  305. RuleOfMapPolygon = append(RuleOfMapPolygon, f)
  306. } else if TopicOfObstacleDisplay == topic2 { //21
  307. f, ok := rule.(func(data *visualization_msgs.MarkerArray) string)
  308. if ok != true {
  309. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *visualization_msgs.MarkerArray) string):", err)
  310. continue
  311. }
  312. RuleOfObstacleDisplay = append(RuleOfObstacleDisplay, f)
  313. } else if TopicOfPjControlPub == topic2 { //22
  314. f, ok := rule.(func(data *pjisuv_msgs.CommonVehicleCmd) string)
  315. if ok != true {
  316. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.CommonVehicleCmd) string):", err)
  317. continue
  318. }
  319. RuleOfPjControlPub = append(RuleOfPjControlPub, f)
  320. } else if TopicOfPointsCluster == topic2 { //23
  321. f, ok := rule.(func(data *sensor_msgs.PointCloud2) string)
  322. if ok != true {
  323. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *sensor_msgs.PointCloud2) string):", err)
  324. continue
  325. }
  326. RuleOfPointsCluster = append(RuleOfPointsCluster, f)
  327. } else if TopicOfPointsConcat == topic2 { //24
  328. f, ok := rule.(func(data *sensor_msgs.PointCloud2) string)
  329. if ok != true {
  330. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *sensor_msgs.PointCloud2) string):", err)
  331. continue
  332. }
  333. RuleOfPointsConcat = append(RuleOfPointsConcat, f)
  334. } else if TopicOfReferenceDisplay == topic2 { //25
  335. f, ok := rule.(func(data *nav_msgs.Path) string)
  336. if ok != true {
  337. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *nav_msgs.Path) string):", err)
  338. continue
  339. }
  340. RuleOfReferenceDisplay = append(RuleOfReferenceDisplay, f)
  341. } else if TopicOfReferenceTrajectory == topic2 { //26
  342. f, ok := rule.(func(data *pjisuv_msgs.Trajectory) string)
  343. if ok != true {
  344. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.Trajectory) string):", err)
  345. continue
  346. }
  347. RuleOfReferenceTrajectory = append(RuleOfReferenceTrajectory, f)
  348. } else if TopicOfRoiPoints == topic2 { //27
  349. f, ok := rule.(func(data *sensor_msgs.PointCloud2) string)
  350. if ok != true {
  351. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *sensor_msgs.PointCloud2) string):", err)
  352. continue
  353. }
  354. RuleOfRoiPoints = append(RuleOfRoiPoints, f)
  355. } else if TopicOfRoiPolygon == topic2 { //28
  356. f, ok := rule.(func(data *nav_msgs.Path) string)
  357. if ok != true {
  358. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *nav_msgs.Path) string):", err)
  359. continue
  360. }
  361. RuleOfRoiPolygon = append(RuleOfRoiPolygon, f)
  362. } else if TopicOfTf == topic2 { //29
  363. f, ok := rule.(func(data *tf2_msgs.TFMessage) string)
  364. if ok != true {
  365. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *tf2_msgs.TFMessage) string):", err)
  366. continue
  367. }
  368. RuleOfTf = append(RuleOfTf, f)
  369. } else if TopicOfTpperception == topic2 { //30
  370. f, ok := rule.(func(data *pjisuv_msgs.PerceptionObjects, velocityX float64, velocityY float64, yaw float64) string)
  371. if ok != true {
  372. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.PerceptionObjects, velocityX float64, velocityY float64, yaw float64) string):", err)
  373. continue
  374. }
  375. RuleOfTpperception = append(RuleOfTpperception, f)
  376. } else if TopicOfTpperceptionVis == topic2 { //31
  377. f, ok := rule.(func(data *visualization_msgs.MarkerArray) string)
  378. if ok != true {
  379. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *visualization_msgs.MarkerArray) string):", err)
  380. continue
  381. }
  382. RuleOfTpperceptionVis = append(RuleOfTpperceptionVis, f)
  383. } else if TopicOfTprouteplan == topic2 { //32
  384. f, ok := rule.(func(data *pjisuv_msgs.RoutePlan) string)
  385. if ok != true {
  386. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.RoutePlan) string):", err)
  387. continue
  388. }
  389. RuleOfTprouteplan = append(RuleOfTprouteplan, f)
  390. } else if TopicOfTrajectoryDisplay == topic2 { //33
  391. f, ok := rule.(func(data *nav_msgs.Path) string)
  392. if ok != true {
  393. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *nav_msgs.Path) string):", err)
  394. continue
  395. }
  396. RuleOfTrajectoryDisplay = append(RuleOfTrajectoryDisplay, f)
  397. } else if TopicOfUngroundCloudpoints == topic2 { //34
  398. f, ok := rule.(func(data *sensor_msgs.PointCloud2) string)
  399. if ok != true {
  400. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *sensor_msgs.PointCloud2) string):", err)
  401. continue
  402. }
  403. RuleOfUngroundCloudpoints = append(RuleOfUngroundCloudpoints, f)
  404. } else if TopicOfCameraImage == topic2 { //35
  405. f, ok := rule.(func(data *sensor_msgs.Image) string)
  406. if ok != true {
  407. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *sensor_msgs.Image) string):", err)
  408. continue
  409. }
  410. RuleOfCameraImage = append(RuleOfCameraImage, f)
  411. } else if TopicOfDataRead == topic2 { //36
  412. f, ok := rule.(func(data *pjisuv_msgs.Retrieval) string)
  413. if ok != true {
  414. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.Retrieval) string):", err)
  415. continue
  416. }
  417. RuleOfDataRead = append(RuleOfDataRead, f)
  418. } else {
  419. c_log.GlobalLogger.Error("未知的topic:", topic2)
  420. continue
  421. }
  422. label, err := open.Lookup("Label")
  423. if err != nil {
  424. c_log.GlobalLogger.Error("加载本地插件 ", triggerLocalPath, " 中的 Label 方法失败。", err)
  425. continue
  426. }
  427. labelFunc := label.(func() string)
  428. labelString := labelFunc()
  429. LabelMapTriggerId.Store(labelString, strconv.Itoa(trigger.TriggerId))
  430. c_log.GlobalLogger.Info("主节点加载触发器插件:【ros topic】=", topic2, ",【触发器label】=", labelString, "【触发器ID】=", trigger.TriggerId)
  431. }
  432. c_log.GlobalLogger.Info("一共有", len(config.PlatformConfig.TaskTriggers), "个触发器。")
  433. }