master_trigger_config.go 20 KB

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