Ver código fonte

Merge branch 'master' of http://36.110.106.156:13000/cicv/cicv_data_closed_loop

HeWang 2 meses atrás
pai
commit
10a4455f83
100 arquivos alterados com 19044 adições e 237 exclusões
  1. 1 1
      README.md
  2. 323 0
      aarch64/pjibot_clean/common/config/c_cloud.go
  3. 21 0
      aarch64/pjibot_clean/common/config/c_killrpcserver.go
  4. 62 0
      aarch64/pjibot_clean/common/config/c_local.go
  5. 52 0
      aarch64/pjibot_clean/common/config/c_oss.go
  6. 212 0
      aarch64/pjibot_clean/common/config/c_platform.go
  7. 35 0
      aarch64/pjibot_clean/common/config/c_resource.go
  8. 39 0
      aarch64/pjibot_clean/common/config/c_ros.go
  9. 225 0
      aarch64/pjibot_clean/common/config/c_websocket.go
  10. 93 0
      aarch64/pjibot_clean/common/service/disk_clean.go
  11. 118 0
      aarch64/pjibot_clean/common/service/kill_self.go
  12. 36 0
      aarch64/pjibot_clean/common/service/rosbag_clean.go
  13. 140 0
      aarch64/pjibot_clean/common/service/rosbag_record.go
  14. 250 0
      aarch64/pjibot_clean/common/service/rosbag_upload.go
  15. 6 0
      aarch64/pjibot_clean/common/variable/application.go
  16. 225 0
      aarch64/pjibot_clean/control/main.go
  17. 45 0
      aarch64/pjibot_clean/control/pkg/judge_cloud.go
  18. 44 0
      aarch64/pjibot_clean/control/pkg/judge_local.go
  19. 62 0
      aarch64/pjibot_clean/master/main.go
  20. 2354 0
      aarch64/pjibot_clean/master/package/config/bak.txt
  21. 184 0
      aarch64/pjibot_clean/master/package/config/rules101~284.txt
  22. 284 0
      aarch64/pjibot_clean/master/package/config/rules1~100.txt
  23. 2969 0
      aarch64/pjibot_clean/master/package/config/trigger_init.go
  24. 286 0
      aarch64/pjibot_clean/master/package/config/机器人话题和数据类型对应关系.txt
  25. 284 0
      aarch64/pjibot_clean/master/package/config/清洁机器人话题列表.txt
  26. 96 0
      aarch64/pjibot_clean/master/package/service/collect_one_msg.go
  27. 73 0
      aarch64/pjibot_clean/master/package/service/move_bag_and_send_window.go
  28. 9259 0
      aarch64/pjibot_clean/master/package/service/produce_window.go
  29. 3 0
      aarch64/pjibot_clean/start-control.sh
  30. 3 0
      aarch64/pjibot_clean/start-master.sh
  31. 189 0
      aarch64/pjibot_clean/清洁机器人默认配置文件-cloud-config.yaml
  32. 20 0
      aarch64/pjibot_clean/清洁机器人默认配置文件-local-config.yaml
  33. 2 1
      aarch64/pjibot_delivery/master/package/config/trigger_var.go
  34. 2 2
      aarch64/pjibot_guide/common/config/c_cloud.go
  35. 5 5
      aarch64/pjibot_guide/引导机器人默认配置文件-cloud-config.yaml
  36. 1 1
      aarch64/pjibot_guide/引导机器人默认配置文件-local-config.yaml
  37. 7 0
      deploy/build-pji_clean.sh
  38. 8 0
      deploy/build-pji_delivery.sh
  39. 7 0
      deploy/build-pji_guide.sh
  40. 8 0
      deploy/build-pji_patrol.sh
  41. 4 0
      deploy/build-rosbag_command.sh
  42. 0 69
      kinglong_msgs/common_msgs.go
  43. 0 54
      kinglong_msgs/control_msgs.go
  44. 0 104
      kinglong_msgs/perception_msgs.go
  45. 10 0
      pjibot_clean_msgs/actionlib_msgs_msg/GoalID.msg
  46. 23 0
      pjibot_clean_msgs/actionlib_msgs_msg/GoalStatus.msg
  47. 5 0
      pjibot_clean_msgs/actionlib_msgs_msg/GoalStatusArray.msg
  48. 18 0
      pjibot_clean_msgs/cartographer_ros_msgs/msg_bagfileprogress.go
  49. 13 0
      pjibot_clean_msgs/cartographer_ros_msgs/msg_histogrambucket.go
  50. 16 0
      pjibot_clean_msgs/cartographer_ros_msgs/msg_landmarkentry.go
  51. 14 0
      pjibot_clean_msgs/cartographer_ros_msgs/msg_landmarklist.go
  52. 17 0
      pjibot_clean_msgs/cartographer_ros_msgs/msg_laserscanstates.go
  53. 22 0
      pjibot_clean_msgs/cartographer_ros_msgs/msg_metric.go
  54. 14 0
      pjibot_clean_msgs/cartographer_ros_msgs/msg_metricfamily.go
  55. 13 0
      pjibot_clean_msgs/cartographer_ros_msgs/msg_metriclabel.go
  56. 17 0
      pjibot_clean_msgs/cartographer_ros_msgs/msg_robotpose.go
  57. 31 0
      pjibot_clean_msgs/cartographer_ros_msgs/msg_statuscode.go
  58. 13 0
      pjibot_clean_msgs/cartographer_ros_msgs/msg_statusresponse.go
  59. 17 0
      pjibot_clean_msgs/cartographer_ros_msgs/msg_submapentry.go
  60. 14 0
      pjibot_clean_msgs/cartographer_ros_msgs/msg_submaplist.go
  61. 17 0
      pjibot_clean_msgs/cartographer_ros_msgs/msg_submaptexture.go
  62. 23 0
      pjibot_clean_msgs/cartographer_ros_msgs/msg_trajectorystates.go
  63. 5 0
      pjibot_clean_msgs/cartographer_ros_msgs/package.go
  64. 24 0
      pjibot_clean_msgs/cartographer_ros_msgs/srv_deletetrajectory.go
  65. 23 0
      pjibot_clean_msgs/cartographer_ros_msgs/srv_finishtrajectory.go
  66. 23 0
      pjibot_clean_msgs/cartographer_ros_msgs/srv_gettrajectorystates.go
  67. 25 0
      pjibot_clean_msgs/cartographer_ros_msgs/srv_readmetrics.go
  68. 22 0
      pjibot_clean_msgs/cartographer_ros_msgs/srv_scanqualityquery.go
  69. 29 0
      pjibot_clean_msgs/cartographer_ros_msgs/srv_starttrajectory.go
  70. 26 0
      pjibot_clean_msgs/cartographer_ros_msgs/srv_submapquery.go
  71. 24 0
      pjibot_clean_msgs/cartographer_ros_msgs/srv_switchmap.go
  72. 25 0
      pjibot_clean_msgs/cartographer_ros_msgs/srv_trajectoryquery.go
  73. 24 0
      pjibot_clean_msgs/cartographer_ros_msgs/srv_writestate.go
  74. 14 0
      pjibot_clean_msgs/clean_msg/msg_alongwallpath.go
  75. 13 0
      pjibot_clean_msgs/clean_msg/msg_destinationpoint.go
  76. 38 0
      pjibot_clean_msgs/clean_msg/msg_errorinfo.go
  77. 14 0
      pjibot_clean_msgs/clean_msg/msg_gridphits.go
  78. 13 0
      pjibot_clean_msgs/clean_msg/msg_gridposition.go
  79. 17 0
      pjibot_clean_msgs/clean_msg/msg_partition.go
  80. 12 0
      pjibot_clean_msgs/clean_msg/msg_partitionlist.go
  81. 16 0
      pjibot_clean_msgs/clean_msg/msg_path.go
  82. 14 0
      pjibot_clean_msgs/clean_msg/msg_pathlist.go
  83. 13 0
      pjibot_clean_msgs/clean_msg/msg_rangelist.go
  84. 22 0
      pjibot_clean_msgs/clean_msg/msg_sweepsystem.go
  85. 29 0
      pjibot_clean_msgs/clean_msg/msg_task.go
  86. 21 0
      pjibot_clean_msgs/clean_msg/msg_taskdata.go
  87. 13 0
      pjibot_clean_msgs/clean_msg/msg_tasklist.go
  88. 12 0
      pjibot_clean_msgs/clean_msg/msg_virtualwalllist.go
  89. 19 0
      pjibot_clean_msgs/clean_msg/msg_washsystem.go
  90. 5 0
      pjibot_clean_msgs/clean_msg/package.go
  91. 23 0
      pjibot_clean_msgs/clean_msg/srv_checkcustompath.go
  92. 24 0
      pjibot_clean_msgs/clean_msg/srv_getalongwallpath.go
  93. 24 0
      pjibot_clean_msgs/clean_msg/srv_loadforbiddenarea.go
  94. 25 0
      pjibot_clean_msgs/clean_msg/srv_loadmap.go
  95. 23 0
      pjibot_clean_msgs/clean_msg/srv_loadtask.go
  96. 24 0
      pjibot_clean_msgs/clean_msg/srv_loadvirtualwall.go
  97. 3 0
      pjibot_clean_msgs/clean_msg_msg/AlongWallPath.msg
  98. 2 0
      pjibot_clean_msgs/clean_msg_msg/DestinationPoint.msg
  99. 24 0
      pjibot_clean_msgs/clean_msg_msg/ErrorInfo.msg
  100. 3 0
      pjibot_clean_msgs/clean_msg_msg/GridPhits.msg

+ 1 - 1
README.md

@@ -39,7 +39,7 @@ v2025.1.2: 准备开启吉利项目开发,代码定版
 
 ## 1-2 xxx_msgs目录
 - ros消息定义
-
+ 
 ## aarch64/pjisuv
 ## 目录结构
 ### common

+ 323 - 0
aarch64/pjibot_clean/common/config/c_cloud.go

@@ -0,0 +1,323 @@
+package config
+
+import (
+	"cicv-data-closedloop/common/config/c_log"
+	"cicv-data-closedloop/common/util"
+	"errors"
+	"gopkg.in/yaml.v3"
+	"os"
+	"strings"
+	"sync"
+	"time"
+)
+
+type MonitorStruct struct {
+	Url string `yaml:"url"`
+}
+
+type PlatformStruct struct {
+	UrlDeviceAuth string `yaml:"url-device-auth"`
+	UrlTaskPoll   string `yaml:"url-task-poll"`
+	UrlTask       string `yaml:"url-task"`
+}
+
+type rosbagStruct struct {
+	Path string   `yaml:"path"`
+	Envs []string `yaml:"envs"`
+}
+
+type HostStruct struct {
+	Name   string       `yaml:"name"`
+	Ip     string       `yaml:"ip"`
+	Topics []string     `yaml:"topics"`
+	Rosbag rosbagStruct `yaml:"rosbag"`
+}
+
+type RosStruct struct {
+	MasterAddress string   `yaml:"master-address"`
+	Nodes         []string `yaml:"nodes"`
+}
+
+type DiskStruct struct {
+	Name string   `yaml:"name"`
+	Used uint64   `yaml:"used"`
+	Path []string `yaml:"path"`
+}
+
+type TriggerStruct struct {
+	Label  string   `yaml:"label"`
+	Topics []string `yaml:"topics"`
+}
+
+type CollectLimitStruct struct {
+	Url   string `yaml:"url"`
+	Flag  int    `yaml:"flag"`
+	Day   int    `yaml:"day"`
+	Week  int    `yaml:"week"`
+	Month int    `yaml:"month"`
+	Year  int    `yaml:"year"`
+}
+
+type CollectNumPlusStruct struct {
+	Url string `yaml:"url"`
+}
+
+type DataDirStruct struct {
+	Src    string   `yaml:"src"`
+	SrcSub []string `yaml:"src-sub"`
+	Dest   string   `yaml:"dest"`
+}
+
+type cloudConfig struct {
+	CollectLimit          CollectLimitStruct   `yaml:"collect-limit"`
+	CollectNumPlus        CollectNumPlusStruct `yaml:"collect-num-plus"`
+	DataDir               DataDirStruct        `yaml:"data-dir"`
+	MapBufFiles           []string             `yaml:"map-buf-files"`
+	FullCollect           bool                 `yaml:"full-collect"`
+	ConfigRefreshInterval int                  `yaml:"config-refresh-interval"` // 配置刷新时间间隔
+	BagNumber             int                  `yaml:"bag-number"`
+	TimeWindowSendGap     int                  `yaml:"time-window-send-gap"` // 主节点向从节点发送窗口的最小时间间隔
+	MapBagPath            string               `yaml:"map-bag-path"`
+	TfstaticBagPath       string               `yaml:"tfstatic-bag-path"`
+	CostmapBagPath        string               `yaml:"costmap-bag-path"`
+	BagDataDir            string               `yaml:"bag-data-dir"`
+	BagCopyDir            string               `yaml:"bag-copy-dir"`
+	TriggersDir           string               `yaml:"triggers-dir"`
+	RpcPort               string               `yaml:"rpc-port"`
+	Triggers              []TriggerStruct      `yaml:"triggers"`
+	Hosts                 []HostStruct         `yaml:"hosts"`
+	Ros                   RosStruct            `yaml:"ros"`
+	Platform              PlatformStruct       `yaml:"platform"`
+	Disk                  DiskStruct           `yaml:"disk"`
+	Monitor               MonitorStruct        `yaml:"monitor"`
+}
+
+//// Request 结构体定义
+//type Request struct {
+//	Type      string      `json:"type"`
+//	UUID      string      `json:"uuid"`
+//	CommandID string      `json:"commandId"`
+//	Parameter interface{} `json:"parameter"`
+//}
+//
+//// Response 结构体定义
+//type Response struct {
+//	CommandID string            `json:"commandId"`
+//	ErrorCode string            `json:"errorCode"`
+//	Results   map[string]string `json:"results"`
+//	Status    string            `json:"status"`
+//	Time      int64             `json:"time"`
+//	Type      string            `json:"type"`
+//	UUID      string            `json:"uuid"`
+//}
+
+var (
+	CloudConfig      cloudConfig
+	CloudConfigMutex sync.RWMutex
+)
+
+// InitCloudConfig 初始化业务配置
+func InitCloudConfig() {
+	// history20240401:朴津机器人额外加一个获取sn码
+	var snCode string
+
+	for {
+		time.Sleep(time.Duration(2) * time.Second)
+		snCode, err := getSnCode()
+		if err != nil {
+			c_log.GlobalLogger.Error("获取sn码失败:", err.Error())
+			continue
+		}
+		LocalConfig.SecretKey = snCode
+		LocalConfig.EquipmentNo = "pjibot-" + snCode
+		break
+	}
+	c_log.GlobalLogger.Info("本地机器人sn码为:", snCode)
+
+	c_log.GlobalLogger.Info("初始化OSS配置文件 - 开始。")
+	// 获取文件的目录
+	_ = util.CreateParentDir(LocalConfig.CloudConfigLocalPath)
+	// 3 ------- 获取 yaml 字符串 -------
+	cloudConfigObjectKey := LocalConfig.OssBasePrefix + LocalConfig.EquipmentNo + "/" + LocalConfig.CloudConfigFilename
+
+	// 判断文件是否存在。如果不存在则使用默认的
+	isExist, err := OssBucket.IsObjectExist(cloudConfigObjectKey)
+	if err != nil {
+		c_log.GlobalLogger.Errorf("判断配置文件是否存在失败,错误信息为:%v", err)
+	}
+	if isExist {
+		c_log.GlobalLogger.Info("使用机器人自定义配置文件:", cloudConfigObjectKey)
+	} else {
+		cloudConfigObjectKey = LocalConfig.OssBasePrefix + LocalConfig.CloudConfigFilename // 默认配置文件路径
+		c_log.GlobalLogger.Info("使用机器人默认配置文件:", cloudConfigObjectKey)
+	}
+
+	for {
+		OssMutex.Lock()
+		err := OssBucket.GetObjectToFile(cloudConfigObjectKey, LocalConfig.CloudConfigLocalPath)
+		OssMutex.Unlock()
+		if err != nil {
+			c_log.GlobalLogger.Error("下载 OSS 上的配置文件 "+cloudConfigObjectKey+" 失败,请尽快在 OSS 上传配置文件。", err)
+			time.Sleep(time.Duration(2) * time.Second)
+			continue
+		}
+		break
+	}
+
+	content, err := os.ReadFile(LocalConfig.CloudConfigLocalPath)
+	if err != nil {
+		c_log.GlobalLogger.Error("程序崩溃,配置文件 ", LocalConfig.CloudConfigLocalPath, " 读取失败:", err)
+		os.Exit(-1)
+	}
+
+	// 4 ------- 解析YAML内容 -------
+	var newCloudConfig cloudConfig
+	err = yaml.Unmarshal(content, &newCloudConfig)
+	if err != nil {
+		c_log.GlobalLogger.Error("程序崩溃,配置文件 ", LocalConfig.CloudConfigLocalPath, " 解析失败:", err)
+		os.Exit(-1)
+	}
+
+	// 5 ------- 校验 yaml -------
+	if checkCloudConfig(newCloudConfig) {
+		CloudConfigMutex.RLock()
+		CloudConfig = newCloudConfig
+		CloudConfigMutex.RUnlock()
+	} else {
+		c_log.GlobalLogger.Error("程序崩溃,配置文件格式错误:", newCloudConfig)
+		os.Exit(-1)
+	}
+	c_log.GlobalLogger.Info("初始化OSS配置文件 - 成功。")
+	util.CreateDir(CloudConfig.BagDataDir)
+	util.CreateDir(CloudConfig.BagCopyDir)
+}
+
+// 更新业务配置
+func refreshCloudConfig() {
+	// 获取文件的目录
+	_ = util.CreateParentDir(LocalConfig.CloudConfigLocalPath)
+	// 3 ------- 获取 yaml 字符串 -------
+	var content []byte
+	cloudConfigObjectKey := LocalConfig.OssBasePrefix + LocalConfig.EquipmentNo + "/" + LocalConfig.CloudConfigFilename
+
+	isExist, err := OssBucket.IsObjectExist(cloudConfigObjectKey)
+	if err != nil {
+		c_log.GlobalLogger.Errorf("判断配置文件是否存在失败,错误信息为:%v", err)
+		return
+	}
+	if !isExist {
+		cloudConfigObjectKey = LocalConfig.OssBasePrefix + LocalConfig.CloudConfigFilename // 默认配置文件路径
+	}
+
+	OssMutex.Lock()
+	err = OssBucket.GetObjectToFile(cloudConfigObjectKey, LocalConfig.CloudConfigLocalPath)
+	OssMutex.Unlock()
+	if err != nil {
+		c_log.GlobalLogger.Error("下载oss上的配置文件"+cloudConfigObjectKey+"失败。", err)
+	}
+
+	content, err = os.ReadFile(LocalConfig.CloudConfigLocalPath)
+	if err != nil {
+		c_log.GlobalLogger.Error("配置文件 ", LocalConfig.CloudConfigLocalPath, " 读取失败:", err)
+		return
+	}
+
+	// 4 ------- 解析YAML内容 -------
+	var newCloudConfig cloudConfig
+	err = yaml.Unmarshal(content, &newCloudConfig)
+	if err != nil {
+		c_log.GlobalLogger.Error("配置文件 ", LocalConfig.CloudConfigLocalPath, " 解析失败:", err)
+		return
+	}
+
+	// 5 ------- 校验 yaml -------
+	if checkCloudConfig(newCloudConfig) {
+		CloudConfigMutex.RLock()
+		CloudConfig = newCloudConfig
+		CloudConfigMutex.RUnlock()
+	} else {
+		c_log.GlobalLogger.Error("配置文件格式错误:", newCloudConfig)
+		return
+	}
+	util.CreateDir(CloudConfig.BagDataDir)
+	util.CreateDir(CloudConfig.BagCopyDir)
+}
+
+// RefreshCloudConfig 轮询oss上的配置文件更新到本地
+func RefreshCloudConfig() {
+	for {
+		time.Sleep(time.Duration(CloudConfig.ConfigRefreshInterval) * time.Second)
+		refreshCloudConfig()
+	}
+}
+
+// CheckConfig 校验 cfg.yaml 文件
+func checkCloudConfig(check cloudConfig) bool {
+	if len(check.Hosts) != 1 {
+		c_log.GlobalLogger.Error("cloud-config.yaml中配置的hosts必须为1。")
+		os.Exit(-1)
+	}
+	return true
+}
+
+func getSnCode() (string, error) {
+	var command []string
+	command = append(command, "get")
+	command = append(command, "sn")
+	_, snOutput, err := util.ExecuteSync(LocalConfig.RosparamPath, command...)
+	if err != nil {
+		return "", errors.New("执行获取sn码命令" + LocalConfig.RosparamPath + util.ToString(command) + "出错:" + util.ToString(err))
+	}
+	c_log.GlobalLogger.Info("执行获取sn码命令", LocalConfig.RosparamPath, command, "成功,结果为:", snOutput)
+	snCode := strings.Replace(strings.Replace(snOutput, " ", "", -1), "\n", "", -1)
+	return snCode, nil
+}
+
+//// SendWebsocketRequest 发送WebSocket请求并返回sn字段的值
+//func SendWebsocketRequest(serverURL, path string, request Request) (string, error) {
+//	// 构建WebSocket连接URL
+//	u := url.URL{Scheme: "ws", Host: serverURL, Path: path}
+//
+//	// 创建一个Dialer实例,用于建立WebSocket连接
+//	dialer := websocket.Dialer{
+//		ReadBufferSize:  1024,
+//		WriteBufferSize: 1024,
+//		// 可选:设置超时等
+//		HandshakeTimeout: 5 * time.Second,
+//	}
+//
+//	// 建立WebSocket连接
+//	conn, _, err := dialer.Dial(u.String(), nil)
+//	if err != nil {
+//		return "", fmt.Errorf("dial: %w", err)
+//	}
+//	defer conn.Close()
+//
+//	// 将请求JSON编码为字节
+//	requestJSON, err := json.Marshal(request)
+//	if err != nil {
+//		return "", fmt.Errorf("marshal request: %w", err)
+//	}
+//
+//	// 发送WebSocket消息
+//	err = conn.WriteMessage(websocket.TextMessage, requestJSON)
+//	if err != nil {
+//		return "", fmt.Errorf("write: %w", err)
+//	}
+//
+//	// 读取WebSocket响应
+//	_, responseBytes, err := conn.ReadMessage()
+//	if err != nil {
+//		return "", fmt.Errorf("read: %w", err)
+//	}
+//
+//	// 将响应字节解码为JSON
+//	var response Response
+//	err = json.Unmarshal(responseBytes, &response)
+//	if err != nil {
+//		return "", fmt.Errorf("unmarshal response: %w", err)
+//	}
+//
+//	// 返回sn字段的值
+//	return response.Results["sn"], nil
+//}

+ 21 - 0
aarch64/pjibot_clean/common/config/c_killrpcserver.go

@@ -0,0 +1,21 @@
+package config
+
+import (
+	"cicv-data-closedloop/common/config/c_log"
+	"net"
+	"os"
+)
+
+var KillSignalListener net.Listener
+
+func InitKillSignalListener(serverIp string) {
+	var err error
+	c_log.GlobalLogger.Info("初始化RPC端口监听Kill信号 - 开始。")
+	socket := serverIp + ":" + CloudConfig.RpcPort
+	KillSignalListener, err = net.Listen("tcp", socket)
+	if err != nil {
+		c_log.GlobalLogger.Error("监听rpc端口失败:", err)
+		os.Exit(-1)
+	}
+	c_log.GlobalLogger.Info("初始化RPC端口监听Kill信号 - 成功:", socket)
+}

+ 62 - 0
aarch64/pjibot_clean/common/config/c_local.go

@@ -0,0 +1,62 @@
+package config
+
+import (
+	"cicv-data-closedloop/common/config/c_log"
+	"gopkg.in/yaml.v2"
+	"os"
+)
+
+type node struct {
+	Name string `yaml:"name"`
+	Ip   string `yaml:"ip"`
+}
+
+type restartCmd struct {
+	Dir  string   `yaml:"dir"`
+	Name string   `yaml:"name"`
+	Args []string `yaml:"args"`
+}
+
+type localConfig struct {
+	Node                 node       `yaml:"node"`                    // 节点信息
+	RosparamPath         string     `yaml:"rosparam-path"`           // 获取oss配置的url
+	UrlGetOssConfig      string     `yaml:"url-get-oss-config"`      // 获取oss配置的url
+	OssBasePrefix        string     `yaml:"oss-base-prefix"`         // 云端配置文件的位置
+	CloudConfigFilename  string     `yaml:"cloud-config-filename"`   // 云端配置文件名称
+	CloudConfigLocalPath string     `yaml:"cloud-config-local-path"` // 将 oss 的配置文件下载到本地的位置
+	LocalWebsocketPort   string     `yaml:"local-websocket-port"`    // websocket端口号
+	RestartCmd           restartCmd `yaml:"restart-cmd"`             // 重启命令
+	EquipmentNo          string     // 当前设备的编号
+	SecretKey            string     // 当前设备的密钥
+}
+
+var (
+	LocalConfig localConfig
+)
+
+func InitLocalConfig(localConfigPath string) {
+	c_log.GlobalLogger.Info("初始化本地配置文件 - 开始:", localConfigPath)
+	// 读取YAML文件内容
+	content, err := os.ReadFile(localConfigPath)
+	if err != nil {
+		c_log.GlobalLogger.Error("读取本地配置文件失败。", err)
+		os.Exit(-1)
+	}
+
+	// 解析YAML内容
+	err = yaml.Unmarshal(content, &LocalConfig)
+	if err != nil {
+		c_log.GlobalLogger.Error("解析本地配置文件失败。", err)
+		os.Exit(-1)
+	}
+
+	// history20240401:设备密钥需要获取sn码,设备编号同样。######由于执行命令需要环境变量,所以放到 c_cloud.go 中####
+	/*
+		# 例如,数据闭环平台参数
+		equipment-no: pjibot-P1YNYD1M228000127
+		secret-key: P1YNYD1M228000127
+	*/
+
+	c_log.GlobalLogger.Info("初始化本地配置文件 - 成功:", LocalConfig)
+
+}

+ 52 - 0
aarch64/pjibot_clean/common/config/c_oss.go

@@ -0,0 +1,52 @@
+package config
+
+import (
+	"cicv-data-closedloop/common/config/c_log"
+	"cicv-data-closedloop/common/util"
+	"encoding/json"
+	"github.com/aliyun/aliyun-oss-go-sdk/oss"
+	"os"
+	"sync"
+)
+
+type OssConnectInfoStruct struct {
+	Endpoint        string `json:"endpoint"`
+	AccessKeyId     string `json:"accessKeyId"`
+	AccessKeySecret string `json:"accessKeySecret"`
+	BucketName      string `json:"bucketName"`
+}
+
+var (
+	OssClient *oss.Client
+	OssBucket *oss.Bucket
+	OssMutex  sync.Mutex
+)
+
+func InitOssConfig() {
+	c_log.GlobalLogger.Info("初始化OSS客户端对象 - 开始。")
+	// 1 访问 HTTP 服务获取 OSS 配置
+	get, err := util.HttpGet(LocalConfig.UrlGetOssConfig)
+	if err != nil {
+		c_log.GlobalLogger.Error("http获取oss配置时出错:", err)
+		os.Exit(-1)
+	}
+	var ossConnectInfo OssConnectInfoStruct
+	err = json.Unmarshal([]byte(get), &ossConnectInfo)
+	if err != nil {
+		c_log.GlobalLogger.Error("解析json时出错:", err)
+		os.Exit(-1)
+	}
+	c_log.GlobalLogger.Infof("oss 配置信息为:%v", ossConnectInfo)
+
+	OssClient, err = oss.New(ossConnectInfo.Endpoint, ossConnectInfo.AccessKeyId, ossConnectInfo.AccessKeySecret, oss.UseCname(true))
+	if err != nil {
+		c_log.GlobalLogger.Error("无法创建阿里云client:", err)
+		os.Exit(-1)
+	}
+	OssBucket, err = OssClient.Bucket(ossConnectInfo.BucketName)
+	if err != nil {
+		c_log.GlobalLogger.Error("无法创建阿里云bucket:", err)
+		os.Exit(-1)
+	}
+	c_log.GlobalLogger.Info("初始化OSS客户端对象 - 成功。")
+}

+ 212 - 0
aarch64/pjibot_clean/common/config/c_platform.go

@@ -0,0 +1,212 @@
+package config
+
+import (
+	"cicv-data-closedloop/common/config/c_log"
+	"cicv-data-closedloop/common/util"
+	"encoding/json"
+	"strings"
+	"time"
+)
+
+type taskTrigger struct {
+	TriggerId         int    `json:"triggerId"`
+	TriggerName       string `json:"triggerName"`
+	TriggerScriptPath string `json:"triggerScriptPath"`
+	TriggerType       string `json:"triggerType"`
+}
+
+type PlatformConfigStruct struct {
+	TaskConfigId    string        `json:"taskConfigId"`   // 配置ID
+	TaskConfigName  string        `json:"taskConfigName"` // 配置名称
+	DropUploadData  bool          `json:"dropUploadData"` // 更新任务时 true 先上传旧任务 false 删除旧任务
+	TaskMaxTime     int           `json:"taskMaxTime"`
+	TaskBeforeTime  int           `json:"taskBeforeTime"`
+	TaskAfterTime   int           `json:"taskAfterTime"`
+	TaskCachePolicy string        `json:"taskCachePolicy"`
+	EquipmentTopic  string        `json:"equipmentTopic"` // topic序列
+	Lru             []string      `json:"LRU"`
+	TaskTriggers    []taskTrigger `json:"taskTriggers"`
+}
+
+type response struct {
+	Data    PlatformConfigStruct `json:"data"`
+	Success bool                 `json:"success"`
+	Message string               `json:"message"`
+	Code    int                  `json:"code"`
+	NowTime string               `json:"nowTime"`
+}
+
+var (
+	PlatformConfig PlatformConfigStruct
+	RecordTopics   []string
+)
+
+// 初始化数据闭环平台的配置
+func InitPlatformConfig() {
+	var err error
+	c_log.GlobalLogger.Info("获取数据闭环平台配置 - 开始")
+	// 1 如果车辆没有配置任务,则阻塞在这里,不启动任务
+	for {
+		time.Sleep(time.Duration(2) * time.Second)
+		// 判断是否有配置,第一次访问状态应该为:CHANGE(一共三种状态 CHANGE|UNCHANGE|NONE)
+		PlatformConfig, err = getConfig()
+		if err != nil {
+			c_log.GlobalLogger.Error("获取配置status失败:", err)
+			continue
+		}
+		if checkPlatformConfig() {
+			RecordTopics = strings.Split(PlatformConfig.EquipmentTopic, ",")
+			// 去掉首尾空格
+			for i, topic := range RecordTopics {
+				RecordTopics[i] = strings.TrimSpace(topic)
+			}
+			break
+		}
+	}
+	c_log.GlobalLogger.Info("获取数据闭环平台配置 - 成功。")
+}
+
+func CheckPlatformConfigStatus(maxRetryCount int) bool {
+	var err error
+	for i := 0; i < maxRetryCount; i++ {
+		time.Sleep(time.Duration(2) * time.Second)
+		// 判断是否有配置,第一次访问状态应该为:CHANGE(一共三种状态 CHANGE|UNCHANGE|NONE)
+		PlatformConfig, err = getConfig()
+		if err != nil {
+			c_log.GlobalLogger.Error("获取配置status失败:", err)
+			continue
+		}
+		if checkPlatformConfig() {
+			return true
+		}
+	}
+	return false
+}
+
+/*
+	{
+	  "data": {
+	    "accessToken": "YWRmYWRzZmFzZGZhZHNmYWRmYWRm=",
+	    "expireTime": "28800",
+	    "equipmentNo": "robot-001"
+	  },
+	  "success": true,
+	  "message": "ok",
+	  "code": 1,
+	  "nowTime": "2023-12-09 22:41:00"
+	}
+*/
+// 认证接口,获取access_token
+func GetAccessToken() (string, error) {
+	url := &CloudConfig.Platform.UrlDeviceAuth
+	param := &map[string]string{
+		"equipmentNo": LocalConfig.EquipmentNo,
+		"secretKey":   LocalConfig.SecretKey,
+	}
+	respJson, err := util.HttpPostJsonResponseString(
+		*url,
+		*param,
+	)
+	if err != nil {
+		return "", nil
+	}
+	respMap, err := util.JsonStringToMap(respJson)
+	if err != nil {
+		c_log.GlobalLogger.Errorf("解析返回结果【%v】失败,请求地址为【%v】,请求参数为【%v】:%v", respJson, *url, *param, err)
+		return "", nil
+	}
+
+	dataMap, ok := respMap["data"].(map[string]interface{})
+	if !ok {
+		c_log.GlobalLogger.Error("解析返回结果.data", dataMap, "失败:", err)
+		return "", nil
+	}
+	return dataMap["accessToken"].(string), nil
+}
+
+/*
+	{
+	  "data": {
+	    "status": "UNCHANGE"
+	    "taskConfigld": "xxx"
+	  },
+	  "success": true,
+	  "message": "ok",
+	  "code": 1,
+	  "nowTime": "2023-12-09 21:08:49"
+	}
+*/
+//GetStatus 根据taskConfigId获取任务status,如果传入空代表车端没有配置,直接获取新的配置
+func GetStatus(taskConfigId string) (string, error) {
+	token, err := GetAccessToken()
+	if err != nil {
+		return "", err
+	}
+	resp, err := util.HttpGetStringAddHeadersResponseString(
+		CloudConfig.Platform.UrlTaskPoll,
+		map[string]string{
+			"authorization": token,
+		},
+		map[string]string{
+			"equipmentNo":  LocalConfig.EquipmentNo,
+			"taskConfigId": taskConfigId,
+		},
+	)
+
+	if err != nil {
+		c_log.GlobalLogger.Error("访问接口", CloudConfig.Platform.UrlTask, "失败:", err)
+		return "", err
+	}
+	respMap, err := util.JsonStringToMap(resp)
+	if err != nil {
+		c_log.GlobalLogger.Error("解析【返回结果1】", resp, "失败:", err)
+		return "", err
+	}
+	dataMap, ok := respMap["data"].(map[string]interface{})
+	if !ok {
+		c_log.GlobalLogger.Errorf("解析【返回结果.data】的类型不是(map[string]interface{}),【dataMap】=%v", dataMap)
+		return "", err
+	}
+	return dataMap["status"].(string), nil
+}
+
+func getConfig() (PlatformConfigStruct, error) {
+	token, err := GetAccessToken()
+	if err != nil {
+		return PlatformConfigStruct{}, err
+	}
+	// 下载插件和获取配置
+	// 2 访问配置获取接口
+	resp, err := util.HttpGetStringAddHeadersResponseString(
+		CloudConfig.Platform.UrlTask,
+		map[string]string{
+			"authorization": token,
+		},
+		map[string]string{
+			"equipmentNo": LocalConfig.EquipmentNo,
+		},
+	)
+	if err != nil {
+		c_log.GlobalLogger.Error("访问接口", CloudConfig.Platform.UrlTask, "失败:", err)
+		return PlatformConfigStruct{}, err
+	}
+	var result response
+	err = json.Unmarshal([]byte(resp), &result)
+	if err != nil {
+		c_log.GlobalLogger.Error("解析【返回结果】", resp, "失败:", err)
+		return PlatformConfigStruct{}, err
+	}
+	return result.Data, nil
+}
+
+func checkPlatformConfig() bool {
+	if PlatformConfig.TaskConfigId == "" {
+		c_log.GlobalLogger.Error("数据闭环平台没有配置任务。")
+		return false
+	}
+	if PlatformConfig.EquipmentTopic == "" {
+		c_log.GlobalLogger.Error("数据闭环平台没有配置topic序列。")
+		return false
+	}
+	return true
+}

+ 35 - 0
aarch64/pjibot_clean/common/config/c_resource.go

@@ -0,0 +1,35 @@
+package config
+
+import (
+	"cicv-data-closedloop/common/config/c_log"
+	"cicv-data-closedloop/common/util"
+	"encoding/json"
+	"time"
+)
+
+// SendResourceUsage 保存资源占用情况
+func SendResourceUsage() {
+	for {
+		time.Sleep(time.Duration(1) * time.Second)
+		top10Cpu, top10Mem := util.GetTop10CpuAndMem()
+		top10CpuJson, _ := json.MarshalIndent(top10Cpu, "", "    ")
+		top10MemJson, _ := json.MarshalIndent(top10Mem, "", "    ")
+		responseString, err := util.HttpPostJsonWithHeaders(
+			CloudConfig.Monitor.Url,
+			map[string]string{"Authorization": "U9yKpD6kZZDDe4LFKK6myAxBUT1XRrDM"},
+			map[string]string{
+				"totalCpuUsage":    util.ToString(util.GetCpuPercent()),
+				"totalMemoryUsage": util.ToString(util.GetMemoryPercent()),
+				"top10Process":     string(top10CpuJson),
+				"top10Cpu":         string(top10CpuJson),
+				"top10Mem":         string(top10MemJson),
+				"deviceNumber":     LocalConfig.EquipmentNo,
+				"socIp":            LocalConfig.Node.Ip,
+			},
+		)
+		if err != nil {
+			c_log.GlobalLogger.Errorf("发送数据监控信息报错%v,响应信息为:%v", err, responseString)
+		}
+		//c_log.GlobalLogger.Infof("发送数据监控信息成功,响应信息为:%v", responseString)
+	}
+}

+ 39 - 0
aarch64/pjibot_clean/common/config/c_ros.go

@@ -0,0 +1,39 @@
+package config
+
+import (
+	"cicv-data-closedloop/common/config/c_log"
+	"cicv-data-closedloop/common/util"
+	"github.com/bluenviron/goroslib/v2"
+	"time"
+)
+
+var (
+	RosNode    *goroslib.Node
+	RosbagPath string
+	RosbagEnvs []string
+)
+
+func InitRosConfig() {
+	var err error
+	// 1
+	c_log.GlobalLogger.Info("初始化RosNode - 开始")
+	for {
+		time.Sleep(time.Duration(2) * time.Second)
+		if RosNode, err = goroslib.NewNode(goroslib.NodeConf{Name: "node" + util.GetNowTimeCustom(), MasterAddress: CloudConfig.Ros.MasterAddress}); err != nil {
+			c_log.GlobalLogger.Info("初始化RosNode - 进行中:", err)
+			continue
+		}
+		break
+	}
+	c_log.GlobalLogger.Info("初始化RosNode - 成功:", CloudConfig.Ros.MasterAddress)
+	// 2 获取 rosbag 命令路径和环境变量
+	for _, host := range CloudConfig.Hosts {
+		if host.Name == LocalConfig.Node.Name {
+			RosbagPath = host.Rosbag.Path
+			RosbagEnvs = host.Rosbag.Envs
+			break
+		}
+	}
+	c_log.GlobalLogger.Infof("rosbag 命令路径为:%v,环境变量为:%v", RosbagPath, RosbagEnvs)
+
+}

+ 225 - 0
aarch64/pjibot_clean/common/config/c_websocket.go

@@ -0,0 +1,225 @@
+package config
+
+import (
+	"cicv-data-closedloop/common/config/c_log"
+	"encoding/json"
+	"fmt"
+	"github.com/gorilla/websocket"
+	"net/url"
+	"time"
+)
+
+var (
+	WsConn                 *websocket.Conn
+	reconnectionInProgress bool
+)
+
+// Request 结构体定义
+type Request struct {
+	Type      string      `json:"type"`
+	UUID      string      `json:"uuid"`
+	CommandID string      `json:"commandId"`
+	Parameter interface{} `json:"parameter"`
+}
+
+// Request1 结构体定义
+type Request1 struct {
+	Type      string      `json:"type"`
+	CommandID string      `json:"commandId"`
+	Parameter interface{} `json:"parameter"`
+}
+
+// Response 结构体定义
+type Response struct {
+	CommandID string            `json:"commandId"`
+	ErrorCode string            `json:"errorCode"`
+	Results   map[string]string `json:"results"`
+	Status    string            `json:"status"`
+	Time      int64             `json:"time"`
+	Type      string            `json:"type"`
+	UUID      string            `json:"uuid"`
+}
+
+// StatusMessage 状态消息 结构体定义
+type StatusMessage struct {
+	Type  string      `json:"type"`
+	Topic string      `json:"topic"`
+	Time  int64       `json:"time"`
+	Data  interface{} `json:"data"`
+}
+
+func keepAlive() {
+	ticker := time.NewTicker(30 * time.Second)
+	defer ticker.Stop()
+
+	request := Request1{
+		Type:      "request",
+		CommandID: "heart",
+		Parameter: nil,
+	}
+
+	requestJSON, err := json.Marshal(request)
+	if err != nil {
+		//c_log.GlobalLogger.Error("保持websocket连接活跃,解析requestJSON - 失败。", err)
+	}
+
+	for {
+		select {
+		case <-ticker.C:
+			err := WsConn.WriteMessage(websocket.TextMessage, requestJSON)
+			if err != nil {
+				//c_log.GlobalLogger.Error("保持websocket连接活跃,发送心跳请求 - 失败。", err)
+				WsConn.Close()
+				//c_log.GlobalLogger.Info("重试连接websocket...")
+				ConnectWebsocket() // 重新连接
+				continue
+			}
+			//c_log.GlobalLogger.Info("保持websocket连接活跃,发送心跳请求 - 成功。")
+		}
+	}
+}
+
+func SendWebsocketHeartbeat(conn *websocket.Conn, maxRetries int) (bool, error) {
+
+	request := Request1{
+		Type:      "request",
+		CommandID: "heart",
+		Parameter: nil,
+	}
+
+	// 将请求JSON编码为字节
+	requestJSON, err := json.Marshal(request)
+	if err != nil {
+		return false, fmt.Errorf("marshal request: %w", err)
+	}
+
+	// 发送WebSocket消息
+	err = conn.WriteMessage(websocket.TextMessage, requestJSON)
+	if err != nil {
+		return false, fmt.Errorf("write: %w", err)
+	}
+
+	count := 0
+	for {
+		if count > maxRetries {
+			return false, fmt.Errorf("保持websocket连接活跃,读取websocket消息超过最大重试次数。")
+		}
+		time.Sleep(1 * time.Second)
+		_, message, err := conn.ReadMessage()
+		if err != nil {
+			c_log.GlobalLogger.Error("保持websocket连接活跃,读取websocket消息 - 失败 ", err, " 继续读取消息。")
+			return false, err
+			//continue
+		}
+
+		var response Response
+		err = json.Unmarshal(message, &response)
+		c_log.GlobalLogger.Info("response ", response)
+		if err == nil && response.Type == "response" {
+			c_log.GlobalLogger.Info("response1 ", response)
+			return true, err
+		}
+		count++
+	}
+}
+
+func sendRequestAndAwaitResponse(ws *websocket.Conn) ([]byte, error) {
+	request := Request1{
+		Type:      "request",
+		CommandID: "heart",
+		Parameter: nil,
+	}
+
+	requestJSON, err := json.Marshal(request)
+	if err != nil {
+		c_log.GlobalLogger.Error("保持websocket连接活跃,解析requestJSON - 失败。", err)
+		return nil, err
+	}
+
+	err = ws.WriteMessage(websocket.TextMessage, requestJSON)
+	if err != nil {
+		c_log.GlobalLogger.Error("保持websocket连接活跃,发送心跳请求 - 失败。", err)
+		return nil, err
+	}
+	c_log.GlobalLogger.Info("保持websocket连接活跃,发送心跳请求 - 成功。")
+
+	// 使用channel等待响应
+	responseChan := make(chan []byte)
+	go handleMessages(ws, responseChan)
+
+	select {
+	case response := <-responseChan:
+		c_log.GlobalLogger.Error("保持websocket连接活跃,等待心跳响应 - 成功。")
+		return response, nil
+	case <-time.After(60 * time.Second): // 设置超时时间
+		c_log.GlobalLogger.Error("保持websocket连接活跃,等待心跳响应 - 超时。")
+		close(responseChan)
+		return nil, fmt.Errorf("保持websocket连接活跃,等待心跳响应 - 超时。")
+	}
+}
+
+func handleMessages(ws *websocket.Conn, responseChan chan<- []byte) {
+	for {
+		time.Sleep(100 * time.Millisecond)
+		_, message, err := ws.ReadMessage()
+		if err != nil {
+			c_log.GlobalLogger.Error("保持websocket连接活跃,读取websocket消息 - 失败 ", err)
+			return
+		}
+
+		var response Response
+		if err := json.Unmarshal(message, &response); err == nil && response.Type == "response" {
+			responseChan <- message
+			close(responseChan)
+			return
+		}
+	}
+}
+
+func ConnectWebsocket() {
+	for {
+		// 防止重复调用
+		if reconnectionInProgress {
+			return
+		}
+		reconnectionInProgress = true
+		//c_log.GlobalLogger.Info("初始化Websocket连接 - 开始。")
+		serverURL := LocalConfig.Node.Ip + ":" + LocalConfig.LocalWebsocketPort
+		path := "/"
+
+		// 构建WebSocket连接URL
+		u := url.URL{Scheme: "ws", Host: serverURL, Path: path}
+		//c_log.GlobalLogger.Info("URL:", u.String())
+
+		// 创建一个Dialer实例,用于建立WebSocket连接
+		dialer := websocket.Dialer{
+			ReadBufferSize:  1024,
+			WriteBufferSize: 1024,
+			// 可选:设置超时等
+			HandshakeTimeout: 5 * time.Minute,
+		}
+
+		// 建立WebSocket连接
+		coon, _, err := dialer.Dial(u.String(), nil)
+		if err != nil {
+			fmt.Println("err:", err)
+			//c_log.GlobalLogger.Error("初始化Websocket连接 - 失败。")
+			time.Sleep(5 * time.Second)
+			reconnectionInProgress = false
+			//c_log.GlobalLogger.Info("重试连接websocket...")
+			continue
+		}
+
+		WsConn = coon
+		//c_log.GlobalLogger.Info("初始化Websocket连接 - 成功。")
+		// 连接成功,退出循环
+		reconnectionInProgress = false
+		break
+	}
+}
+
+func InitWebsocketConfig() {
+	ConnectWebsocket()
+	// 保持连接活跃
+	go keepAlive()
+}

+ 93 - 0
aarch64/pjibot_clean/common/service/disk_clean.go

@@ -0,0 +1,93 @@
+package service
+
+import (
+	commonConfig "cicv-data-closedloop/aarch64/pjibot_clean/common/config"
+	masterConfig "cicv-data-closedloop/aarch64/pjibot_clean/master/package/config"
+	"cicv-data-closedloop/common/config/c_log"
+	"cicv-data-closedloop/common/domain"
+	"cicv-data-closedloop/common/entity"
+	"cicv-data-closedloop/common/util"
+	"time"
+)
+
+// 如果磁盘占用过高,则删除timeWindow和对应的文件
+func DiskClean() {
+	c_log.GlobalLogger.Info("清理timeWindow,启动!")
+	/*
+		TTL(0, "删除旧数据");
+		STOP(1, "停止缓存");
+		LRU(2, "保留高优先级")
+	*/
+	policyToDescription := map[string]string{
+		"TTL":  "删除旧数据",
+		"STOP": "停止缓存",
+		"LRU":  "保留高优先级",
+	}
+
+	for {
+		time.Sleep(1000 * time.Millisecond)
+		// 1 获取磁盘占用
+		//diskUsed, _ := util.GetDiskUsed(commonConfig.CloudConfig.Disk.Name) // 获取整个磁盘空间
+
+		diskUsed, _ := util.GetDirectoryDiskUsed(commonConfig.CloudConfig.Disk.Path) // 获取指定目录空间
+		if diskUsed > commonConfig.CloudConfig.Disk.Used {
+			policy := commonConfig.PlatformConfig.TaskCachePolicy
+			c_log.GlobalLogger.Errorf("磁盘占用 %v 超过 %v,触发删除规则 %v", diskUsed, commonConfig.CloudConfig.Disk.Used, policyToDescription[policy])
+			// 2 获取策略
+			if policy == "TTL" {
+				// 1 获取时间窗口队列中的第二个
+				if len(entity.TimeWindowConsumerQueue) > 2 {
+					deleteTimeWindow(1)
+				}
+			} else if policy == "STOP" {
+				// 2 获取时间窗口队列中的倒数第一个
+				if len(entity.TimeWindowConsumerQueue) > 2 {
+					deleteTimeWindow(len(entity.TimeWindowConsumerQueue) - 1)
+				}
+			} else if policy == "LRU" {
+				// 3 获取优先级最低的时间窗口
+				if len(entity.TimeWindowConsumerQueue) > 2 {
+					indexToRemove := getIndexToRemoveForLRU()
+					if indexToRemove != -1 {
+						deleteTimeWindow(indexToRemove)
+					}
+				}
+			} else {
+				c_log.GlobalLogger.Error("未知的缓存策略:", policy)
+			}
+
+		}
+	}
+}
+
+func deleteTimeWindow(indexToRemove int) {
+	timeWindowToRemove := entity.TimeWindowConsumerQueue[indexToRemove]
+	// 1 删除队列中的窗口。使用切片的特性删除指定位置的元素
+	entity.TimeWindowConsumerQueueMutex.Lock()
+	entity.TimeWindowConsumerQueue = append(entity.TimeWindowConsumerQueue[:indexToRemove], entity.TimeWindowConsumerQueue[indexToRemove+1:]...)
+	entity.TimeWindowConsumerQueueMutex.Unlock()
+	// 2 删除该窗口对应的文件目录。
+	faultTime := timeWindowToRemove.FaultTime
+	dir := domain.GetCopyDir(commonConfig.CloudConfig.BagCopyDir, faultTime)
+	err := util.RemoveDir(dir)
+	if err != nil {
+		c_log.GlobalLogger.Error("删除目录", dir, "失败:", err)
+	}
+}
+
+func getIndexToRemoveForLRU() int {
+	lru := commonConfig.PlatformConfig.Lru
+	i := len(lru) - 1
+	for i >= 0 {
+		for i2, window := range entity.TimeWindowConsumerQueue {
+			for _, label := range window.Labels {
+				value, _ := masterConfig.LabelMapTriggerId.Load(label)
+				if value == lru[i] {
+					return i2
+				}
+			}
+		}
+	}
+	return -1
+
+}

+ 118 - 0
aarch64/pjibot_clean/common/service/kill_self.go

@@ -0,0 +1,118 @@
+package service
+
+import (
+	commonConfig "cicv-data-closedloop/aarch64/pjibot_clean/common/config"
+	"cicv-data-closedloop/common/config/c_log"
+	"cicv-data-closedloop/common/util"
+	"net/rpc"
+	"os"
+	"sync"
+	"time"
+)
+
+var (
+	ChannelKillRosRecord  = make(chan int)
+	ChannelKillDiskClean  = make(chan int)
+	ChannelKillSubscriber = make(chan int)
+	ChannelKillMove       = make(chan int)
+	ChannelKillConsume    = make(chan int)
+
+	KillChannel = 5
+	KillTimes   = 0
+	MutexKill   sync.Mutex
+)
+
+// 停止信号,主从节点接收到数据后准备重启
+type KillSignal struct {
+	NodeName       string
+	DropUploadData bool
+	Restart        bool
+}
+
+// 定义要远程调用的类型和方法
+type KillService struct{}
+
+// 杀死自身程序,通过通道实现 方法必须满足RPC规范:函数有两个参数,第一个参数是请求,第二个是响应
+func (m *KillService) Kill(args KillSignal, reply *int) error {
+	c_log.GlobalLogger.Info("接收到自杀信号:", args)
+	// 1 杀死 rosbag record 命令
+	ChannelKillRosRecord <- 1
+	// 2 杀死所有 ros 订阅者
+	ChannelKillSubscriber <- 1
+	// 3 杀死上传任任务
+	if args.DropUploadData == true {
+		// 3-1 等待上传结束再杀死
+		ChannelKillMove <- 1
+		ChannelKillConsume <- 1
+	} else {
+		// 3-2 直接杀死
+		ChannelKillMove <- 2
+		ChannelKillConsume <- 2
+	}
+	go killDone(args.Restart)
+	return nil
+}
+func WaitKillSelf() {
+	killService := new(KillService)
+	err := rpc.Register(killService)
+	if err != nil {
+		c_log.GlobalLogger.Error("注册rpc服务失败:", err)
+		return
+	}
+
+	// 等待并处理远程调用请求
+	for {
+		conn, err := commonConfig.KillSignalListener.Accept()
+		if err != nil {
+			continue
+		}
+		go rpc.ServeConn(conn)
+	}
+}
+
+func AddKillTimes(info string) {
+	MutexKill.Lock()
+	defer MutexKill.Unlock()
+	switch info {
+	case "1":
+		ChannelKillDiskClean <- 1
+		close(ChannelKillRosRecord)
+		KillTimes++
+		c_log.GlobalLogger.Infof("已杀死 record 打包 goroutine,当前自杀进度 %v / %v", KillTimes, KillChannel)
+	case "2":
+		close(ChannelKillDiskClean)
+		KillTimes++
+		c_log.GlobalLogger.Infof("已杀死 bag 包数量维护 goroutine,当前自杀进度 %v / %v", KillTimes, KillChannel)
+	case "3":
+		close(ChannelKillSubscriber)
+		KillTimes++
+		c_log.GlobalLogger.Infof("已杀死 rosnode 和ros 订阅者 goroutine,当前自杀进度 %v / %v", KillTimes, KillChannel)
+	case "4":
+		close(ChannelKillMove)
+		KillTimes++
+		c_log.GlobalLogger.Infof("已杀死 bag 包移动 goroutine,当前自杀进度 %v / %v", KillTimes, KillChannel)
+	case "5":
+		close(ChannelKillConsume)
+		KillTimes++
+		c_log.GlobalLogger.Infof("已杀死 bag 包消费 goroutine,当前自杀进度 %v / %v", KillTimes, KillChannel)
+	}
+}
+
+func killDone(restart bool) {
+	for {
+		time.Sleep(time.Duration(1) * time.Second)
+		if KillChannel == KillTimes {
+			if restart {
+				_, err := util.ExecuteWithPath(commonConfig.LocalConfig.RestartCmd.Dir, commonConfig.LocalConfig.RestartCmd.Name, commonConfig.LocalConfig.RestartCmd.Args...)
+				if err != nil {
+					c_log.GlobalLogger.Info("启动新程序失败,【path】=", commonConfig.LocalConfig.RestartCmd.Dir, "【cmd】=", commonConfig.LocalConfig.RestartCmd.Name, commonConfig.LocalConfig.RestartCmd.Args, ":", err)
+					os.Exit(-1)
+				}
+				c_log.GlobalLogger.Info("数据采集任务更新,正常退出当前程序。")
+			} else {
+				c_log.GlobalLogger.Info("数据采集任务终止,正常退出当前程序。")
+			}
+			os.Exit(0)
+		}
+	}
+}

+ 36 - 0
aarch64/pjibot_clean/common/service/rosbag_clean.go

@@ -0,0 +1,36 @@
+package service
+
+import (
+	"cicv-data-closedloop/aarch64/pjibot_clean/common/config"
+	"cicv-data-closedloop/common/config/c_log"
+	"cicv-data-closedloop/common/util"
+	"time"
+)
+
+// BagCacheClean 保证本地缓存的包数量不超过设定值
+func BagCacheClean() {
+	c_log.GlobalLogger.Info("启动清理缓存的 goroutine 维护目录【", config.CloudConfig.BagDataDir, "】的 bag 包数量:", config.CloudConfig.BagNumber)
+	for {
+		// 收到自杀信号
+		select {
+		case signal := <-ChannelKillDiskClean:
+			if signal == 1 {
+				AddKillTimes("2")
+				return
+			}
+		default:
+		}
+
+		// 1 ------- 每10秒清理一次 -------
+		time.Sleep(time.Duration(10) * time.Second)
+		// 2 ------- 获取目录下所有bag包 -------
+		bags, _ := util.ListAbsolutePathWithSuffixAndSort(config.CloudConfig.BagDataDir, ".bag")
+		// 3 如果打包数量超过n个,删除最旧的包{
+		if len(bags) > config.CloudConfig.BagNumber {
+			diff := len(bags) - config.CloudConfig.BagNumber
+			for i := 0; i < diff; i++ {
+				util.DeleteFile(bags[i])
+			}
+		}
+	}
+}

+ 140 - 0
aarch64/pjibot_clean/common/service/rosbag_record.go

@@ -0,0 +1,140 @@
+package service
+
+import (
+	"cicv-data-closedloop/aarch64/pjibot_clean/common/config"
+	"cicv-data-closedloop/common/config/c_log"
+	"cicv-data-closedloop/common/util"
+	"github.com/bluenviron/goroslib/v2"
+	"os"
+	"os/exec"
+	"time"
+)
+
+// 打包rosbag
+func BagRecord(nodeName string) {
+	var err error
+	c_log.GlobalLogger.Info("rosbag record goroutine - 启动")
+	for {
+	startRecord:
+		c_log.GlobalLogger.Info("校验必需的 rosnode 是否全部启动。")
+		canRecord := false
+		for !canRecord {
+			time.Sleep(time.Duration(2) * time.Second)
+			canRecord = isCanRecord(config.RosNode)
+		}
+		c_log.GlobalLogger.Info("rosnode 启动完成,正在启动 rosbag record 命令。")
+
+		var command []string
+		command = append(command, "record")
+		command = append(command, "--split")
+		command = append(command, "--duration=1")
+		platformTopics := config.RecordTopics
+		for _, host := range config.CloudConfig.Hosts {
+			if host.Name == nodeName {
+				// platformConfig中配置用户想缓存的topic,配置文件中的是默认要采集的(如果平台没有填,则取默认)
+				if platformTopics == nil || len(platformTopics) == 0 {
+					c_log.GlobalLogger.Infof("平台没有配置采集话题【%v】,采集默认话题", platformTopics)
+					for _, topic2 := range host.Topics {
+						command = append(command, topic2)
+					}
+				} else {
+					c_log.GlobalLogger.Infof("平台配置了采集话题【%v】,采集配置话题", platformTopics)
+					for _, topic1 := range config.RecordTopics {
+						command = append(command, topic1)
+					}
+				}
+			}
+		}
+
+		// 2 ------- 调用 rosbag 打包命令,该命令自动阻塞 -------
+		// 不在此处压缩,因为 rosbag filter 时会报错。在上传到oss之前压缩即可。
+		// 包名格式:2023-11-15-17-35-20_0.bag
+		_ = util.CreateParentDir(config.CloudConfig.BagDataDir)
+		var recordProcessPid int
+		var recordSubProcessPid int
+		var cmd *exec.Cmd
+		//systemEnv := os.Environ()
+		//c_log.GlobalLogger.Info("系统环境变量为:", systemEnv)
+	parent:
+		for {
+			c_log.GlobalLogger.Info("record 环境变量为:", config.RosbagEnvs)
+			cmd, err = util.ExecuteWithEnvAndDirAsync(config.RosbagEnvs, config.CloudConfig.BagDataDir, config.RosbagPath, command...)
+			if err != nil {
+				c_log.GlobalLogger.Error("执行record命令", command, "出错:", err)
+				continue
+			}
+			recordProcessPid = cmd.Process.Pid
+		sub:
+			for {
+				time.Sleep(time.Duration(2) * time.Second)
+				process, err := os.FindProcess(recordProcessPid)
+				if process == nil {
+					continue parent
+				}
+				recordSubProcessPid, err = util.GetSubProcessPid(recordProcessPid)
+				if err != nil {
+					c_log.GlobalLogger.Info("正在等待获取进程 ", recordProcessPid, " 的子进程的pid。(未获取到可能由于磁盘空间已满)")
+					continue sub
+				}
+				if recordSubProcessPid != 0 {
+					c_log.GlobalLogger.Info("获取进程 ", recordProcessPid, " 的子进程的pid:", recordSubProcessPid)
+					break parent
+				}
+			}
+		}
+		// 等待进程关闭信号
+		c_log.GlobalLogger.Info("启动record命令成功。等待进程关闭信号。")
+		for {
+			select {
+			case signal := <-ChannelKillRosRecord:
+				if signal == 1 {
+					kill(recordProcessPid, recordSubProcessPid, cmd)
+					AddKillTimes("1")
+					continue // continue 是为了等待重启信号
+				}
+				if signal == 2 {
+					goto startRecord // 收到信号 2 重新 record 命令
+				}
+				if signal == 3 { // 这个关闭是等待数据处理时的关闭
+					c_log.GlobalLogger.Error("采集数据,接收record命令进程关闭信号:", signal)
+					kill(recordProcessPid, recordSubProcessPid, cmd)
+					continue
+				}
+			}
+		}
+	}
+}
+
+func kill(recordProcessPid int, recordSubProcessPid int, cmd *exec.Cmd) {
+	if err := util.KillProcessByPid(recordSubProcessPid); err != nil {
+		c_log.GlobalLogger.Errorf("程序阻塞,杀死record命令子进程出错,【pid】=%v,【err】=%v。", recordSubProcessPid, err)
+		select {} // 此处阻塞防止record命令一直录包占满存储
+	}
+	if err := cmd.Process.Kill(); err != nil {
+		c_log.GlobalLogger.Error("程序阻塞,杀死record命令进程", recordProcessPid, "出错:", err)
+		select {} // 此处阻塞防止record命令一直录包占满存储
+	}
+}
+
+func isCanRecord(n *goroslib.Node) bool {
+	time.Sleep(time.Duration(1) * time.Second)
+	// 获取
+	nodes, err := n.MasterGetNodes()
+	if err != nil {
+		c_log.GlobalLogger.Error("获取rosnode出错:", err)
+		return false
+	}
+	// 创建一个示例的map
+	myMap := nodes
+	// 创建一个切片,包含要检查的元素
+	mySlice := config.CloudConfig.Ros.Nodes
+
+	// 判断map的键是否包含切片中的所有元素
+	for _, element := range mySlice {
+		if _, ok := myMap[element]; !ok {
+			c_log.GlobalLogger.Info("rosnode:", element, " 未启动,需等待启动后才可启动record。")
+			return false
+		}
+	}
+	return true
+}

+ 250 - 0
aarch64/pjibot_clean/common/service/rosbag_upload.go

@@ -0,0 +1,250 @@
+package service
+
+import (
+	commonConfig "cicv-data-closedloop/aarch64/pjibot_clean/common/config"
+	masterConfig "cicv-data-closedloop/aarch64/pjibot_clean/master/package/config"
+	"cicv-data-closedloop/common/config/c_log"
+	"cicv-data-closedloop/common/domain"
+	"cicv-data-closedloop/common/entity"
+	"cicv-data-closedloop/common/util"
+	commonUtil "cicv-data-closedloop/common/util"
+	"encoding/json"
+	"fmt"
+	"os"
+	"path/filepath"
+	"strings"
+	"time"
+)
+
+func RunTimeWindowConsumerQueue(nodeName string) {
+	c_log.GlobalLogger.Info("处理消费者队列goroutine - 启动")
+outLoop:
+	for {
+
+		// 收到自杀信号
+		select {
+		case signal := <-ChannelKillConsume:
+			if signal == 1 {
+				ChannelKillConsume <- 1
+				if len(entity.TimeWindowConsumerQueue) == 0 {
+					AddKillTimes("5")
+					return
+				}
+			} else { //signal == 2
+				AddKillTimes("5")
+				return
+			}
+		default:
+		}
+		// 每一秒扫一次
+		time.Sleep(time.Duration(1) * time.Second)
+
+		waitLength := len(entity.TimeWindowConsumerQueue)
+		if waitLength == 0 {
+			continue outLoop
+		}
+
+		// 1 获取即将处理的窗口
+		currentTimeWindow := entity.TimeWindowConsumerQueue[0]
+		entity.RemoveHeadOfTimeWindowConsumerQueue()
+		c_log.GlobalLogger.Infof("开始处理窗口,【Lable】=%v,【FaultTime】=%v,【Length】=%v", currentTimeWindow.Labels, currentTimeWindow.FaultTime, currentTimeWindow.Length)
+		// 2 获取目录
+		dir := domain.GetCopyDir(commonConfig.CloudConfig.BagCopyDir, currentTimeWindow.FaultTime)
+		bags, _ := util.ListAbsolutePathWithSuffixAndSort(dir, ".bag")
+		bagNumber := len(bags)
+		if bagNumber > currentTimeWindow.Length {
+			bagNumber = currentTimeWindow.Length
+			bags = bags[0:currentTimeWindow.Length]
+		}
+
+		// 3 如果不是全量采集,则使用 filter 命令对 bag 包进行主题过滤。
+		if commonConfig.CloudConfig.FullCollect == false {
+			var filterTopics []string
+			if nodeName == commonConfig.CloudConfig.Hosts[0].Name {
+				filterTopics = currentTimeWindow.MasterTopics
+			} else {
+				filterTopics = currentTimeWindow.SlaveTopics
+			}
+			var topicsFilterSlice []string
+			for _, topic := range filterTopics {
+				topicsFilterSlice = append(topicsFilterSlice, "topic=='"+topic+"'")
+			}
+			for i, bag := range bags {
+				oldName := bag
+				newName := bag + "_filter"
+				filterCommand := []string{"filter", oldName, newName, "\"" + strings.Join(topicsFilterSlice, " or ") + "\""}
+				_, output, err := util.ExecuteWithEnvSync(commonConfig.RosbagEnvs, commonConfig.RosbagPath, filterCommand...)
+				c_log.GlobalLogger.Info("正在过滤中,【FaultTime】=", currentTimeWindow.FaultTime, "【Label】=", currentTimeWindow.Labels, ",进度", i+1, "/", bagNumber, "。")
+				if err != nil {
+					c_log.GlobalLogger.Errorf("filter命令执行出错【命令】=%v,【输出】=%v,【err】=%v", filterCommand, output, err)
+					continue
+				}
+				// 删除旧文件
+				util.DeleteFile(oldName)
+				// 将新文件改回旧文件名
+				if err = os.Rename(newName, oldName); err != nil {
+					c_log.GlobalLogger.Info("修改文件名", oldName, "失败,放弃当前时间窗口", currentTimeWindow.FaultTime, ",错误为:", err)
+					continue outLoop
+				}
+			}
+		}
+
+		// 4 compress包,必须顺序执行,此时每个包会对应生成一个压缩过的包和原始包,原始包后缀为.orig.bag
+		// 5 todo 机器人去掉压缩过程,防止cpu跑满
+		//c_log.GlobalLogger.Info("压缩 bag 数据包,故障时间为:", currentTimeWindow.FaultTime)
+		//for i, bag := range bags {
+		//	oldName := bag
+		//	compressCommand := []string{"compress", "--bz2", oldName}
+		//	c_log.GlobalLogger.Info("正在压缩中,【FaultTime】=", currentTimeWindow.FaultTime, "【Label】=", currentTimeWindow.Labels, ",进度", i+1, "/", bagNumber, "。")
+		//	if _, output, err := util.ExecuteWithEnvSync(commonConfig.RosbagEnvs, commonConfig.RosbagPath, compressCommand...); err != nil {
+		//		c_log.GlobalLogger.Errorf("compress命令执行出错【命令】=%v,【输出】=%v,【err】=%v", compressCommand, output, err)
+		//		continue
+		//	}
+		//}
+		// 5 upload,必须顺序执行
+		c_log.GlobalLogger.Info("发送bag数据包,故障时间为:", currentTimeWindow.FaultTime)
+		start := time.Now()
+		objectKey1 := commonConfig.LocalConfig.OssBasePrefix + commonConfig.LocalConfig.EquipmentNo + "/data/" + currentTimeWindow.FaultTime + "_" + strings.Join(currentTimeWindow.Labels, "_") + "_" + fmt.Sprintf("%d", bagNumber) + "/"
+		objectKey2 := commonConfig.LocalConfig.OssBasePrefix + commonConfig.LocalConfig.EquipmentNo + "/data_merge/" + currentTimeWindow.FaultTime + "_" + strings.Join(currentTimeWindow.Labels, "_") + "_" + fmt.Sprintf("%d", bagNumber) + ".bag"
+		objectKey3 := commonConfig.LocalConfig.OssBasePrefix + commonConfig.LocalConfig.EquipmentNo + "/data_parse/" + currentTimeWindow.FaultTime + "_" + strings.Join(currentTimeWindow.Labels, "_") + "_" + fmt.Sprintf("%d", bagNumber) + "/"
+		for i, bag := range bags {
+			startOne := time.Now()
+			bagSlice := strings.Split(bag, "/")
+			for {
+				commonConfig.OssMutex.Lock()
+				err := commonConfig.OssBucket.PutObjectFromFile(objectKey1+bagSlice[len(bagSlice)-1], bag)
+				commonConfig.OssMutex.Unlock()
+				if err != nil {
+					c_log.GlobalLogger.Info("因网络原因上传包 ", bag, " 时报错,需要等待网络恢复后重新上传:", err)
+					continue
+				}
+				c_log.GlobalLogger.Info("上传耗时 ", time.Since(startOne), ",【FaultTime】=", currentTimeWindow.FaultTime, "【Label】=", currentTimeWindow.Labels, ",进度", i+1, "/", bagNumber, "。【", bag, "】-------【", objectKey1+bagSlice[len(bagSlice)-1], "】")
+				break
+			}
+		}
+		c_log.GlobalLogger.Info("上传完成,花费时间:", time.Since(start))
+		// 在上传完成的包目录同级下添加一个目录同名的json
+		triggerIds := make([]string, 0)
+		for _, label := range currentTimeWindow.Labels {
+			if value, ok := masterConfig.LabelMapTriggerId.Load(label); ok {
+				triggerIds = append(triggerIds, value.(string))
+			}
+		}
+		callBackMap := map[string]interface{}{
+			"dataName":    currentTimeWindow.FaultTime, // 云端callback程序会将该值加8小时,因为UTC和CSV时区相差8小时
+			"dataSize":    "",                          // 由合并程序补充
+			"equipmentNo": commonConfig.LocalConfig.EquipmentNo,
+			"secretKey":   commonConfig.LocalConfig.SecretKey,
+			"rosBagPath":  objectKey2,
+			"filePath":    objectKey3,
+			"taskId":      commonConfig.PlatformConfig.TaskConfigId,
+			"triggerId":   triggerIds,
+		}
+		callBackJson, err := util.MapToJsonString(callBackMap)
+		if err != nil {
+			c_log.GlobalLogger.Error("callBackMap", callBackMap, "转json失败:", err)
+		}
+		commonConfig.OssMutex.Lock()
+		// 上传callback.json
+		err = commonConfig.OssBucket.PutObject(objectKey3+"callback.json", strings.NewReader(callBackJson))
+		if err != nil {
+			c_log.GlobalLogger.Error("上传 callback.json 文件失败:", err)
+		}
+		// 额外采集mapBuf
+		for _, file := range commonConfig.CloudConfig.MapBufFiles {
+			err = commonConfig.OssBucket.PutObjectFromFile(objectKey3+filepath.Base(file), file)
+			if err != nil {
+				c_log.GlobalLogger.Error("上传 mapBuf 文件失败:", err)
+			}
+		}
+
+		// 压缩采集data目录
+		{
+			// 1 如果 data.zip 已存在,先删除
+			util.DeleteFileIfExists(commonConfig.CloudConfig.DataDir.Dest)
+			c_log.GlobalLogger.Infof("旧的data目录压缩包【%v】已删除。", commonConfig.CloudConfig.DataDir.Dest)
+			// 2 重新压缩升成 data.zip
+			err = util.ZipDir(commonConfig.CloudConfig.DataDir.Src, commonConfig.CloudConfig.DataDir.Dest, commonConfig.CloudConfig.DataDir.SrcSub)
+			if err != nil {
+				c_log.GlobalLogger.Error("压缩data目录失败:", err)
+			} else {
+				c_log.GlobalLogger.Infof("压缩data目录【%v】->【%v】成功", commonConfig.CloudConfig.DataDir.Src, commonConfig.CloudConfig.DataDir.Dest)
+				dataZipKey := objectKey3 + "data.zip"
+				err = commonConfig.OssBucket.PutObjectFromFile(dataZipKey, commonConfig.CloudConfig.DataDir.Dest)
+				if err != nil {
+					c_log.GlobalLogger.Error("上传data目录压缩文件失败:", err)
+				} else {
+					c_log.GlobalLogger.Infof("上传data目录压缩包【%v】->【%v】成功", commonConfig.CloudConfig.DataDir.Dest, dataZipKey)
+				}
+			}
+			commonConfig.OssMutex.Unlock()
+		}
+		// todo 不压缩采集data目录
+		{
+			//var filePaths []string                                                                                           // 初始化一个切片来保存文件路径
+			//err = filepath.WalkDir(commonConfig.CloudConfig.DataDir.Src, func(path string, d fs.DirEntry, err error) error { // 使用filepath.WalkDir遍历目录
+			//	if err != nil {
+			//		return err // 如果有错误,返回错误
+			//	}
+			//
+			//	// 检查是否为文件(跳过目录)
+			//	if !d.IsDir() {
+			//		filePaths = append(filePaths, path) // 将文件路径添加到切片中
+			//	}
+			//	return nil
+			//})
+			//if err != nil {
+			//	c_log.GlobalLogger.Error("扫描 data 目录失败:", err)
+			//	goto outLoop
+			//}
+			//
+			//// 不压缩上传所有文件
+			//for _, path := range filePaths {
+			//	if strings.Contains(path, commonConfig.CloudConfig.DataDir.Exclude) {
+			//		continue
+			//	}
+			//	relativePath := strings.Replace(path, commonConfig.CloudConfig.DataDir.Src, "", 1)
+			//	ossKey := objectKey3 + "data/" + relativePath
+			//	err = commonConfig.OssBucket.PutObjectFromFile(ossKey, path)
+			//	if err != nil {
+			//		c_log.GlobalLogger.Errorf("上传 data 目录内文件【%v】->【%v】失败:%v", path, ossKey, err)
+			//		goto outLoop
+			//	}
+			//}
+			//commonConfig.OssMutex.Unlock()
+		}
+
+		// 数据库中采集数量加一
+		collectNumPlus()
+		// 删除本地所有已上传的bag文件
+		c_log.GlobalLogger.Infof("结束处理窗口,【Lable】=%v,【FaultTime】=%v,【Length】=%v", currentTimeWindow.Labels, currentTimeWindow.FaultTime, currentTimeWindow.Length)
+		c_log.GlobalLogger.Infof("待处理窗口个数为:%v", len(entity.TimeWindowConsumerQueue))
+		if err = util.RemoveDir(dir); err != nil {
+			goto outLoop
+		}
+		if len(entity.TimeWindowConsumerQueue) == 0 {
+			c_log.GlobalLogger.Infof("已处理所有窗口,重启 record 命令。")
+			ChannelKillRosRecord <- 2
+			entity.ProcessingFlag = false
+		}
+	}
+}
+
+func collectNumPlus() {
+	responseString, err := commonUtil.HttpPostJsonWithHeaders(
+		commonConfig.CloudConfig.CollectNumPlus.Url,
+		map[string]string{"Authorization": "U9yKpD6kZZDDe4LFKK6myAxBUT1XRrDM"},
+		map[string]string{
+			"snCode": commonConfig.LocalConfig.SecretKey,
+		},
+	)
+	if err != nil {
+		c_log.GlobalLogger.Error("发送http请求修改采集数量失败:", err)
+	}
+	// 解析JSON字符串到Response结构体
+	var resp entity.Response
+	err = json.Unmarshal([]byte(responseString), &resp)
+	if err != nil {
+		c_log.GlobalLogger.Error("解析修改采集数量结果失败:", err)
+	}
+}

+ 6 - 0
aarch64/pjibot_clean/common/variable/application.go

@@ -0,0 +1,6 @@
+package variable
+
+var (
+	LogDir          = "/root/cicv-data-closedloop/log/"
+	LocalConfigPath = "/root/cicv-data-closedloop/config/local-config.yaml"
+)

+ 225 - 0
aarch64/pjibot_clean/control/main.go

@@ -0,0 +1,225 @@
+package main
+
+import (
+	commonConfig "cicv-data-closedloop/aarch64/pjibot_clean/common/config"
+	commonService "cicv-data-closedloop/aarch64/pjibot_clean/common/service"
+	"cicv-data-closedloop/aarch64/pjibot_clean/common/variable"
+	"cicv-data-closedloop/aarch64/pjibot_clean/control/pkg"
+	"cicv-data-closedloop/common/config/c_log"
+	"cicv-data-closedloop/common/entity"
+	"cicv-data-closedloop/common/util"
+	commonUtil "cicv-data-closedloop/common/util"
+	"encoding/json"
+	"fmt"
+	"net/rpc"
+	"os"
+	"runtime"
+	"time"
+)
+
+var (
+	applicationName  = "pji-control"
+	localStatus      = "idle"
+	cloudStatus      = "NONE"
+	lastLocalStatus  = "idle"
+	lastCloudStatus  = "NONE"
+	limitReachedFlag = false
+	localTurnLength  = 1  // s,本地状态刷新时间
+	cloudTurnLength  = 60 // s,云端状态刷新时间
+	renewTurnLength  = 3  // s,续约状态刷新时间
+	waitStopLength   = 1  // min,停止master前等待时间
+	checkLimitLength = 1  // min, 查询是否达到采集限制等待时间
+	launchedFlag     = false
+	renewedFlag      = false
+	renewTimer       *time.Timer // 续约定时器
+	RenewDur         = 5         // min, 续约时间
+	maxRetryCount    = 10        // 查询配置最大重试次数
+)
+
+func init() {
+	runtime.GOMAXPROCS(1)
+	// 初始化日志配置
+	c_log.InitLog(variable.LogDir, applicationName)
+	// 初始化本地配置文件(第1处配置,在本地文件)
+	commonConfig.InitLocalConfig(variable.LocalConfigPath)
+	// 初始化Oss连接信息
+	commonConfig.InitOssConfig()
+	// 初始化业务逻辑配置信息,配置文件在oss上(第2处配置,在oss文件)
+	commonConfig.InitCloudConfig()
+	// 初始化rpc客户端,用于杀死旧的采集程序
+
+	// 初始化websocket配置
+	commonConfig.InitWebsocketConfig()
+}
+
+func checkCollectLimit() {
+	for {
+		time.Sleep(time.Duration(checkLimitLength) * time.Minute)
+		// 如果开启了采集频率限制,则云端判断采集数量是否超过限额
+		if commonConfig.CloudConfig.CollectLimit.Flag == 1 {
+			//c_log.GlobalLogger.Error("当前设备已开启数采频率限制,需判断采集数量是否达到限额。")
+			responseString, err := commonUtil.HttpPostJsonWithHeaders(
+				commonConfig.CloudConfig.CollectLimit.Url,
+				map[string]string{"Authorization": "U9yKpD6kZZDDe4LFKK6myAxBUT1XRrDM"},
+				map[string]string{
+					"snCode":            commonConfig.LocalConfig.SecretKey,
+					"collectLimitDay":   util.ToString(commonConfig.CloudConfig.CollectLimit.Day),
+					"collectLimitWeek":  util.ToString(commonConfig.CloudConfig.CollectLimit.Week),
+					"collectLimitMonth": util.ToString(commonConfig.CloudConfig.CollectLimit.Month),
+					"collectLimitYear":  util.ToString(commonConfig.CloudConfig.CollectLimit.Year),
+				},
+			)
+			if err != nil {
+				c_log.GlobalLogger.Error("发送http请求获取是否允许采集失败:", err)
+				continue
+			}
+			// 解析JSON字符串到Response结构体
+			var resp entity.Response
+			err = json.Unmarshal([]byte(responseString), &resp)
+			if err != nil {
+				c_log.GlobalLogger.Error("解析是否允许采集接口返回结果失败:", err)
+				continue
+			}
+			if resp.Code != 200 { // 不是200 代表采集数量已超过限额不允许采集
+				c_log.GlobalLogger.Info("采集数量已超过限额,", resp.Code)
+				limitReachedFlag = true
+				continue
+			}
+		}
+		limitReachedFlag = false
+	}
+}
+
+func initRenew() {
+	c_log.GlobalLogger.Info("启动定时器 - 开始。")
+	if renewTimer != nil {
+		renewTimer.Stop()
+	}
+	renewedFlag = true
+	renewTimer = time.AfterFunc(time.Duration(RenewDur)*time.Minute, func() {
+		renewedFlag = false
+	})
+	c_log.GlobalLogger.Infof("定时时间【%v】分钟 - 成功。", RenewDur)
+}
+
+func renew() {
+	for {
+		time.Sleep(time.Duration(renewTurnLength) * time.Second)
+		if localStatus == "running" && launchedFlag && !renewedFlag && !limitReachedFlag { // 设备处于运行状态,数采程序已启动,且尚未续约
+			c_log.GlobalLogger.Info("设备仍处于运行状态,续约 - 开始。")
+			if renewTimer != nil {
+				renewTimer.Stop()
+			}
+			renewedFlag = true
+			renewTimer = time.AfterFunc(time.Duration(RenewDur)*time.Minute, func() {
+				renewedFlag = false
+			})
+			c_log.GlobalLogger.Infof("续约时间【%v】分钟 - 成功。", RenewDur)
+		}
+	}
+}
+
+func startMasterNode() {
+	c_log.GlobalLogger.Info("获取数据闭环平台最新配置。")
+
+	if commonConfig.CheckPlatformConfigStatus(maxRetryCount) {
+		c_log.GlobalLogger.Info("查询到数据闭环平台有配置任务。")
+		commonConfig.InitPlatformConfig()
+
+		if _, err := util.ExecuteWithPath(commonConfig.LocalConfig.RestartCmd.Dir, commonConfig.LocalConfig.RestartCmd.Name, commonConfig.LocalConfig.RestartCmd.Args...); err != nil {
+			c_log.GlobalLogger.Info("启动新程序失败,【path】=", commonConfig.LocalConfig.RestartCmd.Dir, "【cmd】=", commonConfig.LocalConfig.RestartCmd.Name, commonConfig.LocalConfig.RestartCmd.Args, ":", err)
+			os.Exit(-1)
+		}
+		c_log.GlobalLogger.Info("启动任务,本地执行启动命令:【path】=", commonConfig.LocalConfig.RestartCmd.Dir, "【cmd】=", commonConfig.LocalConfig.RestartCmd.Name, commonConfig.LocalConfig.RestartCmd.Args)
+
+		initRenew()
+		launchedFlag = true
+
+		c_log.GlobalLogger.Info("数采程序启动 - 成功。")
+	} else {
+		c_log.GlobalLogger.Error("查询到数据闭环平台没有配置任务,不启动数采程序。")
+	}
+
+}
+
+func stopMasterNode() {
+	// 发送rpc信号杀死采集程序
+	var killArgs commonService.KillSignal
+	killArgs = commonService.KillSignal{NodeName: "master", DropUploadData: commonConfig.PlatformConfig.DropUploadData, Restart: false}
+	c_log.GlobalLogger.Info("杀死任务,发送rpc结束信号:", killArgs)
+	KillRpcClient, err := rpc.Dial("tcp", commonConfig.LocalConfig.Node.Ip+":"+commonConfig.CloudConfig.RpcPort)
+	if err != nil {
+		// 此处如果连接失败说明采集程序已经停止了
+		lastCloudStatus = "NONE"
+		c_log.GlobalLogger.Error("采集程序已经停止:", err)
+		return
+	}
+
+	reply := 0
+	if err = KillRpcClient.Call("KillService.Kill", killArgs, &reply); err != nil {
+		c_log.GlobalLogger.Error("发送 rpc 请求到 master 报错:", err)
+	}
+
+	c_log.GlobalLogger.Info("结束任务后,将数据闭环平台配置置空。")
+	commonConfig.PlatformConfig = commonConfig.PlatformConfigStruct{}
+	if err = KillRpcClient.Close(); err != nil {
+		// 不做处理
+	}
+
+	launchedFlag = false
+	c_log.GlobalLogger.Info("数采程序关闭 - 成功。")
+}
+
+func main() {
+	// 更新本地任务状态
+	go pkg.GetLocalStatus(&localStatus, &lastLocalStatus, localTurnLength)
+	// 更新云端任务状态
+	go pkg.GetCloudStatus(&cloudStatus, &lastCloudStatus, cloudTurnLength)
+
+	// 定期检查本地任务状态,执行续约,避免短时间内多次启停
+	go renew()
+
+	// 检查是否达到限额
+	go checkCollectLimit()
+
+	// 云端任务状态负责更新配置
+	go pkg.GetCloudConfig(&cloudStatus, &lastCloudStatus, cloudTurnLength)
+
+	for {
+		if launchedFlag { // 当前已启动master节点
+			time.Sleep(time.Duration(cloudTurnLength) * time.Second)
+		} else {
+			time.Sleep(time.Duration(localTurnLength) * time.Second)
+		}
+
+		fmt.Println("localStatus: ", localStatus, "lastLocalStatus: ", lastLocalStatus)
+		fmt.Println("cloudStatus: ", cloudStatus, "lastCloudStatus: ", lastCloudStatus)
+		fmt.Println("limitReachedFlag: ", limitReachedFlag)
+
+		// 综合判断 cloudStatus 和 localStatus
+		// cloudStatus
+		// UN_CHANGE 没有新的任务,无需更改
+		// CHANGE 有新的任务,需要杀死旧的数采任务并重启
+		// NONE 设备没有配置任务,需要杀死旧的数采任务
+		// localStatus
+		// idle 空闲状态,此状态下不启动数采任务
+		// running 繁忙状态,此状态需要启动数采任务
+		// error 错误状态,此状态下不启动数采任务
+
+		// 本地任务状态负责启停master
+		if localStatus == "running" && !launchedFlag && !limitReachedFlag {
+			// 目前未启动数采程序
+			c_log.GlobalLogger.Info("数采程序启动 - 开始。")
+			startMasterNode()
+		} else if localStatus == "idle" || limitReachedFlag {
+			if !renewedFlag && launchedFlag && len(entity.TimeWindowConsumerQueue) == 0 {
+				time.Sleep(time.Duration(waitStopLength) * time.Minute)
+				c_log.GlobalLogger.Info("设备不在运行状态且没有待处理的数据,数采程序关闭 - 开始。")
+				stopMasterNode()
+			}
+		} else if localStatus == "error" {
+			c_log.GlobalLogger.Error("设备运行状态出错,停止数采程序。")
+			stopMasterNode()
+		}
+	}
+}

+ 45 - 0
aarch64/pjibot_clean/control/pkg/judge_cloud.go

@@ -0,0 +1,45 @@
+package pkg
+
+import (
+	commonConfig "cicv-data-closedloop/aarch64/pjibot_clean/common/config"
+	"cicv-data-closedloop/common/config/c_log"
+	"time"
+)
+
+var (
+	maxRetryCount = 10
+)
+
+// UN_CHANGE 没有新的任务
+// CHANGE 有新的任务
+// NONE 设备没有配置任务
+func GetCloudStatus(cloudStatus *string, lastCloudStatus *string, turnLength int) {
+	// 轮询云端任务状态
+	for {
+		time.Sleep(time.Duration(turnLength) * time.Second)
+
+		*lastCloudStatus = *cloudStatus
+		taskStatus, err := commonConfig.GetStatus(commonConfig.PlatformConfig.TaskConfigId)
+		if err != nil {
+			c_log.GlobalLogger.Error("获取云端配置status失败:", err)
+			continue
+		}
+		if taskStatus == "" || taskStatus == " " {
+			taskStatus = "NONE"
+		}
+		*cloudStatus = taskStatus
+	}
+}
+
+func GetCloudConfig(cloudStatus *string, lastCloudStatus *string, turnLength int) {
+	for {
+		time.Sleep(time.Duration(turnLength) * time.Second)
+		if *cloudStatus == "CHANGE" {
+			c_log.GlobalLogger.Error("cloudStatus:", *cloudStatus)
+			if commonConfig.CheckPlatformConfigStatus(maxRetryCount) {
+				c_log.GlobalLogger.Info("查询到数据闭环平台有配置任务。")
+				commonConfig.InitPlatformConfig()
+			}
+		}
+	}
+}

+ 44 - 0
aarch64/pjibot_clean/control/pkg/judge_local.go

@@ -0,0 +1,44 @@
+package pkg
+
+import (
+	"cicv-data-closedloop/aarch64/pjibot_clean/common/config"
+	"encoding/json"
+	"fmt"
+	"log"
+	"time"
+)
+
+// idle 空闲状态,此状态下机器人可进行任务下发
+// running 繁忙状态,此状态机器人不接受新任务
+// error 错误状态(硬件,不能正常工作的)
+func GetLocalStatus(localStatus *string, lastLocalStatus *string, turnLength int) {
+	defer config.WsConn.Close()
+	// 轮询本地任务状态
+	for {
+		time.Sleep(time.Duration(turnLength) * time.Second)
+
+		*lastLocalStatus = *localStatus
+		_, msg, err := config.WsConn.ReadMessage()
+		if err != nil {
+			log.Println("Error in receive:", err)
+			continue
+		}
+		//log.Printf("Received: %s\n", msg)
+
+		// 将响应字节解码为JSON
+		var statusMessage config.StatusMessage
+		err = json.Unmarshal(msg, &statusMessage)
+		if err != nil {
+			log.Println("Error in json:", err)
+			continue
+		}
+
+		if statusMessage.Type == "push" && statusMessage.Topic == "robotStatus" {
+			//fmt.Println("statusMessage:", statusMessage)
+			data := statusMessage.Data.(map[string]interface{})
+			//fmt.Println("statusMessage.Data", data)
+			fmt.Println("statusMessage.Data[\"status\"]", data["status"])
+			*localStatus = data["status"].(string)
+		}
+	}
+}

+ 62 - 0
aarch64/pjibot_clean/master/main.go

@@ -0,0 +1,62 @@
+package main
+
+import (
+	commonConfig "cicv-data-closedloop/aarch64/pjibot_clean/common/config"
+	commonService "cicv-data-closedloop/aarch64/pjibot_clean/common/service"
+	"cicv-data-closedloop/aarch64/pjibot_clean/common/variable"
+	masterConfig "cicv-data-closedloop/aarch64/pjibot_clean/master/package/config"
+	masterService "cicv-data-closedloop/aarch64/pjibot_clean/master/package/service"
+	"cicv-data-closedloop/common/config/c_log"
+	"cicv-data-closedloop/common/util"
+	"runtime"
+	"time"
+)
+
+var applicationName = "pji-master"
+
+func init() {
+	runtime.GOMAXPROCS(1)
+	// 初始化日志配置
+	c_log.InitLog(variable.LogDir, applicationName)
+	// 初始化本地配置文件(第1处配置,在本地文件)
+	commonConfig.InitLocalConfig(variable.LocalConfigPath)
+	// 初始化Oss连接信息
+	commonConfig.InitOssConfig()
+	// 初始化业务逻辑配置信息,配置文件在oss上(第2处配置,在oss文件)
+	commonConfig.InitCloudConfig()
+	_ = util.RemoveSubFiles(commonConfig.CloudConfig.BagDataDir)
+	_ = util.RemoveSubFiles(commonConfig.CloudConfig.BagCopyDir)
+	go commonConfig.RefreshCloudConfig()
+	// 初始化数据闭环平台的配置(第3处配置,在数据闭环平台接口)
+	commonConfig.InitPlatformConfig()
+	// 初始化ros节点
+	commonConfig.InitRosConfig()
+	// 发送资源占用信息
+	go commonConfig.SendResourceUsage()
+	// 维护data目录缓存的包数量
+	go commonService.BagCacheClean()
+	// 磁盘占用过高时根据缓存策略处理copy目录
+	go commonService.DiskClean()
+	masterConfig.InitTriggerConfig()
+	commonConfig.InitKillSignalListener(commonConfig.CloudConfig.Hosts[0].Ip)
+	// 等待重启,接收到重启信号,会把信号分发给以下channel
+	go commonService.WaitKillSelf()
+	// 先采集地图bag包
+	masterService.CollectOneMsg()
+}
+
+func main() {
+
+	// 1 负责打包数据到data目录
+	go commonService.BagRecord(commonConfig.CloudConfig.Hosts[0].Name)
+	time.Sleep(time.Duration(10) * time.Second)
+	// 2 负责监控故障,并修改timeWindow
+	go masterService.PrepareTimeWindowProducerQueue()
+	// 3 将时间窗口内的包全部move出去,并等待当前时间窗口结束触发上传
+	go masterService.RunTimeWindowProducerQueue()
+	// 4 排队运行时间窗口
+	go commonService.RunTimeWindowConsumerQueue(commonConfig.CloudConfig.Hosts[0].Name)
+
+	// 阻塞主线程,等待其他线程执行。
+	select {}
+}

+ 2354 - 0
aarch64/pjibot_clean/master/package/config/bak.txt

@@ -0,0 +1,2354 @@
+func InitTriggerConfig() {
+	config.OssMutex.Lock()
+	defer config.OssMutex.Unlock()
+	triggerLocalPathsMapTriggerId := make(map[string]string)
+	c_log.GlobalLogger.Info("主节点加载触发器插件 - 开始。")
+	// 1 获取数采任务的触发器列表
+	cloudTriggers := &config.PlatformConfig.TaskTriggers
+	// 2 获取本地触发器列表(触发器目录的一级子目录为【触发器ID_触发器Label】)
+	localTriggerIds := util.GetFirstLevelSubdirectories(config.CloudConfig.TriggersDir)
+	// 3 对比触发器列表,本地没有的则下载
+	for _, trigger := range *cloudTriggers {
+		id := util.ToString(trigger.TriggerId)
+		hasIdDir := slices.Contains(localTriggerIds, id) // 改成了 slices 工具库
+		triggerLocalDir := config.CloudConfig.TriggersDir + id + "/"
+		hasLabelSo, soPaths := util.CheckSoFilesInDirectory(triggerLocalDir)
+		var triggerLocalPath string
+		if hasIdDir && hasLabelSo { // 已存在的触发器需要判断是否大小一致
+			triggerLocalPath = soPaths[0]
+			ossSize, _ := util.GetOSSFileSize(config.OssBucket, trigger.TriggerScriptPath)
+			localSize, _ := util.GetFileSize(triggerLocalPath)
+			if ossSize == localSize {
+				c_log.GlobalLogger.Info("触发器插件 ", triggerLocalPath, " 存在且与云端触发器大小一致。")
+				triggerLocalPathsMapTriggerId[triggerLocalPath] = id
+				continue
+			}
+		}
+		label := util.GetFileNameWithoutExtension(config.CloudConfig.TriggersDir + trigger.TriggerScriptPath)
+		triggerLocalPath = config.CloudConfig.TriggersDir + id + "/" + label + ".so"
+		c_log.GlobalLogger.Info("开始下载触发器插件从 ", trigger.TriggerScriptPath, " 到 ", triggerLocalPath)
+		_ = util.CreateParentDir(triggerLocalPath)
+		for {
+			if err := config.OssBucket.GetObjectToFile(trigger.TriggerScriptPath, triggerLocalPath); err != nil {
+				c_log.GlobalLogger.Error("下载触发器插件失败,再次尝试:", err)
+				continue
+			}
+			break
+		}
+		triggerLocalPathsMapTriggerId[triggerLocalPath] = id
+	}
+
+	success := 0
+	// 加载所有触发器的文件
+	for triggerLocalPath, triggerId := range triggerLocalPathsMapTriggerId {
+		// 载入插件到数组
+		open, err := plugin.Open(triggerLocalPath)
+		if err != nil {
+			c_log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "失败。", err)
+			continue
+		}
+		topic0, err := open.Lookup("Topic")
+		if err != nil {
+			c_log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "中的Topic方法失败。", err)
+			continue
+		}
+		topic1, ok := topic0.(func() string)
+		if ok != true {
+			c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func() string):", err)
+			continue
+		}
+		topic2 := topic1()
+		rule, err := open.Lookup("Rule")
+		if err != nil {
+			c_log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "中的Rule方法失败。", err)
+			continue
+		}
+
+		if Topic1 == topic2 { // 1
+			if f, ok1 := rule.(func(data *std_msgs.Int16MultiArray) string); ok1 {
+				Rule1 = append(Rule1, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic2 == topic2 { // 2
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseStamped) string); ok1 {
+				Rule2 = append(Rule2, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic3 == topic2 { // 3
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule3 = append(Rule3, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic4 == topic2 { // 4
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule4 = append(Rule4, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic5 == topic2 { // 5
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule5 = append(Rule5, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic6 == topic2 { // 6
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseWithCovarianceStamped) string); ok1 {
+				Rule6 = append(Rule6, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic7 == topic2 { // 7
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule7 = append(Rule7, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic8 == topic2 { // 8
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule8 = append(Rule8, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic9 == topic2 { // 9
+			if f, ok1 := rule.(func(data *std_msgs.Bool) string); ok1 {
+				Rule9 = append(Rule9, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic10 == topic2 { // 10
+			if f, ok1 := rule.(func(data *std_msgs.Int8) string); ok1 {
+				Rule10 = append(Rule10, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic11 == topic2 { // 11
+			if f, ok1 := rule.(func(data *std_msgs.Int8) string); ok1 {
+				Rule11 = append(Rule11, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic12 == topic2 { // 12
+			if f, ok1 := rule.(func(data *sensor_msgs.PointCloud2) string); ok1 {
+				Rule12 = append(Rule12, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic13 == topic2 { // 13
+			if f, ok1 := rule.(func(data *sensor_msgs.BatteryState) string); ok1 {
+				Rule13 = append(Rule13, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic14 == topic2 { // 14
+			if f, ok1 := rule.(func(data *std_msgs.Int16) string); ok1 {
+				Rule14 = append(Rule14, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic15 == topic2 { // 15
+			if f, ok1 := rule.(func(data *visualization_msgs.Marker) string); ok1 {
+				Rule15 = append(Rule15, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic16 == topic2 { // 16
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule16 = append(Rule16, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic17 == topic2 { // 17
+			if f, ok1 := rule.(func(data *sensor_msgs.CameraInfo) string); ok1 {
+				Rule17 = append(Rule17, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic18 == topic2 { // 18
+			if f, ok1 := rule.(func(data *sensor_msgs.Image) string); ok1 {
+				Rule18 = append(Rule18, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic19 == topic2 { // 19
+			if f, ok1 := rule.(func(data *sensor_msgs.CompressedImage) string); ok1 {
+				Rule19 = append(Rule19, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic20 == topic2 { // 20
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule20 = append(Rule20, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic21 == topic2 { // 21
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule21 = append(Rule21, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic22 == topic2 { // 22
+			if f, ok1 := rule.(func(data *sensor_msgs.CompressedImage) string); ok1 {
+				Rule22 = append(Rule22, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic23 == topic2 { // 23
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule23 = append(Rule23, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic24 == topic2 { // 24
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule24 = append(Rule24, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic25 == topic2 { // 25
+			if f, ok1 := rule.(func(data *theora_image_transport.Packet) string); ok1 {
+				Rule25 = append(Rule25, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic26 == topic2 { // 26
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule26 = append(Rule26, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic27 == topic2 { // 27
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule27 = append(Rule27, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic28 == topic2 { // 28
+			if f, ok1 := rule.(func(data *sensor_msgs.PointCloud2) string); ok1 {
+				Rule28 = append(Rule28, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic29 == topic2 { // 29
+			if f, ok1 := rule.(func(data *sensor_msgs.CameraInfo) string); ok1 {
+				Rule29 = append(Rule29, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic30 == topic2 { // 30
+			if f, ok1 := rule.(func(data *sensor_msgs.Image) string); ok1 {
+				Rule30 = append(Rule30, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic31 == topic2 { // 31
+			if f, ok1 := rule.(func(data *sensor_msgs.CompressedImage) string); ok1 {
+				Rule31 = append(Rule31, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic32 == topic2 { // 32
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule32 = append(Rule32, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic33 == topic2 { // 33
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule33 = append(Rule33, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic34 == topic2 { // 34
+			if f, ok1 := rule.(func(data *sensor_msgs.CompressedImage) string); ok1 {
+				Rule34 = append(Rule34, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic35 == topic2 { // 35
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule35 = append(Rule35, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic36 == topic2 { // 36
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule36 = append(Rule36, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic37 == topic2 { // 37
+			if f, ok1 := rule.(func(data *theora_image_transport.Packet) string); ok1 {
+				Rule37 = append(Rule37, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic38 == topic2 { // 38
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule38 = append(Rule38, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic39 == topic2 { // 39
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule39 = append(Rule39, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic40 == topic2 { // 40
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseStamped) string); ok1 {
+				Rule40 = append(Rule40, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic41 == topic2 { // 41
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseStamped) string); ok1 {
+				Rule41 = append(Rule41, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic42 == topic2 { // 42
+			if f, ok1 := rule.(func(data *nav_msgs.Path) string); ok1 {
+				Rule42 = append(Rule42, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic43 == topic2 { // 43
+			if f, ok1 := rule.(func(data *std_msgs.Int8) string); ok1 {
+				Rule43 = append(Rule43, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic44 == topic2 { // 44
+			if f, ok1 := rule.(func(data *std_msgs.Bool) string); ok1 {
+				Rule44 = append(Rule44, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic45 == topic2 { // 45
+			if f, ok1 := rule.(func(data *nav_msgs.Path) string); ok1 {
+				Rule45 = append(Rule45, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic46 == topic2 { // 46
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseStamped) string); ok1 {
+				Rule46 = append(Rule46, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic47 == topic2 { // 47
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseStamped) string); ok1 {
+				Rule47 = append(Rule47, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic48 == topic2 { // 48
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseStamped) string); ok1 {
+				Rule48 = append(Rule48, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic49 == topic2 { // 49
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule49 = append(Rule49, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic50 == topic2 { // 50
+			if f, ok1 := rule.(func(data *visualization_msgs.MarkerArray) string); ok1 {
+				Rule50 = append(Rule50, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic51 == topic2 { // 51
+			if f, ok1 := rule.(func(data *geometry_msgs.PolygonStamped) string); ok1 {
+				Rule51 = append(Rule51, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic52 == topic2 { // 52
+			if f, ok1 := rule.(func(data *nav_msgs.OccupancyGrid) string); ok1 {
+				Rule52 = append(Rule52, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic53 == topic2 { // 53
+			if f, ok1 := rule.(func(data *nav_msgs.OccupancyGrid) string); ok1 {
+				Rule53 = append(Rule53, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic54 == topic2 { // 54
+			if f, ok1 := rule.(func(data *nav_msgs.OccupancyGrid) string); ok1 {
+				Rule54 = append(Rule54, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic55 == topic2 { // 55
+			if f, ok1 := rule.(func(data *std_msgs.Float32) string); ok1 {
+				Rule55 = append(Rule55, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic56 == topic2 { // 56
+			if f, ok1 := rule.(func(data *std_msgs.Int32) string); ok1 {
+				Rule56 = append(Rule56, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic57 == topic2 { // 57
+			if f, ok1 := rule.(func(data *nav_msgs.Path) string); ok1 {
+				Rule57 = append(Rule57, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic58 == topic2 { // 58
+			if f, ok1 := rule.(func(data *clean_msg.ErrorInfo) string); ok1 {
+				Rule58 = append(Rule58, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic59 == topic2 { // 59
+			if f, ok1 := rule.(func(data *nav_msgs.OccupancyGrid) string); ok1 {
+				Rule59 = append(Rule59, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic60 == topic2 { // 60
+			if f, ok1 := rule.(func(data *nav_msgs.OccupancyGrid) string); ok1 {
+				Rule60 = append(Rule60, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic61 == topic2 { // 61
+			if f, ok1 := rule.(func(data *nav_msgs.OccupancyGrid) string); ok1 {
+				Rule61 = append(Rule61, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic62 == topic2 { // 62
+			if f, ok1 := rule.(func(data *nav_msgs.OccupancyGrid) string); ok1 {
+				Rule62 = append(Rule62, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic63 == topic2 { // 63
+			if f, ok1 := rule.(func(data *nav_msgs.OccupancyGrid) string); ok1 {
+				Rule63 = append(Rule63, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic64 == topic2 { // 64
+			if f, ok1 := rule.(func(data *nav_msgs.OccupancyGrid) string); ok1 {
+				Rule64 = append(Rule64, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic65 == topic2 { // 65
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule65 = append(Rule65, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic66 == topic2 { // 66
+			if f, ok1 := rule.(func(data *std_msgs.Bool) string); ok1 {
+				Rule66 = append(Rule66, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic67 == topic2 { // 67
+			if f, ok1 := rule.(func(data *std_msgs.Bool) string); ok1 {
+				Rule67 = append(Rule67, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic68 == topic2 { // 68
+			if f, ok1 := rule.(func(data *geometry_msgs.PolygonStamped) string); ok1 {
+				Rule68 = append(Rule68, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic69 == topic2 { // 69
+			if f, ok1 := rule.(func(data *geometry_msgs.PointStamped) string); ok1 {
+				Rule69 = append(Rule69, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic70 == topic2 { // 70
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule70 = append(Rule70, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic71 == topic2 { // 71
+			if f, ok1 := rule.(func(data *geometry_msgs.Twist) string); ok1 {
+				Rule71 = append(Rule71, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic72 == topic2 { // 72
+			if f, ok1 := rule.(func(data *geometry_msgs.Twist) string); ok1 {
+				Rule72 = append(Rule72, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic73 == topic2 { // 73
+			if f, ok1 := rule.(func(data *nav_msgs.Path) string); ok1 {
+				Rule73 = append(Rule73, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic74 == topic2 { // 74
+			if f, ok1 := rule.(func(data *common_msgs.CreateMapInfo) string); ok1 {
+				Rule74 = append(Rule74, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic75 == topic2 { // 75
+			if f, ok1 := rule.(func(data *geometry_msgs.Twist) string); ok1 {
+				Rule75 = append(Rule75, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic76 == topic2 { // 76
+			if f, ok1 := rule.(func(data *common_msgs.SensorStatus) string); ok1 {
+				Rule76 = append(Rule76, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic77 == topic2 { // 77
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseArray) string); ok1 {
+				Rule77 = append(Rule77, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic78 == topic2 { // 78
+			if f, ok1 := rule.(func(data *nav_msgs.Path) string); ok1 {
+				Rule78 = append(Rule78, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic79 == topic2 { // 79
+			if f, ok1 := rule.(func(data *common_msgs.IdentifierObjsInfo) string); ok1 {
+				Rule79 = append(Rule79, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic80 == topic2 { // 80
+			if f, ok1 := rule.(func(data *common_msgs.McuDiagnostic) string); ok1 {
+				Rule80 = append(Rule80, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic81 == topic2 { // 81
+			if f, ok1 := rule.(func(data *diagnostic_msgs.DiagnosticArray) string); ok1 {
+				Rule81 = append(Rule81, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic82 == topic2 { // 82
+			if f, ok1 := rule.(func(data *std_msgs.Int8) string); ok1 {
+				Rule82 = append(Rule82, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic83 == topic2 { // 83
+			if f, ok1 := rule.(func(data *std_msgs.Int16) string); ok1 {
+				Rule83 = append(Rule83, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic84 == topic2 { // 84
+			if f, ok1 := rule.(func(data *geometry_msgs.Vector3Stamped) string); ok1 {
+				Rule84 = append(Rule84, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic85 == topic2 { // 85
+			if f, ok1 := rule.(func(data *sensor_msgs.LaserScan) string); ok1 {
+				Rule85 = append(Rule85, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic86 == topic2 { // 86
+			if f, ok1 := rule.(func(data *sensor_msgs.PointCloud2) string); ok1 {
+				Rule86 = append(Rule86, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic87 == topic2 { // 87
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule87 = append(Rule87, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic88 == topic2 { // 88
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule88 = append(Rule88, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic89 == topic2 { // 89
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule89 = append(Rule89, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic90 == topic2 { // 90
+			if f, ok1 := rule.(func(data *std_msgs.Int32) string); ok1 {
+				Rule90 = append(Rule90, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic91 == topic2 { // 91
+			if f, ok1 := rule.(func(data *common_msgs.TaskInfo) string); ok1 {
+				Rule91 = append(Rule91, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic92 == topic2 { // 92
+			if f, ok1 := rule.(func(data *common_msgs.MapInfo) string); ok1 {
+				Rule92 = append(Rule92, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic93 == topic2 { // 93
+			if f, ok1 := rule.(func(data *nav_msgs.Path) string); ok1 {
+				Rule93 = append(Rule93, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic94 == topic2 { // 94
+			if f, ok1 := rule.(func(data *common_msgs.VideoStream) string); ok1 {
+				Rule94 = append(Rule94, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic95 == topic2 { // 95
+			if f, ok1 := rule.(func(data *sensor_msgs.PointCloud2) string); ok1 {
+				Rule95 = append(Rule95, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic96 == topic2 { // 96
+			if f, ok1 := rule.(func(data *nav_msgs.Path) string); ok1 {
+				Rule96 = append(Rule96, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic97 == topic2 { // 97
+			if f, ok1 := rule.(func(data *sensor_msgs.PointCloud2) string); ok1 {
+				Rule97 = append(Rule97, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic98 == topic2 { // 98
+			if f, ok1 := rule.(func(data *sensor_msgs.PointCloud2) string); ok1 {
+				Rule98 = append(Rule98, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic99 == topic2 { // 99
+			if f, ok1 := rule.(func(data *sensor_msgs.PointCloud2) string); ok1 {
+				Rule99 = append(Rule99, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic100 == topic2 { // 100
+			if f, ok1 := rule.(func(data *geometry_msgs.PointStamped) string); ok1 {
+				Rule100 = append(Rule100, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic101 == topic2 { // 101
+			if f, ok1 := rule.(func(data *nav_msgs.Path) string); ok1 {
+				Rule101 = append(Rule101, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic102 == topic2 { // 102
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseStamped) string); ok1 {
+				Rule102 = append(Rule102, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic103 == topic2 { // 103
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseWithCovarianceStamped) string); ok1 {
+				Rule103 = append(Rule103, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic104 == topic2 { // 104
+			if f, ok1 := rule.(func(data *geometry_msgs.Pose) string); ok1 {
+				Rule104 = append(Rule104, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic105 == topic2 { // 105
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule105 = append(Rule105, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic106 == topic2 { // 106
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule106 = append(Rule106, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic107 == topic2 { // 107
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule107 = append(Rule107, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic108 == topic2 { // 108
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule108 = append(Rule108, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic109 == topic2 { // 109
+			if f, ok1 := rule.(func(data *std_msgs.Float64) string); ok1 {
+				Rule109 = append(Rule109, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic110 == topic2 { // 110
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule110 = append(Rule110, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic111 == topic2 { // 111
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule111 = append(Rule111, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic112 == topic2 { // 112
+			if f, ok1 := rule.(func(data *sensor_msgs.Imu) string); ok1 {
+				Rule112 = append(Rule112, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic113 == topic2 { // 113
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule113 = append(Rule113, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic114 == topic2 { // 114
+			if f, ok1 := rule.(func(data *std_msgs.Int8) string); ok1 {
+				Rule114 = append(Rule114, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic115 == topic2 { // 115
+			if f, ok1 := rule.(func(data *std_msgs.Int16) string); ok1 {
+				Rule115 = append(Rule115, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic116 == topic2 { // 116
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule116 = append(Rule116, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic117 == topic2 { // 117
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule117 = append(Rule117, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic118 == topic2 { // 118
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseWithCovarianceStamped) string); ok1 {
+				Rule118 = append(Rule118, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic119 == topic2 { // 119
+			if f, ok1 := rule.(func(data *sensor_msgs.JointState) string); ok1 {
+				Rule119 = append(Rule119, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic120 == topic2 { // 120
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule120 = append(Rule120, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic121 == topic2 { // 121
+			if f, ok1 := rule.(func(data *cartographer_ros_msgs.LandmarkList) string); ok1 {
+				Rule121 = append(Rule121, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic122 == topic2 { // 122
+			if f, ok1 := rule.(func(data *nav_msgs.Odometry) string); ok1 {
+				Rule122 = append(Rule122, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic123 == topic2 { // 123
+			if f, ok1 := rule.(func(data *sensor_msgs.LaserScan) string); ok1 {
+				Rule123 = append(Rule123, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic124 == topic2 { // 124
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule124 = append(Rule124, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic125 == topic2 { // 125
+			if f, ok1 := rule.(func(data *nav_msgs.Path) string); ok1 {
+				Rule125 = append(Rule125, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic126 == topic2 { // 126
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule126 = append(Rule126, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic127 == topic2 { // 127
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule127 = append(Rule127, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic128 == topic2 { // 128
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule128 = append(Rule128, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic129 == topic2 { // 129
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule129 = append(Rule129, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic130 == topic2 { // 130
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseWithCovarianceStamped) string); ok1 {
+				Rule130 = append(Rule130, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic131 == topic2 { // 131
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule131 = append(Rule131, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic132 == topic2 { // 132
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule132 = append(Rule132, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic133 == topic2 { // 133
+			if f, ok1 := rule.(func(data *common_msgs.LocateInfo) string); ok1 {
+				Rule133 = append(Rule133, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic134 == topic2 { // 134
+			if f, ok1 := rule.(func(data *std_msgs.Bool) string); ok1 {
+				Rule134 = append(Rule134, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic135 == topic2 { // 135
+			if f, ok1 := rule.(func(data *std_msgs.Float64MultiArray) string); ok1 {
+				Rule135 = append(Rule135, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic136 == topic2 { // 136
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule136 = append(Rule136, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic137 == topic2 { // 137
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule137 = append(Rule137, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic138 == topic2 { // 138
+			if f, ok1 := rule.(func(data *nav_msgs.OccupancyGrid) string); ok1 {
+				Rule138 = append(Rule138, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic139 == topic2 { // 139
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule139 = append(Rule139, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic140 == topic2 { // 140
+			if f, ok1 := rule.(func(data *nav_msgs.Path) string); ok1 {
+				Rule140 = append(Rule140, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic141 == topic2 { // 141
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule141 = append(Rule141, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic142 == topic2 { // 142
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule142 = append(Rule142, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic143 == topic2 { // 143
+			if f, ok1 := rule.(func(data *nav_msgs.MapMetaData) string); ok1 {
+				Rule143 = append(Rule143, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic144 == topic2 { // 144
+			if f, ok1 := rule.(func(data *nav_msgs.Path) string); ok1 {
+				Rule144 = append(Rule144, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic145 == topic2 { // 145
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseStamped) string); ok1 {
+				Rule145 = append(Rule145, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic146 == topic2 { // 146
+			if f, ok1 := rule.(func(data *nav_msgs.OccupancyGrid) string); ok1 {
+				Rule146 = append(Rule146, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic147 == topic2 { // 147
+			if f, ok1 := rule.(func(data *nav_msgs.OccupancyGrid) string); ok1 {
+				Rule147 = append(Rule147, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic148 == topic2 { // 148
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule148 = append(Rule148, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic149 == topic2 { // 149
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule149 = append(Rule149, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic150 == topic2 { // 150
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule150 = append(Rule150, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic151 == topic2 { // 151
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule151 = append(Rule151, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic152 == topic2 { // 152
+			if f, ok1 := rule.(func(data *std_msgs.Bool) string); ok1 {
+				Rule152 = append(Rule152, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic153 == topic2 { // 153
+			if f, ok1 := rule.(func(data *sensor_msgs.CameraInfo) string); ok1 {
+				Rule153 = append(Rule153, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic154 == topic2 { // 154
+			if f, ok1 := rule.(func(data *sensor_msgs.Image) string); ok1 {
+				Rule154 = append(Rule154, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic155 == topic2 { // 155
+			if f, ok1 := rule.(func(data *sensor_msgs.CompressedImage) string); ok1 {
+				Rule155 = append(Rule155, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic156 == topic2 { // 156
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule156 = append(Rule156, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic157 == topic2 { // 157
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule157 = append(Rule157, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic158 == topic2 { // 158
+			if f, ok1 := rule.(func(data *sensor_msgs.CompressedImage) string); ok1 {
+				Rule158 = append(Rule158, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic159 == topic2 { // 159
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule159 = append(Rule159, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic160 == topic2 { // 160
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule160 = append(Rule160, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic161 == topic2 { // 161
+			if f, ok1 := rule.(func(data *theora_image_transport.Packet) string); ok1 {
+				Rule161 = append(Rule161, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic162 == topic2 { // 162
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule162 = append(Rule162, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic163 == topic2 { // 163
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule163 = append(Rule163, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic164 == topic2 { // 164
+			if f, ok1 := rule.(func(data *sensor_msgs.CameraInfo) string); ok1 {
+				Rule164 = append(Rule164, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic165 == topic2 { // 165
+			if f, ok1 := rule.(func(data *sensor_msgs.Image) string); ok1 {
+				Rule165 = append(Rule165, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic166 == topic2 { // 166
+			if f, ok1 := rule.(func(data *sensor_msgs.CompressedImage) string); ok1 {
+				Rule166 = append(Rule166, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic167 == topic2 { // 167
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule167 = append(Rule167, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic168 == topic2 { // 168
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule168 = append(Rule168, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic169 == topic2 { // 169
+			if f, ok1 := rule.(func(data *sensor_msgs.CompressedImage) string); ok1 {
+				Rule169 = append(Rule169, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic170 == topic2 { // 170
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule170 = append(Rule170, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic171 == topic2 { // 171
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule171 = append(Rule171, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic172 == topic2 { // 172
+			if f, ok1 := rule.(func(data *theora_image_transport.Packet) string); ok1 {
+				Rule172 = append(Rule172, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic173 == topic2 { // 173
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule173 = append(Rule173, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic174 == topic2 { // 174
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule174 = append(Rule174, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic175 == topic2 { // 175
+			if f, ok1 := rule.(func(data *sensor_msgs.PointCloud2) string); ok1 {
+				Rule175 = append(Rule175, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic176 == topic2 { // 176
+			if f, ok1 := rule.(func(data *sensor_msgs.CameraInfo) string); ok1 {
+				Rule176 = append(Rule176, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic177 == topic2 { // 177
+			if f, ok1 := rule.(func(data *sensor_msgs.Image) string); ok1 {
+				Rule177 = append(Rule177, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic178 == topic2 { // 178
+			if f, ok1 := rule.(func(data *sensor_msgs.CompressedImage) string); ok1 {
+				Rule178 = append(Rule178, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic179 == topic2 { // 179
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule179 = append(Rule179, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic180 == topic2 { // 180
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule180 = append(Rule180, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic181 == topic2 { // 181
+			if f, ok1 := rule.(func(data *sensor_msgs.CompressedImage) string); ok1 {
+				Rule181 = append(Rule181, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic182 == topic2 { // 182
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule182 = append(Rule182, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic183 == topic2 { // 183
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule183 = append(Rule183, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic184 == topic2 { // 184
+			if f, ok1 := rule.(func(data *theora_image_transport.Packet) string); ok1 {
+				Rule184 = append(Rule184, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic185 == topic2 { // 185
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule185 = append(Rule185, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic186 == topic2 { // 186
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule186 = append(Rule186, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic187 == topic2 { // 187
+			if f, ok1 := rule.(func(data *sensor_msgs.CameraInfo) string); ok1 {
+				Rule187 = append(Rule187, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic188 == topic2 { // 188
+			if f, ok1 := rule.(func(data *sensor_msgs.Image) string); ok1 {
+				Rule188 = append(Rule188, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic189 == topic2 { // 189
+			if f, ok1 := rule.(func(data *sensor_msgs.CompressedImage) string); ok1 {
+				Rule189 = append(Rule189, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic190 == topic2 { // 190
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule190 = append(Rule190, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic191 == topic2 { // 191
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule191 = append(Rule191, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic192 == topic2 { // 192
+			if f, ok1 := rule.(func(data *sensor_msgs.CompressedImage) string); ok1 {
+				Rule192 = append(Rule192, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic193 == topic2 { // 193
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule193 = append(Rule193, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic194 == topic2 { // 194
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule194 = append(Rule194, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic195 == topic2 { // 195
+			if f, ok1 := rule.(func(data *theora_image_transport.Packet) string); ok1 {
+				Rule195 = append(Rule195, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic196 == topic2 { // 196
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule196 = append(Rule196, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic197 == topic2 { // 197
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule197 = append(Rule197, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic198 == topic2 { // 198
+			if f, ok1 := rule.(func(data *sensor_msgs.PointCloud2) string); ok1 {
+				Rule198 = append(Rule198, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic199 == topic2 { // 199
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseStamped) string); ok1 {
+				Rule199 = append(Rule199, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic200 == topic2 { // 200
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseStamped) string); ok1 {
+				Rule200 = append(Rule200, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic201 == topic2 { // 201
+			if f, ok1 := rule.(func(data *std_msgs.UInt8) string); ok1 {
+				Rule201 = append(Rule201, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic202 == topic2 { // 202
+			if f, ok1 := rule.(func(data *nav_msgs.Odometry) string); ok1 {
+				Rule202 = append(Rule202, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic203 == topic2 { // 203
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule203 = append(Rule203, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic204 == topic2 { // 204
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule204 = append(Rule204, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic205 == topic2 { // 205
+			if f, ok1 := rule.(func(data *nav_msgs.Odometry) string); ok1 {
+				Rule205 = append(Rule205, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic206 == topic2 { // 206
+			if f, ok1 := rule.(func(data *sensor_msgs.Imu) string); ok1 {
+				Rule206 = append(Rule206, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic207 == topic2 { // 207
+			if f, ok1 := rule.(func(data *sensor_msgs.PointCloud2) string); ok1 {
+				Rule207 = append(Rule207, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic208 == topic2 { // 208
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseArray) string); ok1 {
+				Rule208 = append(Rule208, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic209 == topic2 { // 209
+			if f, ok1 := rule.(func(data *sensor_msgs.PointCloud2) string); ok1 {
+				Rule209 = append(Rule209, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic210 == topic2 { // 210
+			if f, ok1 := rule.(func(data *sensor_msgs.LaserScan) string); ok1 {
+				Rule210 = append(Rule210, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic211 == topic2 { // 211
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseWithCovarianceStamped) string); ok1 {
+				Rule211 = append(Rule211, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic212 == topic2 { // 212
+			if f, ok1 := rule.(func(data *geometry_msgs.Vector3Stamped) string); ok1 {
+				Rule212 = append(Rule212, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic213 == topic2 { // 213
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule213 = append(Rule213, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic214 == topic2 { // 214
+			if f, ok1 := rule.(func(data *common_msgs.FunctionAreas) string); ok1 {
+				Rule214 = append(Rule214, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic215 == topic2 { // 215
+			if f, ok1 := rule.(func(data *std_msgs.Bool) string); ok1 {
+				Rule215 = append(Rule215, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic216 == topic2 { // 216
+			if f, ok1 := rule.(func(data *nav_msgs.Path) string); ok1 {
+				Rule216 = append(Rule216, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic217 == topic2 { // 217
+			if f, ok1 := rule.(func(data *std_msgs.Float64MultiArray) string); ok1 {
+				Rule217 = append(Rule217, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic218 == topic2 { // 218
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule218 = append(Rule218, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic219 == topic2 { // 219
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule219 = append(Rule219, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic220 == topic2 { // 220
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule220 = append(Rule220, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic221 == topic2 { // 221
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseStamped) string); ok1 {
+				Rule221 = append(Rule221, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic222 == topic2 { // 222
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseWithCovarianceStamped) string); ok1 {
+				Rule222 = append(Rule222, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic223 == topic2 { // 223
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule223 = append(Rule223, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic224 == topic2 { // 224
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule224 = append(Rule224, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic225 == topic2 { // 225
+			if f, ok1 := rule.(func(data *localization_monitor.RobotStatus) string); ok1 {
+				Rule225 = append(Rule225, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic226 == topic2 { // 226
+			if f, ok1 := rule.(func(data *std_msgs.Float64MultiArray) string); ok1 {
+				Rule226 = append(Rule226, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic227 == topic2 { // 227
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule227 = append(Rule227, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic228 == topic2 { // 228
+			if f, ok1 := rule.(func(data *actionlib_msgs.GoalID) string); ok1 {
+				Rule228 = append(Rule228, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic229 == topic2 { // 229
+			if f, ok1 := rule.(func(data *ipa_building_msgs.MapSegmentationActionFeedback) string); ok1 {
+				Rule229 = append(Rule229, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic230 == topic2 { // 230
+			if f, ok1 := rule.(func(data *ipa_building_msgs.MapSegmentationActionGoal) string); ok1 {
+				Rule230 = append(Rule230, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic231 == topic2 { // 231
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule231 = append(Rule231, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic232 == topic2 { // 232
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule232 = append(Rule232, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic233 == topic2 { // 233
+			if f, ok1 := rule.(func(data *ipa_building_msgs.MapSegmentationActionResult) string); ok1 {
+				Rule233 = append(Rule233, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic234 == topic2 { // 234
+			if f, ok1 := rule.(func(data *nav_msgs.OccupancyGrid) string); ok1 {
+				Rule234 = append(Rule234, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic235 == topic2 { // 235
+			if f, ok1 := rule.(func(data *actionlib_msgs.GoalStatusArray) string); ok1 {
+				Rule235 = append(Rule235, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic236 == topic2 { // 1
+			if f, ok1 := rule.(func(data *rosgraph_msgs.Log) string); ok1 {
+				Rule236 = append(Rule236, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic237 == topic2 { // 2
+			if f, ok1 := rule.(func(data *rosgraph_msgs.Log) string); ok1 {
+				Rule237 = append(Rule237, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic238 == topic2 { // 3
+			if f, ok1 := rule.(func(data *nav_msgs.Path) string); ok1 {
+				Rule238 = append(Rule238, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic239 == topic2 { // 4
+			if f, ok1 := rule.(func(data *geometry_msgs.Vector3Stamped) string); ok1 {
+				Rule239 = append(Rule239, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic240 == topic2 { // 5
+			if f, ok1 := rule.(func(data *sensor_msgs.LaserScan) string); ok1 {
+				Rule240 = append(Rule240, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic241 == topic2 { // 6
+			if f, ok1 := rule.(func(data *sensor_msgs.LaserScan) string); ok1 {
+				Rule241 = append(Rule241, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic242 == topic2 { // 7
+			if f, ok1 := rule.(func(data *sensor_msgs.LaserScan) string); ok1 {
+				Rule242 = append(Rule242, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic243 == topic2 { // 8
+			if f, ok1 := rule.(func(data *sensor_msgs.LaserScan) string); ok1 {
+				Rule243 = append(Rule243, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic244 == topic2 { // 9
+			if f, ok1 := rule.(func(data *sensor_msgs.LaserScan) string); ok1 {
+				Rule244 = append(Rule244, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic245 == topic2 { // 10
+			if f, ok1 := rule.(func(data *sensor_msgs.PointCloud2) string); ok1 {
+				Rule245 = append(Rule245, f)
+				goto JudgeDone
+			}
+		log(triggerLocalPath)
+		continue
+
+	} else if Topic246 == topic2 { // 11
+		if f, ok1 := rule.(func(data *sensor_msgs.PointCloud2) string); ok1 {
+		Rule246 = append(Rule246, f)
+		goto JudgeDone
+		}
+		log(triggerLocalPath)
+		continue
+
+		} else if Topic247 == topic2 { // 12
+		if f, ok1 := rule.(func(data *visualization_msgs.MarkerArray) string); ok1 {
+		Rule247 = append(Rule247, f)
+		goto JudgeDone
+		}
+		log(triggerLocalPath)
+		continue
+
+		} else if Topic248 == topic2 { // 13
+		if f, ok1 := rule.(func(data *common_msgs.SensorTask) string); ok1 {
+		Rule248 = append(Rule248, f)
+		goto JudgeDone
+		}
+		log(triggerLocalPath)
+		continue
+
+		} else if Topic249 == topic2 { // 14
+		if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+		Rule249 = append(Rule249, f)
+		goto JudgeDone
+		}
+		log(triggerLocalPath)
+		continue
+
+		} else if Topic250 == topic2 { // 15
+		if f, ok1 := rule.(func(data *geometry_msgs.Vector3Stamped) string); ok1 {
+		Rule250 = append(Rule250, f)
+		goto JudgeDone
+		}
+		log(triggerLocalPath)
+		continue
+
+		} else if Topic251 == topic2 { // 16
+		if f, ok1 := rule.(func(data *common_msgs.SonarList) string); ok1 {
+		Rule251 = append(Rule251, f)
+		goto JudgeDone
+		}
+		log(triggerLocalPath)
+		continue
+
+		} else if Topic252 == topic2 { // 17
+		if f, ok1 := rule.(func(data *nav_msgs.Odometry) string); ok1 {
+		Rule252 = append(Rule252, f)
+		goto JudgeDone
+		}
+		log(triggerLocalPath)
+		continue
+
+		} else if Topic253 == topic2 { // 18
+		if f, ok1 := rule.(func(data *sensor_msgs.LaserScan) string); ok1 {
+		Rule253 = append(Rule253, f)
+		goto JudgeDone
+		}
+		log(triggerLocalPath)
+		continue
+
+		} else if Topic254 == topic2 { // 19
+		if f, ok1 := rule.(func(data *std_msgs.Bool) string); ok1 {
+		Rule254 = append(Rule254, f)
+		goto JudgeDone
+		}
+		log(triggerLocalPath)
+		continue
+
+		} else if Topic255 == topic2 { // 20
+		if f, ok1 := rule.(func(data *sensor_msgs.LaserScan) string); ok1 {
+		Rule255 = append(Rule255, f)
+		goto JudgeDone
+		}
+		log(triggerLocalPath)
+		continue
+
+		} else if Topic256 == topic2 { // 21
+		if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+		Rule256 = append(Rule256, f)
+		goto JudgeDone
+		}
+		log(triggerLocalPath)
+		continue
+
+		} else if Topic257 == topic2 { // 22
+		if f, ok1 := rule.(func(data *std_msgs.Bool) string); ok1 {
+		Rule257 = append(Rule257, f)
+		goto JudgeDone
+		}
+		log(triggerLocalPath)
+		continue
+
+		} else if Topic258 == topic2 { // 23
+		if f, ok1 := rule.(func(data *sensor_msgs.CameraInfo) string); ok1 {
+		Rule258 = append(Rule258, f)
+		goto JudgeDone
+		}
+		log(triggerLocalPath)
+		continue
+
+		} else if Topic259 == topic2 { // 24
+		if f, ok1 := rule.(func(data *common_msgs.SysInfo) string); ok1 {
+		Rule259 = append(Rule259, f)
+		goto JudgeDone
+		}
+		log(triggerLocalPath)
+		continue
+
+		} else if Topic260 == topic2 { // 25
+		if f, ok1 := rule.(func(data *sensor_msgs.Image) string); ok1 {
+		Rule260 = append(Rule260, f)
+		goto JudgeDone
+		}
+		log(triggerLocalPath)
+		continue
+
+		} else if Topic261 == topic2 { // 26
+		if f, ok1 := rule.(func(data *sensor_msgs.CompressedImage) string); ok1 {
+		Rule261 = append(Rule261, f)
+		goto JudgeDone
+		}
+		log(triggerLocalPath)
+		continue
+
+		} else if Topic262 == topic2 { // 27
+		if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+		Rule262 = append(Rule262, f)
+		goto JudgeDone
+		}
+		log(triggerLocalPath)
+		continue
+
+		} else if Topic263 == topic2 { // 28
+		if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+		Rule263 = append(Rule263, f)
+		goto JudgeDone
+		}
+		log(triggerLocalPath)
+		continue
+
+		} else if Topic264 == topic2 { // 29
+		if f, ok1 := rule.(func(data *sensor_msgs.CompressedImage) string); ok1 {
+		Rule264 = append(Rule264, f)
+		goto JudgeDone
+		}
+		log(triggerLocalPath)
+		continue
+
+		} else if Topic265 == topic2 { // 30
+		if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+		Rule265 = append(Rule265, f)
+		goto JudgeDone
+		}
+		log(triggerLocalPath)
+		continue
+
+		} else if Topic266 == topic2 { // 31
+		if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+		Rule266 = append(Rule266, f)
+		goto JudgeDone
+		}
+		log(triggerLocalPath)
+		continue
+
+		} else if Topic267 == topic2 { // 32
+		if f, ok1 := rule.(func(data *theora_image_transport.Packet) string); ok1 {
+		Rule267 = append(Rule267, f)
+		goto JudgeDone
+		}
+		log(triggerLocalPath)
+		continue
+
+		} else if Topic268 == topic2 { // 33
+		if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+		Rule268 = append(Rule268, f)
+		goto JudgeDone
+		}
+		log(triggerLocalPath)
+		continue
+
+		} else if Topic269 == topic2 { // 34
+		if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+		Rule269 = append(Rule269, f)
+		goto JudgeDone
+		}
+		log(triggerLocalPath)
+		continue
+
+		} else if Topic270 == topic2 { // 35
+		if f, ok1 := rule.(func(data *std_msgs.Bool) string); ok1 {
+		Rule270 = append(Rule270, f)
+		goto JudgeDone
+		}
+		log(triggerLocalPath)
+		continue
+
+		} else if Topic271 == topic2 { // 36
+		if f, ok1 := rule.(func(data *geometry_msgs.PoseStamped) string); ok1 {
+		Rule271 = append(Rule271, f)
+		goto JudgeDone
+		}
+		log(triggerLocalPath)
+		continue
+
+		} else if Topic272 == topic2 { // 37
+		if f, ok1 := rule.(func(data *geometry_msgs.Vector3Stamped) string); ok1 {
+		Rule272 = append(Rule272, f)
+		goto JudgeDone
+		}
+		log(triggerLocalPath)
+		continue
+
+		} else if Topic273 == topic2 { // 38
+		if f, ok1 := rule.(func(data *common_msgs.TaskFeedbackInfo) string); ok1 {
+		Rule273 = append(Rule273, f)
+		goto JudgeDone
+		}
+		log(triggerLocalPath)
+		continue
+
+		} else if Topic274 == topic2 { // 39
+		if f, ok1 := rule.(func(data *common_msgs.Points) string); ok1 {
+		Rule274 = append(Rule274, f)
+		goto JudgeDone
+		}
+		log(triggerLocalPath)
+		continue
+
+		} else if Topic275 == topic2 { // 40
+		if f, ok1 := rule.(func(data *tf2_msgs.TFMessage) string); ok1 {
+		Rule275 = append(Rule275, f)
+		goto JudgeDone
+		}
+		log(triggerLocalPath)
+		continue
+
+		} else if Topic276 == topic2 { // 41
+		if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+		Rule276 = append(Rule276, f)
+		goto JudgeDone
+		}
+		log(triggerLocalPath)
+		continue
+
+		} else if Topic277 == topic2 { // 42
+		if f, ok1 := rule.(func(data *tf2_msgs.TFMessage) string); ok1 {
+		Rule277 = append(Rule277, f)
+		goto JudgeDone
+		}
+		log(triggerLocalPath)
+		continue
+
+		} else if Topic278 == topic2 { // 43
+		if f, ok1 := rule.(func(data *nav_msgs.Path) string); ok1 {
+		Rule278 = append(Rule278, f)
+		goto JudgeDone
+		}
+		log(triggerLocalPath)
+		continue
+
+		} else if Topic279 == topic2 { // 44
+		if f, ok1 := rule.(func(data *common_msgs.UpLoadFileList) string); ok1 {
+		Rule279 = append(Rule279, f)
+		goto JudgeDone
+		}
+		log(triggerLocalPath)
+		continue
+
+		} else if Topic280 == topic2 { // 45
+		if f, ok1 := rule.(func(data *sensor_msgs.Range) string); ok1 {
+		Rule280 = append(Rule280, f)
+		goto JudgeDone
+		}
+		log(triggerLocalPath)
+		continue
+
+		} else if Topic281 == topic2 { // 46
+			if f, ok1 := rule.(func(data *sensor_msgs.LaserScan) string); ok1 {
+				Rule281 = append(Rule281, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic282 == topic2 { // 47
+			if f, ok1 := rule.(func(data *sensor_msgs.LaserScan) string); ok1 {
+				Rule282 = append(Rule282, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic283 == topic2 { // 48
+			if f, ok1 := rule.(func(data *sensor_msgs.LaserScan) string); ok1 {
+				Rule283 = append(Rule283, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+
+		} else if Topic284 == topic2 { // 49
+			if f, ok1 := rule.(func(data *sensor_msgs.LaserScan) string); ok1 {
+				Rule284 = append(Rule284, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else {
+			c_log.GlobalLogger.Error("未知的topic:", topic2)
+			continue
+		}
+	JudgeDone:
+		label, err := open.Lookup("Label")
+		if err != nil {
+			c_log.GlobalLogger.Error("加载本地插件 ", triggerLocalPath, " 中的 Label 方法失败。", err)
+			continue
+		}
+		labelFunc := label.(func() string)
+		labelString := labelFunc()
+		LabelMapTriggerId.Store(labelString, triggerId)
+		success++
+	}
+	c_log.GlobalLogger.Info("一共应加载", len(config.PlatformConfig.TaskTriggers), "个触发器,实际加载 ", success, " 个触发器。")
+}

+ 184 - 0
aarch64/pjibot_clean/master/package/config/rules101~284.txt

@@ -0,0 +1,184 @@
+Rule101 []func(data *nav_msgs.Path) string
+Rule102 []func(data *geometry_msgs.PoseStamped) string
+Rule103 []func(data *geometry_msgs.PoseWithCovarianceStamped) string
+Rule104 []func(data *geometry_msgs.Pose) string
+Rule105 []func(data *std_msgs.String) string
+Rule106 []func(data *std_msgs.String) string
+Rule107 []func(data *std_msgs.String) string
+Rule108 []func(data *std_msgs.String) string
+Rule109 []func(data *std_msgs.Float64) string
+Rule110 []func(data *std_msgs.String) string
+Rule111 []func(data *std_msgs.String) string
+Rule112 []func(data *sensor_msgs.Imu) string
+Rule113 []func(data *std_msgs.String) string
+Rule114 []func(data *std_msgs.Int8) string
+Rule115 []func(data *std_msgs.Int16) string
+Rule116 []func(data *std_msgs.String) string
+Rule117 []func(data *std_msgs.String) string
+Rule118 []func(data *geometry_msgs.PoseWithCovarianceStamped) string
+Rule119 []func(data *sensor_msgs.JointState) string
+Rule120 []func(data *std_msgs.String) string
+Rule121 []func(data *cartographer_ros_msgs.LandmarkList) string
+Rule122 []func(data *nav_msgs.Odometry) string
+Rule123 []func(data *sensor_msgs.LaserScan) string
+Rule124 []func(data *std_msgs.String) string
+Rule125 []func(data *nav_msgs.Path) string
+Rule126 []func(data *std_msgs.String) string
+Rule127 []func(data *std_msgs.String) string
+Rule128 []func(data *std_msgs.String) string
+Rule129 []func(data *std_msgs.String) string
+Rule130 []func(data *geometry_msgs.PoseWithCovarianceStamped) string
+Rule131 []func(data *std_msgs.String) string
+Rule132 []func(data *std_msgs.String) string
+Rule133 []func(data *common_msgs.LocateInfo) string
+Rule134 []func(data *std_msgs.Bool) string
+Rule135 []func(data *std_msgs.Float64MultiArray) string
+Rule136 []func(data *std_msgs.String) string
+Rule137 []func(data *std_msgs.String) string
+Rule138 []func(data *nav_msgs.OccupancyGrid) string
+Rule139 []func(data *std_msgs.String) string
+Rule140 []func(data *nav_msgs.Path) string
+Rule141 []func(data *std_msgs.String) string
+Rule142 []func(data *std_msgs.String) string
+Rule143 []func(data *nav_msgs.MapMetaData) string
+Rule144 []func(data *nav_msgs.Path) string
+Rule145 []func(data *geometry_msgs.PoseStamped) string
+Rule146 []func(data *nav_msgs.OccupancyGrid) string
+Rule147 []func(data *nav_msgs.OccupancyGrid) string
+Rule148 []func(data *std_msgs.String) string
+Rule149 []func(data *std_msgs.String) string
+Rule150 []func(data *std_msgs.String) string
+Rule151 []func(data *std_msgs.String) string
+Rule152 []func(data *std_msgs.Bool) string
+Rule153 []func(data *sensor_msgs.CameraInfo) string
+Rule154 []func(data *sensor_msgs.Image) string
+Rule155 []func(data *sensor_msgs.CompressedImage) string
+Rule156 []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule157 []func(data *dynamic_reconfigure.Config) string
+Rule158 []func(data *sensor_msgs.CompressedImage) string
+Rule159 []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule160 []func(data *dynamic_reconfigure.Config) string
+Rule161 []func(data *theora_image_transport.Packet) string
+Rule162 []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule163 []func(data *dynamic_reconfigure.Config) string
+Rule164 []func(data *sensor_msgs.CameraInfo) string
+Rule165 []func(data *sensor_msgs.Image) string
+Rule166 []func(data *sensor_msgs.CompressedImage) string
+Rule167 []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule168 []func(data *dynamic_reconfigure.Config) string
+Rule169 []func(data *sensor_msgs.CompressedImage) string
+Rule170 []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule171 []func(data *dynamic_reconfigure.Config) string
+Rule172 []func(data *theora_image_transport.Packet) string
+Rule173 []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule174 []func(data *dynamic_reconfigure.Config) string
+Rule175 []func(data *sensor_msgs.PointCloud2) string
+Rule176 []func(data *sensor_msgs.CameraInfo) string
+Rule177 []func(data *sensor_msgs.Image) string
+Rule178 []func(data *sensor_msgs.CompressedImage) string
+Rule179 []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule180 []func(data *dynamic_reconfigure.Config) string
+Rule181 []func(data *sensor_msgs.CompressedImage) string
+Rule182 []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule183 []func(data *dynamic_reconfigure.Config) string
+Rule184 []func(data *theora_image_transport.Packet) string
+Rule185 []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule186 []func(data *dynamic_reconfigure.Config) string
+Rule187 []func(data *sensor_msgs.CameraInfo) string
+Rule188 []func(data *sensor_msgs.Image) string
+Rule189 []func(data *sensor_msgs.CompressedImage) string
+Rule190 []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule191 []func(data *dynamic_reconfigure.Config) string
+Rule192 []func(data *sensor_msgs.CompressedImage) string
+Rule193 []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule194 []func(data *dynamic_reconfigure.Config) string
+Rule195 []func(data *theora_image_transport.Packet) string
+Rule196 []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule197 []func(data *dynamic_reconfigure.Config) string
+Rule198 []func(data *sensor_msgs.PointCloud2) string
+Rule199 []func(data *geometry_msgs.PoseStamped) string
+Rule200 []func(data *geometry_msgs.PoseStamped) string
+Rule201 []func(data *std_msgs.UInt8) string
+Rule202 []func(data *nav_msgs.Odometry) string
+Rule203 []func(data *std_msgs.String) string
+Rule204 []func(data *std_msgs.String) string
+Rule205 []func(data *nav_msgs.Odometry) string
+Rule206 []func(data *sensor_msgs.Imu) string
+Rule207 []func(data *sensor_msgs.PointCloud2) string
+Rule208 []func(data *geometry_msgs.PoseArray) string
+Rule209 []func(data *sensor_msgs.PointCloud2) string
+Rule210 []func(data *sensor_msgs.LaserScan) string
+Rule211 []func(data *geometry_msgs.PoseWithCovarianceStamped) string
+Rule212 []func(data *geometry_msgs.Vector3Stamped) string
+Rule213 []func(data *std_msgs.String) string
+Rule214 []func(data *common_msgs.FunctionAreas) string
+Rule215 []func(data *std_msgs.Bool) string
+Rule216 []func(data *nav_msgs.Path) string
+Rule217 []func(data *std_msgs.Float64MultiArray) string
+Rule218 []func(data *std_msgs.String) string
+Rule219 []func(data *std_msgs.String) string
+Rule220 []func(data *std_msgs.String) string
+Rule221 []func(data *geometry_msgs.PoseStamped) string
+Rule222 []func(data *geometry_msgs.PoseWithCovarianceStamped) string
+Rule223 []func(data *std_msgs.String) string
+Rule224 []func(data *std_msgs.String) string
+Rule225 []func(data *localization_monitor.RobotStatus) string
+Rule226 []func(data *std_msgs.Float64MultiArray) string
+Rule227 []func(data *std_msgs.String) string
+Rule228 []func(data *actionlib_msgs.GoalID) string
+Rule229 []func(data *ipa_building_msgs.MapSegmentationActionFeedback) string
+Rule230 []func(data *ipa_building_msgs.MapSegmentationActionGoal) string
+Rule231 []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule232 []func(data *dynamic_reconfigure.Config) string
+Rule233 []func(data *ipa_building_msgs.MapSegmentationActionResult) string
+Rule234 []func(data *nav_msgs.OccupancyGrid) string
+Rule235 []func(data *actionlib_msgs.GoalStatusArray) string
+Rule236 []func(data *rosgraph_msgs.Log) string
+Rule237 []func(data *rosgraph_msgs.Log) string
+Rule238 []func(data *nav_msgs.Path) string
+Rule239 []func(data *geometry_msgs.Vector3Stamped) string
+Rule240 []func(data *sensor_msgs.LaserScan) string
+Rule241 []func(data *sensor_msgs.LaserScan) string
+Rule242 []func(data *sensor_msgs.LaserScan) string
+Rule243 []func(data *sensor_msgs.LaserScan) string
+Rule244 []func(data *sensor_msgs.LaserScan) string
+Rule245 []func(data *sensor_msgs.PointCloud2) string
+Rule246 []func(data *sensor_msgs.PointCloud2) string
+Rule247 []func(data *visualization_msgs.MarkerArray) string
+Rule248 []func(data *common_msgs.SensorTask) string
+Rule249 []func(data *std_msgs.String) string
+Rule250 []func(data *geometry_msgs.Vector3Stamped) string
+Rule251 []func(data *common_msgs.SonarList) string
+Rule252 []func(data *nav_msgs.Odometry) string
+Rule253 []func(data *sensor_msgs.LaserScan) string
+Rule254 []func(data *std_msgs.Bool) string
+Rule255 []func(data *sensor_msgs.LaserScan) string
+Rule256 []func(data *std_msgs.String) string
+Rule257 []func(data *std_msgs.Bool) string
+Rule258 []func(data *sensor_msgs.CameraInfo) string
+Rule259 []func(data *common_msgs.SysInfo) string
+Rule260 []func(data *sensor_msgs.Image) string
+Rule261 []func(data *sensor_msgs.CompressedImage) string
+Rule262 []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule263 []func(data *dynamic_reconfigure.Config) string
+Rule264 []func(data *sensor_msgs.CompressedImage) string
+Rule265 []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule266 []func(data *dynamic_reconfigure.Config) string
+Rule267 []func(data *theora_image_transport.Packet) string
+Rule268 []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule269 []func(data *dynamic_reconfigure.Config) string
+Rule270 []func(data *std_msgs.Bool) string
+Rule271 []func(data *geometry_msgs.PoseStamped) string
+Rule272 []func(data *geometry_msgs.Vector3Stamped) string
+Rule273 []func(data *common_msgs.TaskFeedbackInfo) string
+Rule274 []func(data *common_msgs.Points) string
+Rule275 []func(data *tf2_msgs.TFMessage) string
+Rule276 []func(data *std_msgs.String) string
+Rule277 []func(data *tf2_msgs.TFMessage) string
+Rule278 []func(data *nav_msgs.Path) string
+Rule279 []func(data *common_msgs.UpLoadFileList) string
+Rule280 []func(data *sensor_msgs.Range) string
+Rule281 []func(data *sensor_msgs.LaserScan) string
+Rule282 []func(data *sensor_msgs.LaserScan) string
+Rule283 []func(data *sensor_msgs.LaserScan) string
+Rule284 []func(data *sensor_msgs.LaserScan) string

+ 284 - 0
aarch64/pjibot_clean/master/package/config/rules1~100.txt

@@ -0,0 +1,284 @@
+Rule1   []func(data *std_msgs.Int16MultiArray) string
+Rule2   []func(data *geometry_msgs.PoseStamped) string
+Rule3   []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule4   []func(data *dynamic_reconfigure.Config) string
+Rule5   []func(data *std_msgs.String) string
+Rule6   []func(data *geometry_msgs.PoseWithCovarianceStamped) string
+Rule7   []func(data *std_msgs.String) string
+Rule8   []func(data *std_msgs.String) string
+Rule9   []func(data *std_msgs.Bool) string
+Rule10  []func(data *std_msgs.Int8) string
+Rule11  []func(data *std_msgs.Int8) string
+Rule12  []func(data *sensor_msgs.PointCloud2) string
+Rule13  []func(data *sensor_msgs.BatteryState) string
+Rule14  []func(data *std_msgs.Int16) string
+Rule15  []func(data *visualization_msgs.Marker) string
+Rule16  []func(data *std_msgs.String) string
+Rule17  []func(data *sensor_msgs.CameraInfo) string
+Rule18  []func(data *sensor_msgs.Image) string
+Rule19  []func(data *sensor_msgs.CompressedImage) string
+Rule20  []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule21  []func(data *dynamic_reconfigure.Config) string
+Rule22  []func(data *sensor_msgs.CompressedImage) string
+Rule23  []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule24  []func(data *dynamic_reconfigure.Config) string
+Rule25  []func(data *theora_image_transport.Packet) string
+Rule26  []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule27  []func(data *dynamic_reconfigure.Config) string
+Rule28  []func(data *sensor_msgs.PointCloud2) string
+Rule29  []func(data *sensor_msgs.CameraInfo) string
+Rule30  []func(data *sensor_msgs.Image) string
+Rule31  []func(data *sensor_msgs.CompressedImage) string
+Rule32  []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule33  []func(data *dynamic_reconfigure.Config) string
+Rule34  []func(data *sensor_msgs.CompressedImage) string
+Rule35  []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule36  []func(data *dynamic_reconfigure.Config) string
+Rule37  []func(data *theora_image_transport.Packet) string
+Rule38  []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule39  []func(data *dynamic_reconfigure.Config) string
+Rule40  []func(data *geometry_msgs.PoseStamped) string
+Rule41  []func(data *geometry_msgs.PoseStamped) string
+Rule42  []func(data *nav_msgs.Path) string
+Rule43  []func(data *std_msgs.Int8) string
+Rule44  []func(data *std_msgs.Bool) string
+Rule45  []func(data *nav_msgs.Path) string
+Rule46  []func(data *geometry_msgs.PoseStamped) string
+Rule47  []func(data *geometry_msgs.PoseStamped) string
+Rule48  []func(data *geometry_msgs.PoseStamped) string
+Rule49  []func(data *std_msgs.String) string
+Rule50  []func(data *visualization_msgs.MarkerArray) string
+Rule51  []func(data *geometry_msgs.PolygonStamped) string
+Rule52  []func(data *nav_msgs.OccupancyGrid) string
+Rule53  []func(data *nav_msgs.OccupancyGrid) string
+Rule54  []func(data *nav_msgs.OccupancyGrid) string
+Rule55  []func(data *std_msgs.Float32) string
+Rule56  []func(data *std_msgs.Int32) string
+Rule57  []func(data *nav_msgs.Path) string
+Rule58  []func(data *clean_msg.ErrorInfo) string
+Rule59  []func(data *nav_msgs.OccupancyGrid) string
+Rule60  []func(data *nav_msgs.OccupancyGrid) string
+Rule61  []func(data *nav_msgs.OccupancyGrid) string
+Rule62  []func(data *nav_msgs.OccupancyGrid) string
+Rule63  []func(data *nav_msgs.OccupancyGrid) string
+Rule64  []func(data *nav_msgs.OccupancyGrid) string
+Rule65  []func(data *std_msgs.String) string
+Rule66  []func(data *std_msgs.Bool) string
+Rule67  []func(data *std_msgs.Bool) string
+Rule68  []func(data *geometry_msgs.PolygonStamped) string
+Rule69  []func(data *geometry_msgs.PointStamped) string
+Rule70  []func(data *std_msgs.String) string
+Rule71  []func(data *geometry_msgs.Twist) string
+Rule72  []func(data *geometry_msgs.Twist) string
+Rule73  []func(data *nav_msgs.Path) string
+Rule74  []func(data *common_msgs.CreateMapInfo) string
+Rule75  []func(data *geometry_msgs.Twist) string
+Rule76  []func(data *common_msgs.SensorStatus) string
+Rule77  []func(data *geometry_msgs.PoseArray) string
+Rule78  []func(data *nav_msgs.Path) string
+Rule79  []func(data *common_msgs.IdentifierObjsInfo) string
+Rule80  []func(data *common_msgs.McuDiagnostic) string
+Rule81  []func(data *diagnostic_msgs.DiagnosticArray) string
+Rule82  []func(data *std_msgs.Int8) string
+Rule83  []func(data *std_msgs.Int16) string
+Rule84  []func(data *geometry_msgs.Vector3Stamped) string
+Rule85  []func(data *sensor_msgs.LaserScan) string
+Rule86  []func(data *sensor_msgs.PointCloud2) string
+Rule87  []func(data *std_msgs.String) string
+Rule88  []func(data *std_msgs.String) string
+Rule89  []func(data *std_msgs.String) string
+Rule90  []func(data *std_msgs.Int32) string
+Rule91  []func(data *common_msgs.TaskInfo) string
+Rule92  []func(data *common_msgs.MapInfo) string
+Rule93  []func(data *nav_msgs.Path) string
+Rule94  []func(data *common_msgs.VideoStream) string
+Rule95  []func(data *sensor_msgs.PointCloud2) string
+Rule96  []func(data *nav_msgs.Path) string
+Rule97  []func(data *sensor_msgs.PointCloud2) string
+Rule98  []func(data *sensor_msgs.PointCloud2) string
+Rule99  []func(data *sensor_msgs.PointCloud2) string
+Rule100 []func(data *geometry_msgs.PointStamped) string
+Rule101 []func(data *nav_msgs.Path) string
+Rule102 []func(data *geometry_msgs.PoseStamped) string
+Rule103 []func(data *geometry_msgs.PoseWithCovarianceStamped) string
+Rule104 []func(data *geometry_msgs.Pose) string
+Rule105 []func(data *std_msgs.String) string
+Rule106 []func(data *std_msgs.String) string
+Rule107 []func(data *std_msgs.String) string
+Rule108 []func(data *std_msgs.String) string
+Rule109 []func(data *std_msgs.Float64) string
+Rule110 []func(data *std_msgs.String) string
+Rule111 []func(data *std_msgs.String) string
+Rule112 []func(data *sensor_msgs.Imu) string
+Rule113 []func(data *std_msgs.String) string
+Rule114 []func(data *std_msgs.Int8) string
+Rule115 []func(data *std_msgs.Int16) string
+Rule116 []func(data *std_msgs.String) string
+Rule117 []func(data *std_msgs.String) string
+Rule118 []func(data *geometry_msgs.PoseWithCovarianceStamped) string
+Rule119 []func(data *sensor_msgs.JointState) string
+Rule120 []func(data *std_msgs.String) string
+Rule121 []func(data *cartographer_ros_msgs.LandmarkList) string
+Rule122 []func(data *nav_msgs.Odometry) string
+Rule123 []func(data *sensor_msgs.LaserScan) string
+Rule124 []func(data *std_msgs.String) string
+Rule125 []func(data *nav_msgs.Path) string
+Rule126 []func(data *std_msgs.String) string
+Rule127 []func(data *std_msgs.String) string
+Rule128 []func(data *std_msgs.String) string
+Rule129 []func(data *std_msgs.String) string
+Rule130 []func(data *geometry_msgs.PoseWithCovarianceStamped) string
+Rule131 []func(data *std_msgs.String) string
+Rule132 []func(data *std_msgs.String) string
+Rule133 []func(data *common_msgs.LocateInfo) string
+Rule134 []func(data *std_msgs.Bool) string
+Rule135 []func(data *std_msgs.Float64MultiArray) string
+Rule136 []func(data *std_msgs.String) string
+Rule137 []func(data *std_msgs.String) string
+Rule138 []func(data *nav_msgs.OccupancyGrid) string
+Rule139 []func(data *std_msgs.String) string
+Rule140 []func(data *nav_msgs.Path) string
+Rule141 []func(data *std_msgs.String) string
+Rule142 []func(data *std_msgs.String) string
+Rule143 []func(data *nav_msgs.MapMetaData) string
+Rule144 []func(data *nav_msgs.Path) string
+Rule145 []func(data *geometry_msgs.PoseStamped) string
+Rule146 []func(data *nav_msgs.OccupancyGrid) string
+Rule147 []func(data *nav_msgs.OccupancyGrid) string
+Rule148 []func(data *std_msgs.String) string
+Rule149 []func(data *std_msgs.String) string
+Rule150 []func(data *std_msgs.String) string
+Rule151 []func(data *std_msgs.String) string
+Rule152 []func(data *std_msgs.Bool) string
+Rule153 []func(data *sensor_msgs.CameraInfo) string
+Rule154 []func(data *sensor_msgs.Image) string
+Rule155 []func(data *sensor_msgs.CompressedImage) string
+Rule156 []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule157 []func(data *dynamic_reconfigure.Config) string
+Rule158 []func(data *sensor_msgs.CompressedImage) string
+Rule159 []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule160 []func(data *dynamic_reconfigure.Config) string
+Rule161 []func(data *theora_image_transport.Packet) string
+Rule162 []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule163 []func(data *dynamic_reconfigure.Config) string
+Rule164 []func(data *sensor_msgs.CameraInfo) string
+Rule165 []func(data *sensor_msgs.Image) string
+Rule166 []func(data *sensor_msgs.CompressedImage) string
+Rule167 []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule168 []func(data *dynamic_reconfigure.Config) string
+Rule169 []func(data *sensor_msgs.CompressedImage) string
+Rule170 []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule171 []func(data *dynamic_reconfigure.Config) string
+Rule172 []func(data *theora_image_transport.Packet) string
+Rule173 []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule174 []func(data *dynamic_reconfigure.Config) string
+Rule175 []func(data *sensor_msgs.PointCloud2) string
+Rule176 []func(data *sensor_msgs.CameraInfo) string
+Rule177 []func(data *sensor_msgs.Image) string
+Rule178 []func(data *sensor_msgs.CompressedImage) string
+Rule179 []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule180 []func(data *dynamic_reconfigure.Config) string
+Rule181 []func(data *sensor_msgs.CompressedImage) string
+Rule182 []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule183 []func(data *dynamic_reconfigure.Config) string
+Rule184 []func(data *theora_image_transport.Packet) string
+Rule185 []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule186 []func(data *dynamic_reconfigure.Config) string
+Rule187 []func(data *sensor_msgs.CameraInfo) string
+Rule188 []func(data *sensor_msgs.Image) string
+Rule189 []func(data *sensor_msgs.CompressedImage) string
+Rule190 []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule191 []func(data *dynamic_reconfigure.Config) string
+Rule192 []func(data *sensor_msgs.CompressedImage) string
+Rule193 []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule194 []func(data *dynamic_reconfigure.Config) string
+Rule195 []func(data *theora_image_transport.Packet) string
+Rule196 []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule197 []func(data *dynamic_reconfigure.Config) string
+Rule198 []func(data *sensor_msgs.PointCloud2) string
+Rule199 []func(data *geometry_msgs.PoseStamped) string
+Rule200 []func(data *geometry_msgs.PoseStamped) string
+Rule201 []func(data *std_msgs.UInt8) string
+Rule202 []func(data *nav_msgs.Odometry) string
+Rule203 []func(data *std_msgs.String) string
+Rule204 []func(data *std_msgs.String) string
+Rule205 []func(data *nav_msgs.Odometry) string
+Rule206 []func(data *sensor_msgs.Imu) string
+Rule207 []func(data *sensor_msgs.PointCloud2) string
+Rule208 []func(data *geometry_msgs.PoseArray) string
+Rule209 []func(data *sensor_msgs.PointCloud2) string
+Rule210 []func(data *sensor_msgs.LaserScan) string
+Rule211 []func(data *geometry_msgs.PoseWithCovarianceStamped) string
+Rule212 []func(data *geometry_msgs.Vector3Stamped) string
+Rule213 []func(data *std_msgs.String) string
+Rule214 []func(data *common_msgs.FunctionAreas) string
+Rule215 []func(data *std_msgs.Bool) string
+Rule216 []func(data *nav_msgs.Path) string
+Rule217 []func(data *std_msgs.Float64MultiArray) string
+Rule218 []func(data *std_msgs.String) string
+Rule219 []func(data *std_msgs.String) string
+Rule220 []func(data *std_msgs.String) string
+Rule221 []func(data *geometry_msgs.PoseStamped) string
+Rule222 []func(data *geometry_msgs.PoseWithCovarianceStamped) string
+Rule223 []func(data *std_msgs.String) string
+Rule224 []func(data *std_msgs.String) string
+Rule225 []func(data *localization_monitor.RobotStatus) string
+Rule226 []func(data *std_msgs.Float64MultiArray) string
+Rule227 []func(data *std_msgs.String) string
+Rule228 []func(data *actionlib_msgs.GoalID) string
+Rule229 []func(data *ipa_building_msgs.MapSegmentationActionFeedback) string
+Rule230 []func(data *ipa_building_msgs.MapSegmentationActionGoal) string
+Rule231 []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule232 []func(data *dynamic_reconfigure.Config) string
+Rule233 []func(data *ipa_building_msgs.MapSegmentationActionResult) string
+Rule234 []func(data *nav_msgs.OccupancyGrid) string
+Rule235 []func(data *actionlib_msgs.GoalStatusArray) string
+Rule236 []func(data *rosgraph_msgs.Log) string
+Rule237 []func(data *rosgraph_msgs.Log) string
+Rule238 []func(data *nav_msgs.Path) string
+Rule239 []func(data *geometry_msgs.Vector3Stamped) string
+Rule240 []func(data *sensor_msgs.LaserScan) string
+Rule241 []func(data *sensor_msgs.LaserScan) string
+Rule242 []func(data *sensor_msgs.LaserScan) string
+Rule243 []func(data *sensor_msgs.LaserScan) string
+Rule244 []func(data *sensor_msgs.LaserScan) string
+Rule245 []func(data *sensor_msgs.PointCloud2) string
+Rule246 []func(data *sensor_msgs.PointCloud2) string
+Rule247 []func(data *visualization_msgs.MarkerArray) string
+Rule248 []func(data *common_msgs.SensorTask) string
+Rule249 []func(data *std_msgs.String) string
+Rule250 []func(data *geometry_msgs.Vector3Stamped) string
+Rule251 []func(data *common_msgs.SonarList) string
+Rule252 []func(data *nav_msgs.Odometry) string
+Rule253 []func(data *sensor_msgs.LaserScan) string
+Rule254 []func(data *std_msgs.Bool) string
+Rule255 []func(data *sensor_msgs.LaserScan) string
+Rule256 []func(data *std_msgs.String) string
+Rule257 []func(data *std_msgs.Bool) string
+Rule258 []func(data *sensor_msgs.CameraInfo) string
+Rule259 []func(data *common_msgs.SysInfo) string
+Rule260 []func(data *sensor_msgs.Image) string
+Rule261 []func(data *sensor_msgs.CompressedImage) string
+Rule262 []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule263 []func(data *dynamic_reconfigure.Config) string
+Rule264 []func(data *sensor_msgs.CompressedImage) string
+Rule265 []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule266 []func(data *dynamic_reconfigure.Config) string
+Rule267 []func(data *theora_image_transport.Packet) string
+Rule268 []func(data *dynamic_reconfigure.ConfigDescription) string
+Rule269 []func(data *dynamic_reconfigure.Config) string
+Rule270 []func(data *std_msgs.Bool) string
+Rule271 []func(data *geometry_msgs.PoseStamped) string
+Rule272 []func(data *geometry_msgs.Vector3Stamped) string
+Rule273 []func(data *common_msgs.TaskFeedbackInfo) string
+Rule274 []func(data *common_msgs.Points) string
+Rule275 []func(data *tf2_msgs.TFMessage) string
+Rule276 []func(data *std_msgs.String) string
+Rule277 []func(data *tf2_msgs.TFMessage) string
+Rule278 []func(data *nav_msgs.Path) string
+Rule279 []func(data *common_msgs.UpLoadFileList) string
+Rule280 []func(data *sensor_msgs.Range) string
+Rule281 []func(data *sensor_msgs.LaserScan) string
+Rule282 []func(data *sensor_msgs.LaserScan) string
+Rule283 []func(data *sensor_msgs.LaserScan) string
+Rule284 []func(data *sensor_msgs.LaserScan) string

+ 2969 - 0
aarch64/pjibot_clean/master/package/config/trigger_init.go

@@ -0,0 +1,2969 @@
+package config
+
+import (
+	"cicv-data-closedloop/aarch64/pjibot_clean/common/config"
+	"cicv-data-closedloop/common/config/c_log"
+	"cicv-data-closedloop/common/util"
+	"cicv-data-closedloop/pjibot_clean_msgs/cartographer_ros_msgs"
+	"cicv-data-closedloop/pjibot_clean_msgs/clean_msg"
+	"cicv-data-closedloop/pjibot_clean_msgs/common_msgs"
+	"cicv-data-closedloop/pjibot_clean_msgs/dynamic_reconfigure"
+	"cicv-data-closedloop/pjibot_clean_msgs/ipa_building_msgs"
+	"cicv-data-closedloop/pjibot_clean_msgs/localization_monitor"
+	"cicv-data-closedloop/pjibot_clean_msgs/theora_image_transport"
+	"plugin"
+	"slices"
+	"sync"
+
+	"github.com/bluenviron/goroslib/v2/pkg/msgs/actionlib_msgs"
+	"github.com/bluenviron/goroslib/v2/pkg/msgs/diagnostic_msgs"
+	"github.com/bluenviron/goroslib/v2/pkg/msgs/geometry_msgs"
+	"github.com/bluenviron/goroslib/v2/pkg/msgs/nav_msgs"
+	"github.com/bluenviron/goroslib/v2/pkg/msgs/rosgraph_msgs"
+	"github.com/bluenviron/goroslib/v2/pkg/msgs/sensor_msgs"
+	"github.com/bluenviron/goroslib/v2/pkg/msgs/std_msgs"
+	"github.com/bluenviron/goroslib/v2/pkg/msgs/tf2_msgs"
+	"github.com/bluenviron/goroslib/v2/pkg/msgs/visualization_msgs"
+)
+
+var (
+	LabelMapTriggerId = new(sync.Map)
+	// AllTopics 这里是全量的topic,添加topic则需要同时在下面的数组添加;也需要在produce_window.go中添加新的订阅者
+	AllTopics = []string{
+		Topic1,   // 1
+		Topic2,   // 2
+		Topic3,   // 3
+		Topic4,   // 4
+		Topic5,   // 5
+		Topic6,   // 6
+		Topic7,   // 7
+		Topic8,   // 8
+		Topic9,   // 9
+		Topic10,  // 10
+		Topic11,  // 11
+		Topic12,  // 12
+		Topic13,  // 13
+		Topic14,  // 14
+		Topic15,  // 15
+		Topic16,  // 16
+		Topic17,  // 17
+		Topic18,  // 18
+		Topic19,  // 19
+		Topic20,  // 20
+		Topic21,  // 21
+		Topic22,  // 22
+		Topic23,  // 23
+		Topic24,  // 24
+		Topic25,  // 25
+		Topic26,  // 26
+		Topic27,  // 27
+		Topic28,  // 28
+		Topic29,  // 29
+		Topic30,  // 30
+		Topic31,  // 31
+		Topic32,  // 32
+		Topic33,  // 33
+		Topic34,  // 34
+		Topic35,  // 35
+		Topic36,  // 36
+		Topic37,  // 37
+		Topic38,  // 38
+		Topic39,  // 39
+		Topic40,  // 40
+		Topic41,  // 41
+		Topic42,  // 42
+		Topic43,  // 43
+		Topic44,  // 44
+		Topic45,  // 45
+		Topic46,  // 46
+		Topic47,  // 47
+		Topic48,  // 48
+		Topic49,  // 49
+		Topic50,  // 50
+		Topic51,  // 51
+		Topic52,  // 52
+		Topic53,  // 53
+		Topic54,  // 54
+		Topic55,  // 55
+		Topic56,  // 56
+		Topic57,  // 57
+		Topic58,  // 58
+		Topic59,  // 59
+		Topic60,  // 60
+		Topic61,  // 61
+		Topic62,  // 62
+		Topic63,  // 63
+		Topic64,  // 64
+		Topic65,  // 65
+		Topic66,  // 66
+		Topic67,  // 67
+		Topic68,  // 68
+		Topic69,  // 69
+		Topic70,  // 70
+		Topic71,  // 71
+		Topic72,  // 72
+		Topic73,  // 73
+		Topic74,  // 74
+		Topic75,  // 75
+		Topic76,  // 76
+		Topic77,  // 77
+		Topic78,  // 78
+		Topic79,  // 79
+		Topic80,  // 80
+		Topic81,  // 81
+		Topic82,  // 82
+		Topic83,  // 83
+		Topic84,  // 84
+		Topic85,  // 85
+		Topic86,  // 86
+		Topic87,  // 87
+		Topic88,  // 88
+		Topic89,  // 89
+		Topic90,  // 90
+		Topic91,  // 91
+		Topic92,  // 92
+		Topic93,  // 93
+		Topic94,  // 94
+		Topic95,  // 95
+		Topic96,  // 96
+		Topic97,  // 97
+		Topic98,  // 98
+		Topic99,  // 99
+		Topic100, // 100
+		Topic101, // 101
+		Topic102, // 102
+		Topic103, // 103
+		Topic104, // 104
+		Topic105, // 105
+		Topic106, // 106
+		Topic107, // 107
+		Topic108, // 108
+		Topic109, // 109
+		Topic110, // 110
+		Topic111, // 111
+		Topic112, // 112
+		Topic113, // 113
+		Topic114, // 114
+		Topic115, // 115
+		Topic116, // 116
+		Topic117, // 117
+		Topic118, // 118
+		Topic119, // 119
+		Topic120, // 120
+		Topic121, // 121
+		Topic122, // 122
+		Topic123, // 123
+		Topic124, // 124
+		Topic125, // 125
+		Topic126, // 126
+		Topic127, // 127
+		Topic128, // 128
+		Topic129, // 129
+		Topic130, // 130
+		Topic131, // 131
+		Topic132, // 132
+		Topic133, // 133
+		Topic134, // 134
+		Topic135, // 135
+		Topic136, // 136
+		Topic137, // 137
+		Topic138, // 138
+		Topic139, // 139
+		Topic140, // 140
+		Topic141, // 141
+		Topic142, // 142
+		Topic143, // 143
+		Topic144, // 144
+		Topic145, // 145
+		Topic146, // 146
+		Topic147, // 147
+		Topic148, // 148
+		Topic149, // 149
+		Topic150, // 150
+		Topic151, // 151
+		Topic152, // 152
+		Topic153, // 153
+		Topic154, // 154
+		Topic155, // 155
+		Topic156, // 156
+		Topic157, // 157
+		Topic158, // 158
+		Topic159, // 159
+		Topic160, // 160
+		Topic161, // 161
+		Topic162, // 162
+		Topic163, // 163
+		Topic164, // 164
+		Topic165, // 165
+		Topic166, // 166
+		Topic167, // 167
+		Topic168, // 168
+		Topic169, // 169
+		Topic170, // 170
+		Topic171, // 171
+		Topic172, // 172
+		Topic173, // 173
+		Topic174, // 174
+		Topic175, // 175
+		Topic176, // 176
+		Topic177, // 177
+		Topic178, // 178
+		Topic179, // 179
+		Topic180, // 180
+		Topic181, // 181
+		Topic182, // 182
+		Topic183, // 183
+		Topic184, // 184
+		Topic185, // 185
+		Topic186, // 186
+		Topic187, // 187
+		Topic188, // 188
+		Topic189, // 189
+		Topic190, // 190
+		Topic191, // 191
+		Topic192, // 192
+		Topic193, // 193
+		Topic194, // 194
+		Topic195, // 195
+		Topic196, // 196
+		Topic197, // 197
+		Topic198, // 198
+		Topic199, // 199
+		Topic200, // 200
+		Topic201, // 201
+		Topic202, // 202
+		Topic203, // 203
+		Topic204, // 204
+		Topic205, // 205
+		Topic206, // 206
+		Topic207, // 207
+		Topic208, // 208
+		Topic209, // 209
+		Topic210, // 210
+		Topic211, // 211
+		Topic212, // 212
+		Topic213, // 213
+		Topic214, // 214
+		Topic215, // 215
+		Topic216, // 216
+		Topic217, // 217
+		Topic218, // 218
+		Topic219, // 219
+		Topic220, // 220
+		Topic221, // 221
+		Topic222, // 222
+		Topic223, // 223
+		Topic224, // 224
+		Topic225, // 225
+		Topic226, // 226
+		Topic227, // 227
+		Topic228, // 228
+		Topic229, // 229
+		Topic230, // 230
+		Topic231, // 231
+		Topic232, // 232
+		Topic233, // 233
+		Topic234, // 234
+		Topic235, // 235
+		Topic236, // 236
+		Topic237, // 237
+		Topic238, // 238
+		Topic239, // 239
+		Topic240, // 240
+		Topic241, // 241
+		Topic242, // 242
+		Topic243, // 243
+		Topic244, // 244
+		Topic245, // 245
+		Topic246, // 246
+		Topic247, // 247
+		Topic248, // 248
+		Topic249, // 249
+		Topic250, // 250
+		Topic251, // 251
+		Topic252, // 252
+		Topic253, // 253
+		Topic254, // 254
+		Topic255, // 255
+		Topic256, // 256
+		Topic257, // 257
+		Topic258, // 258
+		Topic259, // 259
+		Topic260, // 260
+		Topic261, // 261
+		Topic262, // 262
+		Topic263, // 263
+		Topic264, // 264
+		Topic265, // 265
+		Topic266, // 266
+		Topic267, // 267
+		Topic268, // 268
+		Topic269, // 269
+		Topic270, // 270
+		Topic271, // 271
+		Topic272, // 272
+		Topic273, // 273
+		Topic274, // 274
+		Topic275, // 275
+		Topic276, // 276
+		Topic277, // 277
+		Topic278, // 278
+		Topic279, // 279
+		Topic280, // 280
+		Topic281, // 281
+		Topic282, // 282
+		Topic283, // 283
+		Topic284, // 284
+	}
+
+	Topic1   = "/Electrification"
+	Topic2   = "/along_wall_start_point"
+	Topic3   = "/amcl/parameter_descriptions"
+	Topic4   = "/amcl/parameter_updates"
+	Topic5   = "/amcl_enter_mapconvert_topic"
+	Topic6   = "/amcl_pose"
+	Topic7   = "/amcl_relocalization_finish_pub"
+	Topic8   = "/amcl_topic"
+	Topic9   = "/any_eye/run_line_light"
+	Topic10  = "/application_heart_beat"
+	Topic11  = "/auto_dock/heart"
+	Topic12  = "/back_top_points_process"
+	Topic13  = "/batter"
+	Topic14  = "/boot_time"
+	Topic15  = "/boundingboxes_line"
+	Topic16  = "/call_icp"
+	Topic17  = "/camera/depth/camera_info"
+	Topic18  = "/camera/depth/image_raw"
+	Topic19  = "/camera/depth/image_raw/compressed"
+	Topic20  = "/camera/depth/image_raw/compressed/parameter_descriptions"
+	Topic21  = "/camera/depth/image_raw/compressed/parameter_updates"
+	Topic22  = "/camera/depth/image_raw/compressedDepth"
+	Topic23  = "/camera/depth/image_raw/compressedDepth/parameter_descriptions"
+	Topic24  = "/camera/depth/image_raw/compressedDepth/parameter_updates"
+	Topic25  = "/camera/depth/image_raw/theora"
+	Topic26  = "/camera/depth/image_raw/theora/parameter_descriptions"
+	Topic27  = "/camera/depth/image_raw/theora/parameter_updates"
+	Topic28  = "/camera/depth/points"
+	Topic29  = "/camera/ir/camera_info"
+	Topic30  = "/camera/ir/image_raw"
+	Topic31  = "/camera/ir/image_raw/compressed"
+	Topic32  = "/camera/ir/image_raw/compressed/parameter_descriptions"
+	Topic33  = "/camera/ir/image_raw/compressed/parameter_updates"
+	Topic34  = "/camera/ir/image_raw/compressedDepth"
+	Topic35  = "/camera/ir/image_raw/compressedDepth/parameter_descriptions"
+	Topic36  = "/camera/ir/image_raw/compressedDepth/parameter_updates"
+	Topic37  = "/camera/ir/image_raw/theora"
+	Topic38  = "/camera/ir/image_raw/theora/parameter_descriptions"
+	Topic39  = "/camera/ir/image_raw/theora/parameter_updates"
+	Topic40  = "/charge_tag_pos"
+	Topic41  = "/charge_target"
+	Topic42  = "/clean_pnc/astar_path_planner/path"
+	Topic43  = "/clean_pnc/battery_state"
+	Topic44  = "/clean_pnc/bumper"
+	Topic45  = "/clean_pnc/charger/station_line"
+	Topic46  = "/clean_pnc/charging_station/detect_position"
+	Topic47  = "/clean_pnc/charging_station/odom_position"
+	Topic48  = "/clean_pnc/charging_station/position"
+	Topic49  = "/clean_pnc/clean_cmd"
+	Topic50  = "/clean_pnc/cost_map/footprint"
+	Topic51  = "/clean_pnc/cost_map/footprint_spec"
+	Topic52  = "/clean_pnc/cost_map/global_costmap"
+	Topic53  = "/clean_pnc/cost_map/local_costmap"
+	Topic54  = "/clean_pnc/cost_map/task_costmap"
+	Topic55  = "/clean_pnc/cur_clean_area"
+	Topic56  = "/clean_pnc/current_task_list_loop_times"
+	Topic57  = "/clean_pnc/dwa_path_planner/global_path"
+	Topic58  = "/clean_pnc/error_code"
+	Topic59  = "/clean_pnc/function_map/compute_follow_path_map"
+	Topic60  = "/clean_pnc/function_map/forbidden_clean_area"
+	Topic61  = "/clean_pnc/function_map/need_clean_area"
+	Topic62  = "/clean_pnc/function_map/no_need_clean_area"
+	Topic63  = "/clean_pnc/function_map/task_cleaned_map"
+	Topic64  = "/clean_pnc/function_map/task_list_cleaned_map"
+	Topic65  = "/clean_pnc/save_report"
+	Topic66  = "/clean_pnc/scram_button"
+	Topic67  = "/clean_pnc/type/pause"
+	Topic68  = "/clean_polygon"
+	Topic69  = "/clicked_point"
+	Topic70  = "/close_imu_topic_"
+	Topic71  = "/cloud_cmd"
+	Topic72  = "/cmd_vel"
+	Topic73  = "/collisionDetection"
+	Topic74  = "/create_map_info"
+	Topic75  = "/ctrl_speed_deal_before"
+	Topic76  = "/current/sensor_status"
+	Topic77  = "/custom_path"
+	Topic78  = "/data_fusion_path"
+	Topic79  = "/detect/boundingboxes"
+	Topic80  = "/diagnostic/mcu"
+	Topic81  = "/diagnostics"
+	Topic82  = "/disinfection"
+	Topic83  = "/disinfection_info"
+	Topic84  = "/dock_flag"
+	Topic85  = "/dynamic_scan"
+	Topic86  = "/dynamic_wall_line_pub"
+	Topic87  = "/elevate_scence"
+	Topic88  = "/elevate_state_topic"
+	Topic89  = "/elevator_dwa/task_status"
+	Topic90  = "/engine/current_robot_mode"
+	Topic91  = "/engine/current_task_info"
+	Topic92  = "/engine/map_info"
+	Topic93  = "/engine/out_line_path"
+	Topic94  = "/engine/video_stream_push"
+	Topic95  = "/floor_downsample"
+	Topic96  = "/follow_path_path"
+	Topic97  = "/front_down_points_process"
+	Topic98  = "/front_top_points_downsample1"
+	Topic99  = "/front_top_points_process"
+	Topic100 = "/global_goal"
+	Topic101 = "/global_path"
+	Topic102 = "/hst007_camera_pose"
+	Topic103 = "/icp_initial_pose"
+	Topic104 = "/icp_localization_check_topic"
+	Topic105 = "/icp_relocalization_finish_pub_topic"
+	Topic106 = "/icp_relocalization_pub_topic"
+	Topic107 = "/icp_relocalization_sub_topic"
+	Topic108 = "/icp_run_topic"
+	Topic109 = "/icp_score"
+	Topic110 = "/icp_service"
+	Topic111 = "/icp_topic"
+	Topic112 = "/imu"
+	Topic113 = "/imu_cal_state"
+	Topic114 = "/imu_calibration_state"
+	Topic115 = "/imu_calibration_temperature"
+	Topic116 = "/imu_slover_param"
+	Topic117 = "/incline_localization"
+	Topic118 = "/initialpose"
+	Topic119 = "/joint_states"
+	Topic120 = "/kibana_log"
+	Topic121 = "/landmark"
+	Topic122 = "/laser_odom"
+	Topic123 = "/leg_scan"
+	Topic124 = "/lm_imu"
+	Topic125 = "/local_path_update"
+	Topic126 = "/localation_monitor_topic"
+	Topic127 = "/localization_convertMap_topic"
+	Topic128 = "/localization_fail"
+	Topic129 = "/localization_monitor_node/localation_monitor_topic"
+	Topic130 = "/localization_recover_pose"
+	Topic131 = "/localization_rocover_state"
+	Topic132 = "/localization_state_modiy"
+	Topic133 = "/locate_info"
+	Topic134 = "/locate_state"
+	Topic135 = "/lost_localization_state_"
+	Topic136 = "/lost_localization_warning_state"
+	Topic137 = "/manual_close_icp_topic"
+	Topic138 = "/map"
+	Topic139 = "/map_base64"
+	Topic140 = "/map_border"
+	Topic141 = "/map_merge_node/amcl_topic"
+	Topic142 = "/map_merge_node/icp_topic"
+	Topic143 = "/map_metadata"
+	Topic144 = "/move_base/GlobalPlanner/plan"
+	Topic145 = "/move_base_simple/goal"
+	Topic146 = "/mpc_cost_map"
+	Topic147 = "/mpc_cost_map1"
+	Topic148 = "/multi_persion_block"
+	Topic149 = "/mutli_person_block_pub"
+	Topic150 = "/new_imu"
+	Topic151 = "/node_Monitor"
+	Topic152 = "/node_Monitor/clean_pnc/state"
+	Topic153 = "/ob_camera_01/color/camera_info"
+	Topic154 = "/ob_camera_01/color/image_raw"
+	Topic155 = "/ob_camera_01/color/image_raw/compressed"
+	Topic156 = "/ob_camera_01/color/image_raw/compressed/parameter_descriptions"
+	Topic157 = "/ob_camera_01/color/image_raw/compressed/parameter_updates"
+	Topic158 = "/ob_camera_01/color/image_raw/compressedDepth"
+	Topic159 = "/ob_camera_01/color/image_raw/compressedDepth/parameter_descriptions"
+	Topic160 = "/ob_camera_01/color/image_raw/compressedDepth/parameter_updates"
+	Topic161 = "/ob_camera_01/color/image_raw/theora"
+	Topic162 = "/ob_camera_01/color/image_raw/theora/parameter_descriptions"
+	Topic163 = "/ob_camera_01/color/image_raw/theora/parameter_updates"
+	Topic164 = "/ob_camera_01/depth/camera_info"
+	Topic165 = "/ob_camera_01/depth/image_raw"
+	Topic166 = "/ob_camera_01/depth/image_raw/compressed"
+	Topic167 = "/ob_camera_01/depth/image_raw/compressed/parameter_descriptions"
+	Topic168 = "/ob_camera_01/depth/image_raw/compressed/parameter_updates"
+	Topic169 = "/ob_camera_01/depth/image_raw/compressedDepth"
+	Topic170 = "/ob_camera_01/depth/image_raw/compressedDepth/parameter_descriptions"
+	Topic171 = "/ob_camera_01/depth/image_raw/compressedDepth/parameter_updates"
+	Topic172 = "/ob_camera_01/depth/image_raw/theora"
+	Topic173 = "/ob_camera_01/depth/image_raw/theora/parameter_descriptions"
+	Topic174 = "/ob_camera_01/depth/image_raw/theora/parameter_updates"
+	Topic175 = "/ob_camera_01/depth/points"
+	Topic176 = "/ob_camera_02/color/camera_info"
+	Topic177 = "/ob_camera_02/color/image_raw"
+	Topic178 = "/ob_camera_02/color/image_raw/compressed"
+	Topic179 = "/ob_camera_02/color/image_raw/compressed/parameter_descriptions"
+	Topic180 = "/ob_camera_02/color/image_raw/compressed/parameter_updates"
+	Topic181 = "/ob_camera_02/color/image_raw/compressedDepth"
+	Topic182 = "/ob_camera_02/color/image_raw/compressedDepth/parameter_descriptions"
+	Topic183 = "/ob_camera_02/color/image_raw/compressedDepth/parameter_updates"
+	Topic184 = "/ob_camera_02/color/image_raw/theora"
+	Topic185 = "/ob_camera_02/color/image_raw/theora/parameter_descriptions"
+	Topic186 = "/ob_camera_02/color/image_raw/theora/parameter_updates"
+	Topic187 = "/ob_camera_02/depth/camera_info"
+	Topic188 = "/ob_camera_02/depth/image_raw"
+	Topic189 = "/ob_camera_02/depth/image_raw/compressed"
+	Topic190 = "/ob_camera_02/depth/image_raw/compressed/parameter_descriptions"
+	Topic191 = "/ob_camera_02/depth/image_raw/compressed/parameter_updates"
+	Topic192 = "/ob_camera_02/depth/image_raw/compressedDepth"
+	Topic193 = "/ob_camera_02/depth/image_raw/compressedDepth/parameter_descriptions"
+	Topic194 = "/ob_camera_02/depth/image_raw/compressedDepth/parameter_updates"
+	Topic195 = "/ob_camera_02/depth/image_raw/theora"
+	Topic196 = "/ob_camera_02/depth/image_raw/theora/parameter_descriptions"
+	Topic197 = "/ob_camera_02/depth/image_raw/theora/parameter_updates"
+	Topic198 = "/ob_camera_02/depth/points"
+	Topic199 = "/obberc_camera_back_pose"
+	Topic200 = "/obberc_camera_pose"
+	Topic201 = "/obstacle_detection"
+	Topic202 = "/odom"
+	Topic203 = "/odom_jump"
+	Topic204 = "/odom_localization"
+	Topic205 = "/odom_raw"
+	Topic206 = "/old_imu"
+	Topic207 = "/out_wallLine"
+	Topic208 = "/particlecloud"
+	Topic209 = "/pointcloud_topic"
+	Topic210 = "/pole_scan"
+	Topic211 = "/pose_correct_topic"
+	Topic212 = "/preventfalling"
+	Topic213 = "/pro_map_ctrl"
+	Topic214 = "/qs/clean_area"
+	Topic215 = "/qs/start_detectwall_line"
+	Topic216 = "/reference_path"
+	Topic217 = "/robot_add"
+	Topic218 = "/robot_is_slip"
+	Topic219 = "/robot_kidnap_state"
+	Topic220 = "/robot_lost"
+	Topic221 = "/robot_pose"
+	Topic222 = "/robot_pose_tf"
+	Topic223 = "/robot_shock"
+	Topic224 = "/robot_static_state"
+	Topic225 = "/robot_status"
+	Topic226 = "/robot_sub"
+	Topic227 = "/robot_sudden_state"
+	Topic228 = "/room_segmentation_server/cancel"
+	Topic229 = "/room_segmentation_server/feedback"
+	Topic230 = "/room_segmentation_server/goal"
+	Topic231 = "/room_segmentation_server/parameter_descriptions"
+	Topic232 = "/room_segmentation_server/parameter_updates"
+	Topic233 = "/room_segmentation_server/result"
+	Topic234 = "/room_segmentation_server/segmented_map"
+	Topic235 = "/room_segmentation_server/status"
+	Topic236 = "/rosout"
+	Topic237 = "/rosout_agg"
+	Topic238 = "/rviz_task_global_path"
+	Topic239 = "/safety"
+	Topic240 = "/scan"
+	Topic241 = "/scan_back_top"
+	Topic242 = "/scan_cliff"
+	Topic243 = "/scan_front_down"
+	Topic244 = "/scan_front_top"
+	Topic245 = "/scan_map_icp_amcl_node/map_point"
+	Topic246 = "/scan_map_icp_amcl_node/scan_point_transformed"
+	Topic247 = "/segmentation_map_marker"
+	Topic248 = "/sensor_task"
+	Topic249 = "/slip_topic"
+	Topic250 = "/sonar_alarm"
+	Topic251 = "/sonar_list"
+	Topic252 = "/srf_data"
+	Topic253 = "/srf_laser_odometry_node/srf_laser_truncated"
+	Topic254 = "/start_relocate"
+	Topic255 = "/static_scan"
+	Topic256 = "/sudden_stop_state_"
+	Topic257 = "/sunny/run_camera"
+	Topic258 = "/sunny_topic/device_HST007/tof_frame/camera_info"
+	Topic259 = "/sys_info"
+	Topic260 = "/tag_detections_image"
+	Topic261 = "/tag_detections_image/compressed"
+	Topic262 = "/tag_detections_image/compressed/parameter_descriptions"
+	Topic263 = "/tag_detections_image/compressed/parameter_updates"
+	Topic264 = "/tag_detections_image/compressedDepth"
+	Topic265 = "/tag_detections_image/compressedDepth/parameter_descriptions"
+	Topic266 = "/tag_detections_image/compressedDepth/parameter_updates"
+	Topic267 = "/tag_detections_image/theora"
+	Topic268 = "/tag_detections_image/theora/parameter_descriptions"
+	Topic269 = "/tag_detections_image/theora/parameter_updates"
+	Topic270 = "/tag_start"
+	Topic271 = "/target1"
+	Topic272 = "/task"
+	Topic273 = "/task_feedback_info"
+	Topic274 = "/task_global_path"
+	Topic275 = "/tf"
+	Topic276 = "/tf_data_error"
+	Topic277 = "/tf_static"
+	Topic278 = "/udata_fusion_path"
+	Topic279 = "/uploadBag"
+	Topic280 = "/vl_left"
+	Topic281 = "/xd1a_0"
+	Topic282 = "/xd1a_1"
+	Topic283 = "/xd1a_2"
+	Topic284 = "/xd1a_3"
+
+	Rule1   []func(data *std_msgs.Int16MultiArray) string
+	Rule2   []func(data *geometry_msgs.PoseStamped) string
+	Rule3   []func(data *dynamic_reconfigure.ConfigDescription) string
+	Rule4   []func(data *dynamic_reconfigure.Config) string
+	Rule5   []func(data *std_msgs.String) string
+	Rule6   []func(data *geometry_msgs.PoseWithCovarianceStamped) string
+	Rule7   []func(data *std_msgs.String) string
+	Rule8   []func(data *std_msgs.String) string
+	Rule9   []func(data *std_msgs.Bool) string
+	Rule10  []func(data *std_msgs.Int8) string
+	Rule11  []func(data *std_msgs.Int8) string
+	Rule12  []func(data *sensor_msgs.PointCloud2) string
+	Rule13  []func(data *sensor_msgs.BatteryState) string
+	Rule14  []func(data *std_msgs.Int16) string
+	Rule15  []func(data *visualization_msgs.Marker) string
+	Rule16  []func(data *std_msgs.String) string
+	Rule17  []func(data *sensor_msgs.CameraInfo) string
+	Rule18  []func(data *sensor_msgs.Image) string
+	Rule19  []func(data *sensor_msgs.CompressedImage) string
+	Rule20  []func(data *dynamic_reconfigure.ConfigDescription) string
+	Rule21  []func(data *dynamic_reconfigure.Config) string
+	Rule22  []func(data *sensor_msgs.CompressedImage) string
+	Rule23  []func(data *dynamic_reconfigure.ConfigDescription) string
+	Rule24  []func(data *dynamic_reconfigure.Config) string
+	Rule25  []func(data *theora_image_transport.Packet) string
+	Rule26  []func(data *dynamic_reconfigure.ConfigDescription) string
+	Rule27  []func(data *dynamic_reconfigure.Config) string
+	Rule28  []func(data *sensor_msgs.PointCloud2) string
+	Rule29  []func(data *sensor_msgs.CameraInfo) string
+	Rule30  []func(data *sensor_msgs.Image) string
+	Rule31  []func(data *sensor_msgs.CompressedImage) string
+	Rule32  []func(data *dynamic_reconfigure.ConfigDescription) string
+	Rule33  []func(data *dynamic_reconfigure.Config) string
+	Rule34  []func(data *sensor_msgs.CompressedImage) string
+	Rule35  []func(data *dynamic_reconfigure.ConfigDescription) string
+	Rule36  []func(data *dynamic_reconfigure.Config) string
+	Rule37  []func(data *theora_image_transport.Packet) string
+	Rule38  []func(data *dynamic_reconfigure.ConfigDescription) string
+	Rule39  []func(data *dynamic_reconfigure.Config) string
+	Rule40  []func(data *geometry_msgs.PoseStamped) string
+	Rule41  []func(data *geometry_msgs.PoseStamped) string
+	Rule42  []func(data *nav_msgs.Path) string
+	Rule43  []func(data *std_msgs.Int8) string
+	Rule44  []func(data *std_msgs.Bool) string
+	Rule45  []func(data *nav_msgs.Path) string
+	Rule46  []func(data *geometry_msgs.PoseStamped) string
+	Rule47  []func(data *geometry_msgs.PoseStamped) string
+	Rule48  []func(data *geometry_msgs.PoseStamped) string
+	Rule49  []func(data *std_msgs.String) string
+	Rule50  []func(data *visualization_msgs.MarkerArray) string
+	Rule51  []func(data *geometry_msgs.PolygonStamped) string
+	Rule52  []func(data *nav_msgs.OccupancyGrid) string
+	Rule53  []func(data *nav_msgs.OccupancyGrid) string
+	Rule54  []func(data *nav_msgs.OccupancyGrid) string
+	Rule55  []func(data *std_msgs.Float32) string
+	Rule56  []func(data *std_msgs.Int32) string
+	Rule57  []func(data *nav_msgs.Path) string
+	Rule58  []func(data *clean_msg.ErrorInfo) string
+	Rule59  []func(data *nav_msgs.OccupancyGrid) string
+	Rule60  []func(data *nav_msgs.OccupancyGrid) string
+	Rule61  []func(data *nav_msgs.OccupancyGrid) string
+	Rule62  []func(data *nav_msgs.OccupancyGrid) string
+	Rule63  []func(data *nav_msgs.OccupancyGrid) string
+	Rule64  []func(data *nav_msgs.OccupancyGrid) string
+	Rule65  []func(data *std_msgs.String) string
+	Rule66  []func(data *std_msgs.Bool) string
+	Rule67  []func(data *std_msgs.Bool) string
+	Rule68  []func(data *geometry_msgs.PolygonStamped) string
+	Rule69  []func(data *geometry_msgs.PointStamped) string
+	Rule70  []func(data *std_msgs.String) string
+	Rule71  []func(data *geometry_msgs.Twist) string
+	Rule72  []func(data *geometry_msgs.Twist) string
+	Rule73  []func(data *nav_msgs.Path) string
+	Rule74  []func(data *common_msgs.CreateMapInfo) string
+	Rule75  []func(data *geometry_msgs.Twist) string
+	Rule76  []func(data *common_msgs.SensorStatus) string
+	Rule77  []func(data *geometry_msgs.PoseArray) string
+	Rule78  []func(data *nav_msgs.Path) string
+	Rule79  []func(data *common_msgs.IdentifierObjsInfo) string
+	Rule80  []func(data *common_msgs.McuDiagnostic) string
+	Rule81  []func(data *diagnostic_msgs.DiagnosticArray) string
+	Rule82  []func(data *std_msgs.Int8) string
+	Rule83  []func(data *std_msgs.Int16) string
+	Rule84  []func(data *geometry_msgs.Vector3Stamped) string
+	Rule85  []func(data *sensor_msgs.LaserScan) string
+	Rule86  []func(data *sensor_msgs.PointCloud2) string
+	Rule87  []func(data *std_msgs.String) string
+	Rule88  []func(data *std_msgs.String) string
+	Rule89  []func(data *std_msgs.String) string
+	Rule90  []func(data *std_msgs.Int32) string
+	Rule91  []func(data *common_msgs.TaskInfo) string
+	Rule92  []func(data *common_msgs.MapInfo) string
+	Rule93  []func(data *nav_msgs.Path) string
+	Rule94  []func(data *common_msgs.VideoStream) string
+	Rule95  []func(data *sensor_msgs.PointCloud2) string
+	Rule96  []func(data *nav_msgs.Path) string
+	Rule97  []func(data *sensor_msgs.PointCloud2) string
+	Rule98  []func(data *sensor_msgs.PointCloud2) string
+	Rule99  []func(data *sensor_msgs.PointCloud2) string
+	Rule100 []func(data *geometry_msgs.PointStamped) string
+	Rule101 []func(data *nav_msgs.Path) string
+	Rule102 []func(data *geometry_msgs.PoseStamped) string
+	Rule103 []func(data *geometry_msgs.PoseWithCovarianceStamped) string
+	Rule104 []func(data *geometry_msgs.Pose) string
+	Rule105 []func(data *std_msgs.String) string
+	Rule106 []func(data *std_msgs.String) string
+	Rule107 []func(data *std_msgs.String) string
+	Rule108 []func(data *std_msgs.String) string
+	Rule109 []func(data *std_msgs.Float64) string
+	Rule110 []func(data *std_msgs.String) string
+	Rule111 []func(data *std_msgs.String) string
+	Rule112 []func(data *sensor_msgs.Imu) string
+	Rule113 []func(data *std_msgs.String) string
+	Rule114 []func(data *std_msgs.Int8) string
+	Rule115 []func(data *std_msgs.Int16) string
+	Rule116 []func(data *std_msgs.String) string
+	Rule117 []func(data *std_msgs.String) string
+	Rule118 []func(data *geometry_msgs.PoseWithCovarianceStamped) string
+	Rule119 []func(data *sensor_msgs.JointState) string
+	Rule120 []func(data *std_msgs.String) string
+	Rule121 []func(data *cartographer_ros_msgs.LandmarkList) string
+	Rule122 []func(data *nav_msgs.Odometry) string
+	Rule123 []func(data *sensor_msgs.LaserScan) string
+	Rule124 []func(data *std_msgs.String) string
+	Rule125 []func(data *nav_msgs.Path) string
+	Rule126 []func(data *std_msgs.String) string
+	Rule127 []func(data *std_msgs.String) string
+	Rule128 []func(data *std_msgs.String) string
+	Rule129 []func(data *std_msgs.String) string
+	Rule130 []func(data *geometry_msgs.PoseWithCovarianceStamped) string
+	Rule131 []func(data *std_msgs.String) string
+	Rule132 []func(data *std_msgs.String) string
+	Rule133 []func(data *common_msgs.LocateInfo) string
+	Rule134 []func(data *std_msgs.Bool) string
+	Rule135 []func(data *std_msgs.Float64MultiArray) string
+	Rule136 []func(data *std_msgs.String) string
+	Rule137 []func(data *std_msgs.String) string
+	Rule138 []func(data *nav_msgs.OccupancyGrid) string
+	Rule139 []func(data *std_msgs.String) string
+	Rule140 []func(data *nav_msgs.Path) string
+	Rule141 []func(data *std_msgs.String) string
+	Rule142 []func(data *std_msgs.String) string
+	Rule143 []func(data *nav_msgs.MapMetaData) string
+	Rule144 []func(data *nav_msgs.Path) string
+	Rule145 []func(data *geometry_msgs.PoseStamped) string
+	Rule146 []func(data *nav_msgs.OccupancyGrid) string
+	Rule147 []func(data *nav_msgs.OccupancyGrid) string
+	Rule148 []func(data *std_msgs.String) string
+	Rule149 []func(data *std_msgs.String) string
+	Rule150 []func(data *std_msgs.String) string
+	Rule151 []func(data *std_msgs.String) string
+	Rule152 []func(data *std_msgs.Bool) string
+	Rule153 []func(data *sensor_msgs.CameraInfo) string
+	Rule154 []func(data *sensor_msgs.Image) string
+	Rule155 []func(data *sensor_msgs.CompressedImage) string
+	Rule156 []func(data *dynamic_reconfigure.ConfigDescription) string
+	Rule157 []func(data *dynamic_reconfigure.Config) string
+	Rule158 []func(data *sensor_msgs.CompressedImage) string
+	Rule159 []func(data *dynamic_reconfigure.ConfigDescription) string
+	Rule160 []func(data *dynamic_reconfigure.Config) string
+	Rule161 []func(data *theora_image_transport.Packet) string
+	Rule162 []func(data *dynamic_reconfigure.ConfigDescription) string
+	Rule163 []func(data *dynamic_reconfigure.Config) string
+	Rule164 []func(data *sensor_msgs.CameraInfo) string
+	Rule165 []func(data *sensor_msgs.Image) string
+	Rule166 []func(data *sensor_msgs.CompressedImage) string
+	Rule167 []func(data *dynamic_reconfigure.ConfigDescription) string
+	Rule168 []func(data *dynamic_reconfigure.Config) string
+	Rule169 []func(data *sensor_msgs.CompressedImage) string
+	Rule170 []func(data *dynamic_reconfigure.ConfigDescription) string
+	Rule171 []func(data *dynamic_reconfigure.Config) string
+	Rule172 []func(data *theora_image_transport.Packet) string
+	Rule173 []func(data *dynamic_reconfigure.ConfigDescription) string
+	Rule174 []func(data *dynamic_reconfigure.Config) string
+	Rule175 []func(data *sensor_msgs.PointCloud2) string
+	Rule176 []func(data *sensor_msgs.CameraInfo) string
+	Rule177 []func(data *sensor_msgs.Image) string
+	Rule178 []func(data *sensor_msgs.CompressedImage) string
+	Rule179 []func(data *dynamic_reconfigure.ConfigDescription) string
+	Rule180 []func(data *dynamic_reconfigure.Config) string
+	Rule181 []func(data *sensor_msgs.CompressedImage) string
+	Rule182 []func(data *dynamic_reconfigure.ConfigDescription) string
+	Rule183 []func(data *dynamic_reconfigure.Config) string
+	Rule184 []func(data *theora_image_transport.Packet) string
+	Rule185 []func(data *dynamic_reconfigure.ConfigDescription) string
+	Rule186 []func(data *dynamic_reconfigure.Config) string
+	Rule187 []func(data *sensor_msgs.CameraInfo) string
+	Rule188 []func(data *sensor_msgs.Image) string
+	Rule189 []func(data *sensor_msgs.CompressedImage) string
+	Rule190 []func(data *dynamic_reconfigure.ConfigDescription) string
+	Rule191 []func(data *dynamic_reconfigure.Config) string
+	Rule192 []func(data *sensor_msgs.CompressedImage) string
+	Rule193 []func(data *dynamic_reconfigure.ConfigDescription) string
+	Rule194 []func(data *dynamic_reconfigure.Config) string
+	Rule195 []func(data *theora_image_transport.Packet) string
+	Rule196 []func(data *dynamic_reconfigure.ConfigDescription) string
+	Rule197 []func(data *dynamic_reconfigure.Config) string
+	Rule198 []func(data *sensor_msgs.PointCloud2) string
+	Rule199 []func(data *geometry_msgs.PoseStamped) string
+	Rule200 []func(data *geometry_msgs.PoseStamped) string
+	Rule201 []func(data *std_msgs.UInt8) string
+	Rule202 []func(data *nav_msgs.Odometry) string
+	Rule203 []func(data *std_msgs.String) string
+	Rule204 []func(data *std_msgs.String) string
+	Rule205 []func(data *nav_msgs.Odometry) string
+	Rule206 []func(data *sensor_msgs.Imu) string
+	Rule207 []func(data *sensor_msgs.PointCloud2) string
+	Rule208 []func(data *geometry_msgs.PoseArray) string
+	Rule209 []func(data *sensor_msgs.PointCloud2) string
+	Rule210 []func(data *sensor_msgs.LaserScan) string
+	Rule211 []func(data *geometry_msgs.PoseWithCovarianceStamped) string
+	Rule212 []func(data *geometry_msgs.Vector3Stamped) string
+	Rule213 []func(data *std_msgs.String) string
+	Rule214 []func(data *common_msgs.FunctionAreas) string
+	Rule215 []func(data *std_msgs.Bool) string
+	Rule216 []func(data *nav_msgs.Path) string
+	Rule217 []func(data *std_msgs.Float64MultiArray) string
+	Rule218 []func(data *std_msgs.String) string
+	Rule219 []func(data *std_msgs.String) string
+	Rule220 []func(data *std_msgs.String) string
+	Rule221 []func(data *geometry_msgs.PoseStamped) string
+	Rule222 []func(data *geometry_msgs.PoseWithCovarianceStamped) string
+	Rule223 []func(data *std_msgs.String) string
+	Rule224 []func(data *std_msgs.String) string
+	Rule225 []func(data *localization_monitor.RobotStatus) string
+	Rule226 []func(data *std_msgs.Float64MultiArray) string
+	Rule227 []func(data *std_msgs.String) string
+	Rule228 []func(data *actionlib_msgs.GoalID) string
+	Rule229 []func(data *ipa_building_msgs.MapSegmentationActionFeedback) string
+	Rule230 []func(data *ipa_building_msgs.MapSegmentationActionGoal) string
+	Rule231 []func(data *dynamic_reconfigure.ConfigDescription) string
+	Rule232 []func(data *dynamic_reconfigure.Config) string
+	Rule233 []func(data *ipa_building_msgs.MapSegmentationActionResult) string
+	Rule234 []func(data *nav_msgs.OccupancyGrid) string
+	Rule235 []func(data *actionlib_msgs.GoalStatusArray) string
+	Rule236 []func(data *rosgraph_msgs.Log) string
+	Rule237 []func(data *rosgraph_msgs.Log) string
+	Rule238 []func(data *nav_msgs.Path) string
+	Rule239 []func(data *geometry_msgs.Vector3Stamped) string
+	Rule240 []func(data *sensor_msgs.LaserScan) string
+	Rule241 []func(data *sensor_msgs.LaserScan) string
+	Rule242 []func(data *sensor_msgs.LaserScan) string
+	Rule243 []func(data *sensor_msgs.LaserScan) string
+	Rule244 []func(data *sensor_msgs.LaserScan) string
+	Rule245 []func(data *sensor_msgs.PointCloud2) string
+	Rule246 []func(data *sensor_msgs.PointCloud2) string
+	Rule247 []func(data *visualization_msgs.MarkerArray) string
+	Rule248 []func(data *common_msgs.SensorTask) string
+	Rule249 []func(data *std_msgs.String) string
+	Rule250 []func(data *geometry_msgs.Vector3Stamped) string
+	Rule251 []func(data *common_msgs.SonarList) string
+	Rule252 []func(data *nav_msgs.Odometry) string
+	Rule253 []func(data *sensor_msgs.LaserScan) string
+	Rule254 []func(data *std_msgs.Bool) string
+	Rule255 []func(data *sensor_msgs.LaserScan) string
+	Rule256 []func(data *std_msgs.String) string
+	Rule257 []func(data *std_msgs.Bool) string
+	Rule258 []func(data *sensor_msgs.CameraInfo) string
+	Rule259 []func(data *common_msgs.SysInfo) string
+	Rule260 []func(data *sensor_msgs.Image) string
+	Rule261 []func(data *sensor_msgs.CompressedImage) string
+	Rule262 []func(data *dynamic_reconfigure.ConfigDescription) string
+	Rule263 []func(data *dynamic_reconfigure.Config) string
+	Rule264 []func(data *sensor_msgs.CompressedImage) string
+	Rule265 []func(data *dynamic_reconfigure.ConfigDescription) string
+	Rule266 []func(data *dynamic_reconfigure.Config) string
+	Rule267 []func(data *theora_image_transport.Packet) string
+	Rule268 []func(data *dynamic_reconfigure.ConfigDescription) string
+	Rule269 []func(data *dynamic_reconfigure.Config) string
+	Rule270 []func(data *std_msgs.Bool) string
+	Rule271 []func(data *geometry_msgs.PoseStamped) string
+	Rule272 []func(data *geometry_msgs.Vector3Stamped) string
+	Rule273 []func(data *common_msgs.TaskFeedbackInfo) string
+	Rule274 []func(data *common_msgs.Points) string
+	Rule275 []func(data *tf2_msgs.TFMessage) string
+	Rule276 []func(data *std_msgs.String) string
+	Rule277 []func(data *tf2_msgs.TFMessage) string
+	Rule278 []func(data *nav_msgs.Path) string
+	Rule279 []func(data *common_msgs.UpLoadFileList) string
+	Rule280 []func(data *sensor_msgs.Range) string
+	Rule281 []func(data *sensor_msgs.LaserScan) string
+	Rule282 []func(data *sensor_msgs.LaserScan) string
+	Rule283 []func(data *sensor_msgs.LaserScan) string
+	Rule284 []func(data *sensor_msgs.LaserScan) string
+
+	AllTopicsNumber = len(AllTopics)
+)
+
+func InitTriggerConfig() {
+	config.OssMutex.Lock()
+	defer config.OssMutex.Unlock()
+	triggerLocalPathsMapTriggerId := make(map[string]string)
+	c_log.GlobalLogger.Info("主节点加载触发器插件 - 开始。")
+	// 1 获取数采任务的触发器列表
+	cloudTriggers := &config.PlatformConfig.TaskTriggers
+	// 2 获取本地触发器列表(触发器目录的一级子目录为【触发器ID_触发器Label】)
+	localTriggerIds := util.GetFirstLevelSubdirectories(config.CloudConfig.TriggersDir)
+	// 3 对比触发器列表,本地没有的则下载
+	for _, trigger := range *cloudTriggers {
+		id := util.ToString(trigger.TriggerId)
+		hasIdDir := slices.Contains(localTriggerIds, id) // 改成了 slices 工具库
+		triggerLocalDir := config.CloudConfig.TriggersDir + id + "/"
+		hasLabelSo, soPaths := util.CheckSoFilesInDirectory(triggerLocalDir)
+		var triggerLocalPath string
+		if hasIdDir && hasLabelSo { // 已存在的触发器需要判断是否大小一致
+			triggerLocalPath = soPaths[0]
+			ossSize, _ := util.GetOSSFileSize(config.OssBucket, trigger.TriggerScriptPath)
+			localSize, _ := util.GetFileSize(triggerLocalPath)
+			if ossSize == localSize {
+				c_log.GlobalLogger.Info("触发器插件 ", triggerLocalPath, " 存在且与云端触发器大小一致。")
+				triggerLocalPathsMapTriggerId[triggerLocalPath] = id
+				continue
+			}
+		}
+		label := util.GetFileNameWithoutExtension(config.CloudConfig.TriggersDir + trigger.TriggerScriptPath)
+		triggerLocalPath = config.CloudConfig.TriggersDir + id + "/" + label + ".so"
+		c_log.GlobalLogger.Info("开始下载触发器插件从 ", trigger.TriggerScriptPath, " 到 ", triggerLocalPath)
+		_ = util.CreateParentDir(triggerLocalPath)
+		for {
+			if err := config.OssBucket.GetObjectToFile(trigger.TriggerScriptPath, triggerLocalPath); err != nil {
+				c_log.GlobalLogger.Error("下载触发器插件失败,再次尝试:", err)
+				continue
+			}
+			break
+		}
+		triggerLocalPathsMapTriggerId[triggerLocalPath] = id
+	}
+
+	success := 0
+	// 加载所有触发器的文件
+	for triggerLocalPath, triggerId := range triggerLocalPathsMapTriggerId {
+		// 载入插件到数组
+		open, err := plugin.Open(triggerLocalPath)
+		if err != nil {
+			c_log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "失败。", err)
+			continue
+		}
+		topic0, err := open.Lookup("Topic")
+		if err != nil {
+			c_log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "中的Topic方法失败。", err)
+			continue
+		}
+		topic1, ok := topic0.(func() string)
+		if ok != true {
+			c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func() string):", err)
+			continue
+		}
+		topic2 := topic1()
+		rule, err := open.Lookup("Rule")
+		if err != nil {
+			c_log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "中的Rule方法失败。", err)
+			continue
+		}
+
+		if Topic1 == topic2 { // 1
+			if f, ok1 := rule.(func(data *std_msgs.Int16MultiArray) string); ok1 {
+				Rule1 = append(Rule1, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic2 == topic2 { // 2
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseStamped) string); ok1 {
+				Rule2 = append(Rule2, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic3 == topic2 { // 3
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule3 = append(Rule3, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic4 == topic2 { // 4
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule4 = append(Rule4, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic5 == topic2 { // 5
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule5 = append(Rule5, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic6 == topic2 { // 6
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseWithCovarianceStamped) string); ok1 {
+				Rule6 = append(Rule6, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic7 == topic2 { // 7
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule7 = append(Rule7, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic8 == topic2 { // 8
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule8 = append(Rule8, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic9 == topic2 { // 9
+			if f, ok1 := rule.(func(data *std_msgs.Bool) string); ok1 {
+				Rule9 = append(Rule9, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic10 == topic2 { // 10
+			if f, ok1 := rule.(func(data *std_msgs.Int8) string); ok1 {
+				Rule10 = append(Rule10, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic11 == topic2 { // 11
+			if f, ok1 := rule.(func(data *std_msgs.Int8) string); ok1 {
+				Rule11 = append(Rule11, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic12 == topic2 { // 12
+			if f, ok1 := rule.(func(data *sensor_msgs.PointCloud2) string); ok1 {
+				Rule12 = append(Rule12, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic13 == topic2 { // 13
+			if f, ok1 := rule.(func(data *sensor_msgs.BatteryState) string); ok1 {
+				Rule13 = append(Rule13, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic14 == topic2 { // 14
+			if f, ok1 := rule.(func(data *std_msgs.Int16) string); ok1 {
+				Rule14 = append(Rule14, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic15 == topic2 { // 15
+			if f, ok1 := rule.(func(data *visualization_msgs.Marker) string); ok1 {
+				Rule15 = append(Rule15, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic16 == topic2 { // 16
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule16 = append(Rule16, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic17 == topic2 { // 17
+			if f, ok1 := rule.(func(data *sensor_msgs.CameraInfo) string); ok1 {
+				Rule17 = append(Rule17, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic18 == topic2 { // 18
+			if f, ok1 := rule.(func(data *sensor_msgs.Image) string); ok1 {
+				Rule18 = append(Rule18, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic19 == topic2 { // 19
+			if f, ok1 := rule.(func(data *sensor_msgs.CompressedImage) string); ok1 {
+				Rule19 = append(Rule19, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic20 == topic2 { // 20
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule20 = append(Rule20, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic21 == topic2 { // 21
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule21 = append(Rule21, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic22 == topic2 { // 22
+			if f, ok1 := rule.(func(data *sensor_msgs.CompressedImage) string); ok1 {
+				Rule22 = append(Rule22, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic23 == topic2 { // 23
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule23 = append(Rule23, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic24 == topic2 { // 24
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule24 = append(Rule24, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic25 == topic2 { // 25
+			if f, ok1 := rule.(func(data *theora_image_transport.Packet) string); ok1 {
+				Rule25 = append(Rule25, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic26 == topic2 { // 26
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule26 = append(Rule26, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic27 == topic2 { // 27
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule27 = append(Rule27, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic28 == topic2 { // 28
+			if f, ok1 := rule.(func(data *sensor_msgs.PointCloud2) string); ok1 {
+				Rule28 = append(Rule28, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic29 == topic2 { // 29
+			if f, ok1 := rule.(func(data *sensor_msgs.CameraInfo) string); ok1 {
+				Rule29 = append(Rule29, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic30 == topic2 { // 30
+			if f, ok1 := rule.(func(data *sensor_msgs.Image) string); ok1 {
+				Rule30 = append(Rule30, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic31 == topic2 { // 31
+			if f, ok1 := rule.(func(data *sensor_msgs.CompressedImage) string); ok1 {
+				Rule31 = append(Rule31, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic32 == topic2 { // 32
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule32 = append(Rule32, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic33 == topic2 { // 33
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule33 = append(Rule33, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic34 == topic2 { // 34
+			if f, ok1 := rule.(func(data *sensor_msgs.CompressedImage) string); ok1 {
+				Rule34 = append(Rule34, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic35 == topic2 { // 35
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule35 = append(Rule35, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic36 == topic2 { // 36
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule36 = append(Rule36, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic37 == topic2 { // 37
+			if f, ok1 := rule.(func(data *theora_image_transport.Packet) string); ok1 {
+				Rule37 = append(Rule37, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic38 == topic2 { // 38
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule38 = append(Rule38, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic39 == topic2 { // 39
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule39 = append(Rule39, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic40 == topic2 { // 40
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseStamped) string); ok1 {
+				Rule40 = append(Rule40, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic41 == topic2 { // 41
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseStamped) string); ok1 {
+				Rule41 = append(Rule41, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic42 == topic2 { // 42
+			if f, ok1 := rule.(func(data *nav_msgs.Path) string); ok1 {
+				Rule42 = append(Rule42, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic43 == topic2 { // 43
+			if f, ok1 := rule.(func(data *std_msgs.Int8) string); ok1 {
+				Rule43 = append(Rule43, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic44 == topic2 { // 44
+			if f, ok1 := rule.(func(data *std_msgs.Bool) string); ok1 {
+				Rule44 = append(Rule44, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic45 == topic2 { // 45
+			if f, ok1 := rule.(func(data *nav_msgs.Path) string); ok1 {
+				Rule45 = append(Rule45, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic46 == topic2 { // 46
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseStamped) string); ok1 {
+				Rule46 = append(Rule46, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic47 == topic2 { // 47
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseStamped) string); ok1 {
+				Rule47 = append(Rule47, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic48 == topic2 { // 48
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseStamped) string); ok1 {
+				Rule48 = append(Rule48, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic49 == topic2 { // 49
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule49 = append(Rule49, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic50 == topic2 { // 50
+			if f, ok1 := rule.(func(data *visualization_msgs.MarkerArray) string); ok1 {
+				Rule50 = append(Rule50, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic51 == topic2 { // 51
+			if f, ok1 := rule.(func(data *geometry_msgs.PolygonStamped) string); ok1 {
+				Rule51 = append(Rule51, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic52 == topic2 { // 52
+			if f, ok1 := rule.(func(data *nav_msgs.OccupancyGrid) string); ok1 {
+				Rule52 = append(Rule52, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic53 == topic2 { // 53
+			if f, ok1 := rule.(func(data *nav_msgs.OccupancyGrid) string); ok1 {
+				Rule53 = append(Rule53, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic54 == topic2 { // 54
+			if f, ok1 := rule.(func(data *nav_msgs.OccupancyGrid) string); ok1 {
+				Rule54 = append(Rule54, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic55 == topic2 { // 55
+			if f, ok1 := rule.(func(data *std_msgs.Float32) string); ok1 {
+				Rule55 = append(Rule55, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic56 == topic2 { // 56
+			if f, ok1 := rule.(func(data *std_msgs.Int32) string); ok1 {
+				Rule56 = append(Rule56, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic57 == topic2 { // 57
+			if f, ok1 := rule.(func(data *nav_msgs.Path) string); ok1 {
+				Rule57 = append(Rule57, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic58 == topic2 { // 58
+			if f, ok1 := rule.(func(data *clean_msg.ErrorInfo) string); ok1 {
+				Rule58 = append(Rule58, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic59 == topic2 { // 59
+			if f, ok1 := rule.(func(data *nav_msgs.OccupancyGrid) string); ok1 {
+				Rule59 = append(Rule59, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic60 == topic2 { // 60
+			if f, ok1 := rule.(func(data *nav_msgs.OccupancyGrid) string); ok1 {
+				Rule60 = append(Rule60, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic61 == topic2 { // 61
+			if f, ok1 := rule.(func(data *nav_msgs.OccupancyGrid) string); ok1 {
+				Rule61 = append(Rule61, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic62 == topic2 { // 62
+			if f, ok1 := rule.(func(data *nav_msgs.OccupancyGrid) string); ok1 {
+				Rule62 = append(Rule62, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic63 == topic2 { // 63
+			if f, ok1 := rule.(func(data *nav_msgs.OccupancyGrid) string); ok1 {
+				Rule63 = append(Rule63, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic64 == topic2 { // 64
+			if f, ok1 := rule.(func(data *nav_msgs.OccupancyGrid) string); ok1 {
+				Rule64 = append(Rule64, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic65 == topic2 { // 65
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule65 = append(Rule65, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic66 == topic2 { // 66
+			if f, ok1 := rule.(func(data *std_msgs.Bool) string); ok1 {
+				Rule66 = append(Rule66, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic67 == topic2 { // 67
+			if f, ok1 := rule.(func(data *std_msgs.Bool) string); ok1 {
+				Rule67 = append(Rule67, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic68 == topic2 { // 68
+			if f, ok1 := rule.(func(data *geometry_msgs.PolygonStamped) string); ok1 {
+				Rule68 = append(Rule68, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic69 == topic2 { // 69
+			if f, ok1 := rule.(func(data *geometry_msgs.PointStamped) string); ok1 {
+				Rule69 = append(Rule69, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic70 == topic2 { // 70
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule70 = append(Rule70, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic71 == topic2 { // 71
+			if f, ok1 := rule.(func(data *geometry_msgs.Twist) string); ok1 {
+				Rule71 = append(Rule71, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic72 == topic2 { // 72
+			if f, ok1 := rule.(func(data *geometry_msgs.Twist) string); ok1 {
+				Rule72 = append(Rule72, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic73 == topic2 { // 73
+			if f, ok1 := rule.(func(data *nav_msgs.Path) string); ok1 {
+				Rule73 = append(Rule73, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic74 == topic2 { // 74
+			if f, ok1 := rule.(func(data *common_msgs.CreateMapInfo) string); ok1 {
+				Rule74 = append(Rule74, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic75 == topic2 { // 75
+			if f, ok1 := rule.(func(data *geometry_msgs.Twist) string); ok1 {
+				Rule75 = append(Rule75, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic76 == topic2 { // 76
+			if f, ok1 := rule.(func(data *common_msgs.SensorStatus) string); ok1 {
+				Rule76 = append(Rule76, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic77 == topic2 { // 77
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseArray) string); ok1 {
+				Rule77 = append(Rule77, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic78 == topic2 { // 78
+			if f, ok1 := rule.(func(data *nav_msgs.Path) string); ok1 {
+				Rule78 = append(Rule78, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic79 == topic2 { // 79
+			if f, ok1 := rule.(func(data *common_msgs.IdentifierObjsInfo) string); ok1 {
+				Rule79 = append(Rule79, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic80 == topic2 { // 80
+			if f, ok1 := rule.(func(data *common_msgs.McuDiagnostic) string); ok1 {
+				Rule80 = append(Rule80, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic81 == topic2 { // 81
+			if f, ok1 := rule.(func(data *diagnostic_msgs.DiagnosticArray) string); ok1 {
+				Rule81 = append(Rule81, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic82 == topic2 { // 82
+			if f, ok1 := rule.(func(data *std_msgs.Int8) string); ok1 {
+				Rule82 = append(Rule82, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic83 == topic2 { // 83
+			if f, ok1 := rule.(func(data *std_msgs.Int16) string); ok1 {
+				Rule83 = append(Rule83, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic84 == topic2 { // 84
+			if f, ok1 := rule.(func(data *geometry_msgs.Vector3Stamped) string); ok1 {
+				Rule84 = append(Rule84, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic85 == topic2 { // 85
+			if f, ok1 := rule.(func(data *sensor_msgs.LaserScan) string); ok1 {
+				Rule85 = append(Rule85, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic86 == topic2 { // 86
+			if f, ok1 := rule.(func(data *sensor_msgs.PointCloud2) string); ok1 {
+				Rule86 = append(Rule86, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic87 == topic2 { // 87
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule87 = append(Rule87, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic88 == topic2 { // 88
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule88 = append(Rule88, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic89 == topic2 { // 89
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule89 = append(Rule89, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic90 == topic2 { // 90
+			if f, ok1 := rule.(func(data *std_msgs.Int32) string); ok1 {
+				Rule90 = append(Rule90, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic91 == topic2 { // 91
+			if f, ok1 := rule.(func(data *common_msgs.TaskInfo) string); ok1 {
+				Rule91 = append(Rule91, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic92 == topic2 { // 92
+			if f, ok1 := rule.(func(data *common_msgs.MapInfo) string); ok1 {
+				Rule92 = append(Rule92, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic93 == topic2 { // 93
+			if f, ok1 := rule.(func(data *nav_msgs.Path) string); ok1 {
+				Rule93 = append(Rule93, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic94 == topic2 { // 94
+			if f, ok1 := rule.(func(data *common_msgs.VideoStream) string); ok1 {
+				Rule94 = append(Rule94, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic95 == topic2 { // 95
+			if f, ok1 := rule.(func(data *sensor_msgs.PointCloud2) string); ok1 {
+				Rule95 = append(Rule95, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic96 == topic2 { // 96
+			if f, ok1 := rule.(func(data *nav_msgs.Path) string); ok1 {
+				Rule96 = append(Rule96, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic97 == topic2 { // 97
+			if f, ok1 := rule.(func(data *sensor_msgs.PointCloud2) string); ok1 {
+				Rule97 = append(Rule97, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic98 == topic2 { // 98
+			if f, ok1 := rule.(func(data *sensor_msgs.PointCloud2) string); ok1 {
+				Rule98 = append(Rule98, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic99 == topic2 { // 99
+			if f, ok1 := rule.(func(data *sensor_msgs.PointCloud2) string); ok1 {
+				Rule99 = append(Rule99, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic100 == topic2 { // 100
+			if f, ok1 := rule.(func(data *geometry_msgs.PointStamped) string); ok1 {
+				Rule100 = append(Rule100, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic101 == topic2 { // 101
+			if f, ok1 := rule.(func(data *nav_msgs.Path) string); ok1 {
+				Rule101 = append(Rule101, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic102 == topic2 { // 102
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseStamped) string); ok1 {
+				Rule102 = append(Rule102, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic103 == topic2 { // 103
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseWithCovarianceStamped) string); ok1 {
+				Rule103 = append(Rule103, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic104 == topic2 { // 104
+			if f, ok1 := rule.(func(data *geometry_msgs.Pose) string); ok1 {
+				Rule104 = append(Rule104, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic105 == topic2 { // 105
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule105 = append(Rule105, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic106 == topic2 { // 106
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule106 = append(Rule106, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic107 == topic2 { // 107
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule107 = append(Rule107, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic108 == topic2 { // 108
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule108 = append(Rule108, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic109 == topic2 { // 109
+			if f, ok1 := rule.(func(data *std_msgs.Float64) string); ok1 {
+				Rule109 = append(Rule109, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic110 == topic2 { // 110
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule110 = append(Rule110, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic111 == topic2 { // 111
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule111 = append(Rule111, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic112 == topic2 { // 112
+			if f, ok1 := rule.(func(data *sensor_msgs.Imu) string); ok1 {
+				Rule112 = append(Rule112, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic113 == topic2 { // 113
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule113 = append(Rule113, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic114 == topic2 { // 114
+			if f, ok1 := rule.(func(data *std_msgs.Int8) string); ok1 {
+				Rule114 = append(Rule114, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic115 == topic2 { // 115
+			if f, ok1 := rule.(func(data *std_msgs.Int16) string); ok1 {
+				Rule115 = append(Rule115, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic116 == topic2 { // 116
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule116 = append(Rule116, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic117 == topic2 { // 117
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule117 = append(Rule117, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic118 == topic2 { // 118
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseWithCovarianceStamped) string); ok1 {
+				Rule118 = append(Rule118, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic119 == topic2 { // 119
+			if f, ok1 := rule.(func(data *sensor_msgs.JointState) string); ok1 {
+				Rule119 = append(Rule119, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic120 == topic2 { // 120
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule120 = append(Rule120, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic121 == topic2 { // 121
+			if f, ok1 := rule.(func(data *cartographer_ros_msgs.LandmarkList) string); ok1 {
+				Rule121 = append(Rule121, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic122 == topic2 { // 122
+			if f, ok1 := rule.(func(data *nav_msgs.Odometry) string); ok1 {
+				Rule122 = append(Rule122, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic123 == topic2 { // 123
+			if f, ok1 := rule.(func(data *sensor_msgs.LaserScan) string); ok1 {
+				Rule123 = append(Rule123, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic124 == topic2 { // 124
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule124 = append(Rule124, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic125 == topic2 { // 125
+			if f, ok1 := rule.(func(data *nav_msgs.Path) string); ok1 {
+				Rule125 = append(Rule125, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic126 == topic2 { // 126
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule126 = append(Rule126, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic127 == topic2 { // 127
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule127 = append(Rule127, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic128 == topic2 { // 128
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule128 = append(Rule128, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic129 == topic2 { // 129
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule129 = append(Rule129, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic130 == topic2 { // 130
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseWithCovarianceStamped) string); ok1 {
+				Rule130 = append(Rule130, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic131 == topic2 { // 131
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule131 = append(Rule131, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic132 == topic2 { // 132
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule132 = append(Rule132, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic133 == topic2 { // 133
+			if f, ok1 := rule.(func(data *common_msgs.LocateInfo) string); ok1 {
+				Rule133 = append(Rule133, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic134 == topic2 { // 134
+			if f, ok1 := rule.(func(data *std_msgs.Bool) string); ok1 {
+				Rule134 = append(Rule134, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic135 == topic2 { // 135
+			if f, ok1 := rule.(func(data *std_msgs.Float64MultiArray) string); ok1 {
+				Rule135 = append(Rule135, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic136 == topic2 { // 136
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule136 = append(Rule136, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic137 == topic2 { // 137
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule137 = append(Rule137, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic138 == topic2 { // 138
+			if f, ok1 := rule.(func(data *nav_msgs.OccupancyGrid) string); ok1 {
+				Rule138 = append(Rule138, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic139 == topic2 { // 139
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule139 = append(Rule139, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic140 == topic2 { // 140
+			if f, ok1 := rule.(func(data *nav_msgs.Path) string); ok1 {
+				Rule140 = append(Rule140, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic141 == topic2 { // 141
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule141 = append(Rule141, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic142 == topic2 { // 142
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule142 = append(Rule142, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic143 == topic2 { // 143
+			if f, ok1 := rule.(func(data *nav_msgs.MapMetaData) string); ok1 {
+				Rule143 = append(Rule143, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic144 == topic2 { // 144
+			if f, ok1 := rule.(func(data *nav_msgs.Path) string); ok1 {
+				Rule144 = append(Rule144, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic145 == topic2 { // 145
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseStamped) string); ok1 {
+				Rule145 = append(Rule145, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic146 == topic2 { // 146
+			if f, ok1 := rule.(func(data *nav_msgs.OccupancyGrid) string); ok1 {
+				Rule146 = append(Rule146, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic147 == topic2 { // 147
+			if f, ok1 := rule.(func(data *nav_msgs.OccupancyGrid) string); ok1 {
+				Rule147 = append(Rule147, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic148 == topic2 { // 148
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule148 = append(Rule148, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic149 == topic2 { // 149
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule149 = append(Rule149, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic150 == topic2 { // 150
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule150 = append(Rule150, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic151 == topic2 { // 151
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule151 = append(Rule151, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic152 == topic2 { // 152
+			if f, ok1 := rule.(func(data *std_msgs.Bool) string); ok1 {
+				Rule152 = append(Rule152, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic153 == topic2 { // 153
+			if f, ok1 := rule.(func(data *sensor_msgs.CameraInfo) string); ok1 {
+				Rule153 = append(Rule153, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic154 == topic2 { // 154
+			if f, ok1 := rule.(func(data *sensor_msgs.Image) string); ok1 {
+				Rule154 = append(Rule154, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic155 == topic2 { // 155
+			if f, ok1 := rule.(func(data *sensor_msgs.CompressedImage) string); ok1 {
+				Rule155 = append(Rule155, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic156 == topic2 { // 156
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule156 = append(Rule156, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic157 == topic2 { // 157
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule157 = append(Rule157, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic158 == topic2 { // 158
+			if f, ok1 := rule.(func(data *sensor_msgs.CompressedImage) string); ok1 {
+				Rule158 = append(Rule158, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic159 == topic2 { // 159
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule159 = append(Rule159, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic160 == topic2 { // 160
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule160 = append(Rule160, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic161 == topic2 { // 161
+			if f, ok1 := rule.(func(data *theora_image_transport.Packet) string); ok1 {
+				Rule161 = append(Rule161, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic162 == topic2 { // 162
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule162 = append(Rule162, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic163 == topic2 { // 163
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule163 = append(Rule163, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic164 == topic2 { // 164
+			if f, ok1 := rule.(func(data *sensor_msgs.CameraInfo) string); ok1 {
+				Rule164 = append(Rule164, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic165 == topic2 { // 165
+			if f, ok1 := rule.(func(data *sensor_msgs.Image) string); ok1 {
+				Rule165 = append(Rule165, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic166 == topic2 { // 166
+			if f, ok1 := rule.(func(data *sensor_msgs.CompressedImage) string); ok1 {
+				Rule166 = append(Rule166, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic167 == topic2 { // 167
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule167 = append(Rule167, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic168 == topic2 { // 168
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule168 = append(Rule168, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic169 == topic2 { // 169
+			if f, ok1 := rule.(func(data *sensor_msgs.CompressedImage) string); ok1 {
+				Rule169 = append(Rule169, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic170 == topic2 { // 170
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule170 = append(Rule170, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic171 == topic2 { // 171
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule171 = append(Rule171, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic172 == topic2 { // 172
+			if f, ok1 := rule.(func(data *theora_image_transport.Packet) string); ok1 {
+				Rule172 = append(Rule172, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic173 == topic2 { // 173
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule173 = append(Rule173, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic174 == topic2 { // 174
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule174 = append(Rule174, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic175 == topic2 { // 175
+			if f, ok1 := rule.(func(data *sensor_msgs.PointCloud2) string); ok1 {
+				Rule175 = append(Rule175, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic176 == topic2 { // 176
+			if f, ok1 := rule.(func(data *sensor_msgs.CameraInfo) string); ok1 {
+				Rule176 = append(Rule176, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic177 == topic2 { // 177
+			if f, ok1 := rule.(func(data *sensor_msgs.Image) string); ok1 {
+				Rule177 = append(Rule177, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic178 == topic2 { // 178
+			if f, ok1 := rule.(func(data *sensor_msgs.CompressedImage) string); ok1 {
+				Rule178 = append(Rule178, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic179 == topic2 { // 179
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule179 = append(Rule179, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic180 == topic2 { // 180
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule180 = append(Rule180, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic181 == topic2 { // 181
+			if f, ok1 := rule.(func(data *sensor_msgs.CompressedImage) string); ok1 {
+				Rule181 = append(Rule181, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic182 == topic2 { // 182
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule182 = append(Rule182, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic183 == topic2 { // 183
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule183 = append(Rule183, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic184 == topic2 { // 184
+			if f, ok1 := rule.(func(data *theora_image_transport.Packet) string); ok1 {
+				Rule184 = append(Rule184, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic185 == topic2 { // 185
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule185 = append(Rule185, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic186 == topic2 { // 186
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule186 = append(Rule186, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic187 == topic2 { // 187
+			if f, ok1 := rule.(func(data *sensor_msgs.CameraInfo) string); ok1 {
+				Rule187 = append(Rule187, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic188 == topic2 { // 188
+			if f, ok1 := rule.(func(data *sensor_msgs.Image) string); ok1 {
+				Rule188 = append(Rule188, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic189 == topic2 { // 189
+			if f, ok1 := rule.(func(data *sensor_msgs.CompressedImage) string); ok1 {
+				Rule189 = append(Rule189, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic190 == topic2 { // 190
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule190 = append(Rule190, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic191 == topic2 { // 191
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule191 = append(Rule191, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic192 == topic2 { // 192
+			if f, ok1 := rule.(func(data *sensor_msgs.CompressedImage) string); ok1 {
+				Rule192 = append(Rule192, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic193 == topic2 { // 193
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule193 = append(Rule193, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic194 == topic2 { // 194
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule194 = append(Rule194, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic195 == topic2 { // 195
+			if f, ok1 := rule.(func(data *theora_image_transport.Packet) string); ok1 {
+				Rule195 = append(Rule195, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic196 == topic2 { // 196
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule196 = append(Rule196, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic197 == topic2 { // 197
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule197 = append(Rule197, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic198 == topic2 { // 198
+			if f, ok1 := rule.(func(data *sensor_msgs.PointCloud2) string); ok1 {
+				Rule198 = append(Rule198, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic199 == topic2 { // 199
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseStamped) string); ok1 {
+				Rule199 = append(Rule199, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic200 == topic2 { // 200
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseStamped) string); ok1 {
+				Rule200 = append(Rule200, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic201 == topic2 { // 201
+			if f, ok1 := rule.(func(data *std_msgs.UInt8) string); ok1 {
+				Rule201 = append(Rule201, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic202 == topic2 { // 202
+			if f, ok1 := rule.(func(data *nav_msgs.Odometry) string); ok1 {
+				Rule202 = append(Rule202, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic203 == topic2 { // 203
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule203 = append(Rule203, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic204 == topic2 { // 204
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule204 = append(Rule204, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic205 == topic2 { // 205
+			if f, ok1 := rule.(func(data *nav_msgs.Odometry) string); ok1 {
+				Rule205 = append(Rule205, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic206 == topic2 { // 206
+			if f, ok1 := rule.(func(data *sensor_msgs.Imu) string); ok1 {
+				Rule206 = append(Rule206, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic207 == topic2 { // 207
+			if f, ok1 := rule.(func(data *sensor_msgs.PointCloud2) string); ok1 {
+				Rule207 = append(Rule207, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic208 == topic2 { // 208
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseArray) string); ok1 {
+				Rule208 = append(Rule208, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic209 == topic2 { // 209
+			if f, ok1 := rule.(func(data *sensor_msgs.PointCloud2) string); ok1 {
+				Rule209 = append(Rule209, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic210 == topic2 { // 210
+			if f, ok1 := rule.(func(data *sensor_msgs.LaserScan) string); ok1 {
+				Rule210 = append(Rule210, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic211 == topic2 { // 211
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseWithCovarianceStamped) string); ok1 {
+				Rule211 = append(Rule211, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic212 == topic2 { // 212
+			if f, ok1 := rule.(func(data *geometry_msgs.Vector3Stamped) string); ok1 {
+				Rule212 = append(Rule212, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic213 == topic2 { // 213
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule213 = append(Rule213, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic214 == topic2 { // 214
+			if f, ok1 := rule.(func(data *common_msgs.FunctionAreas) string); ok1 {
+				Rule214 = append(Rule214, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic215 == topic2 { // 215
+			if f, ok1 := rule.(func(data *std_msgs.Bool) string); ok1 {
+				Rule215 = append(Rule215, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic216 == topic2 { // 216
+			if f, ok1 := rule.(func(data *nav_msgs.Path) string); ok1 {
+				Rule216 = append(Rule216, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic217 == topic2 { // 217
+			if f, ok1 := rule.(func(data *std_msgs.Float64MultiArray) string); ok1 {
+				Rule217 = append(Rule217, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic218 == topic2 { // 218
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule218 = append(Rule218, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic219 == topic2 { // 219
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule219 = append(Rule219, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic220 == topic2 { // 220
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule220 = append(Rule220, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic221 == topic2 { // 221
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseStamped) string); ok1 {
+				Rule221 = append(Rule221, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic222 == topic2 { // 222
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseWithCovarianceStamped) string); ok1 {
+				Rule222 = append(Rule222, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic223 == topic2 { // 223
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule223 = append(Rule223, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic224 == topic2 { // 224
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule224 = append(Rule224, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic225 == topic2 { // 225
+			if f, ok1 := rule.(func(data *localization_monitor.RobotStatus) string); ok1 {
+				Rule225 = append(Rule225, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic226 == topic2 { // 226
+			if f, ok1 := rule.(func(data *std_msgs.Float64MultiArray) string); ok1 {
+				Rule226 = append(Rule226, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic227 == topic2 { // 227
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule227 = append(Rule227, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic228 == topic2 { // 228
+			if f, ok1 := rule.(func(data *actionlib_msgs.GoalID) string); ok1 {
+				Rule228 = append(Rule228, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic229 == topic2 { // 229
+			if f, ok1 := rule.(func(data *ipa_building_msgs.MapSegmentationActionFeedback) string); ok1 {
+				Rule229 = append(Rule229, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic230 == topic2 { // 230
+			if f, ok1 := rule.(func(data *ipa_building_msgs.MapSegmentationActionGoal) string); ok1 {
+				Rule230 = append(Rule230, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic231 == topic2 { // 231
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule231 = append(Rule231, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic232 == topic2 { // 232
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule232 = append(Rule232, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic233 == topic2 { // 233
+			if f, ok1 := rule.(func(data *ipa_building_msgs.MapSegmentationActionResult) string); ok1 {
+				Rule233 = append(Rule233, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic234 == topic2 { // 234
+			if f, ok1 := rule.(func(data *nav_msgs.OccupancyGrid) string); ok1 {
+				Rule234 = append(Rule234, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic235 == topic2 { // 235
+			if f, ok1 := rule.(func(data *actionlib_msgs.GoalStatusArray) string); ok1 {
+				Rule235 = append(Rule235, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic236 == topic2 { // 1
+			if f, ok1 := rule.(func(data *rosgraph_msgs.Log) string); ok1 {
+				Rule236 = append(Rule236, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic237 == topic2 { // 2
+			if f, ok1 := rule.(func(data *rosgraph_msgs.Log) string); ok1 {
+				Rule237 = append(Rule237, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic238 == topic2 { // 3
+			if f, ok1 := rule.(func(data *nav_msgs.Path) string); ok1 {
+				Rule238 = append(Rule238, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic239 == topic2 { // 4
+			if f, ok1 := rule.(func(data *geometry_msgs.Vector3Stamped) string); ok1 {
+				Rule239 = append(Rule239, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic240 == topic2 { // 5
+			if f, ok1 := rule.(func(data *sensor_msgs.LaserScan) string); ok1 {
+				Rule240 = append(
+					Rule240, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic241 == topic2 { // 6
+			if f, ok1 := rule.(func(data *sensor_msgs.LaserScan) string); ok1 {
+				Rule241 = append(Rule241, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic242 == topic2 { // 7
+			if f, ok1 := rule.(func(data *sensor_msgs.LaserScan) string); ok1 {
+				Rule242 = append(Rule242, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic243 == topic2 { // 8
+			if f, ok1 := rule.(func(data *sensor_msgs.LaserScan) string); ok1 {
+				Rule243 = append(Rule243, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic244 == topic2 { // 9
+			if f, ok1 := rule.(func(
+				data *sensor_msgs.LaserScan) string); ok1 {
+				Rule244 = append(Rule244, f)
+				goto JudgeDone
+			}
+			log(
+				triggerLocalPath)
+			continue
+		} else if Topic245 == topic2 { // 10
+			if f, ok1 := rule.(func(data *sensor_msgs.PointCloud2) string); ok1 {
+				Rule245 = append(Rule245, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic246 == topic2 { // 11
+			if f, ok1 := rule.(func(data *sensor_msgs.PointCloud2) string); ok1 {
+				Rule246 = append(Rule246, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic247 == topic2 { // 12
+			if f, ok1 := rule.(func(data *visualization_msgs.MarkerArray) string); ok1 {
+				Rule247 = append(Rule247, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic248 == topic2 { // 13
+			if f, ok1 := rule.(func(data *common_msgs.SensorTask) string); ok1 {
+				Rule248 = append(Rule248, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic249 == topic2 { // 14
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule249 = append(Rule249, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic250 == topic2 { // 15
+			if f, ok1 := rule.(func(data *geometry_msgs.Vector3Stamped) string); ok1 {
+				Rule250 = append(Rule250, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic251 == topic2 { // 16
+			if f, ok1 := rule.(func(data *common_msgs.SonarList) string); ok1 {
+				Rule251 = append(Rule251, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic252 == topic2 { // 17
+			if f, ok1 := rule.(func(data *nav_msgs.Odometry) string); ok1 {
+				Rule252 = append(Rule252, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic253 == topic2 { // 18
+			if f, ok1 := rule.(func(data *sensor_msgs.LaserScan) string); ok1 {
+				Rule253 = append(Rule253, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic254 == topic2 { // 19
+			if f, ok1 := rule.(func(data *std_msgs.Bool) string); ok1 {
+				Rule254 = append(Rule254, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic255 == topic2 { // 20
+			if f, ok1 := rule.(func(data *sensor_msgs.LaserScan) string); ok1 {
+				Rule255 = append(Rule255, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic256 == topic2 { // 21
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule256 = append(Rule256, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic257 == topic2 { // 22
+			if f, ok1 := rule.(func(data *std_msgs.Bool) string); ok1 {
+				Rule257 = append(Rule257, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic258 == topic2 { // 23
+			if f, ok1 := rule.(func(data *sensor_msgs.CameraInfo) string); ok1 {
+				Rule258 = append(Rule258, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic259 == topic2 { // 24
+			if f, ok1 := rule.(func(data *common_msgs.SysInfo) string); ok1 {
+				Rule259 = append(Rule259, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic260 == topic2 { // 25
+			if f, ok1 := rule.(func(data *sensor_msgs.Image) string); ok1 {
+				Rule260 = append(Rule260, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic261 == topic2 { // 26
+			if f, ok1 := rule.(func(data *sensor_msgs.CompressedImage) string); ok1 {
+				Rule261 = append(Rule261, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic262 == topic2 { // 27
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule262 = append(Rule262, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic263 == topic2 { // 28
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule263 = append(Rule263, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic264 == topic2 { // 29
+			if f, ok1 := rule.(func(data *sensor_msgs.CompressedImage) string); ok1 {
+				Rule264 = append(Rule264, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic265 == topic2 { // 30
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule265 = append(Rule265, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic266 == topic2 { // 31
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule266 = append(Rule266, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic267 == topic2 { // 32
+			if f, ok1 := rule.(func(data *theora_image_transport.Packet) string); ok1 {
+				Rule267 = append(Rule267, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic268 == topic2 { // 33
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.ConfigDescription) string); ok1 {
+				Rule268 = append(Rule268, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic269 == topic2 { // 34
+			if f, ok1 := rule.(func(data *dynamic_reconfigure.Config) string); ok1 {
+				Rule269 = append(Rule269, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic270 == topic2 { // 35
+			if f, ok1 := rule.(func(data *std_msgs.Bool) string); ok1 {
+				Rule270 = append(Rule270, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic271 == topic2 { // 36
+			if f, ok1 := rule.(func(data *geometry_msgs.PoseStamped) string); ok1 {
+				Rule271 = append(Rule271, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic272 == topic2 { // 37
+			if f, ok1 := rule.(func(data *geometry_msgs.Vector3Stamped) string); ok1 {
+				Rule272 = append(Rule272, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic273 == topic2 { // 38
+			if f, ok1 := rule.(func(data *common_msgs.TaskFeedbackInfo) string); ok1 {
+				Rule273 = append(Rule273, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic274 == topic2 { // 39
+			if f, ok1 := rule.(func(data *common_msgs.Points) string); ok1 {
+				Rule274 = append(Rule274, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic275 == topic2 { // 40
+			if f, ok1 := rule.(func(data *tf2_msgs.TFMessage) string); ok1 {
+				Rule275 = append(Rule275, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic276 == topic2 { // 41
+			if f, ok1 := rule.(func(data *std_msgs.String) string); ok1 {
+				Rule276 = append(Rule276, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic277 == topic2 { // 42
+			if f, ok1 := rule.(func(data *tf2_msgs.TFMessage) string); ok1 {
+				Rule277 = append(Rule277, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic278 == topic2 { // 43
+			if f, ok1 := rule.(func(data *nav_msgs.Path) string); ok1 {
+				Rule278 = append(Rule278, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic279 == topic2 { // 44
+			if f, ok1 := rule.(func(data *common_msgs.UpLoadFileList) string); ok1 {
+				Rule279 = append(Rule279, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic280 == topic2 { // 45
+			if f, ok1 := rule.(func(data *sensor_msgs.Range) string); ok1 {
+				Rule280 = append(Rule280, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic281 == topic2 { // 46
+			if f, ok1 := rule.(func(data *sensor_msgs.LaserScan) string); ok1 {
+				Rule281 = append(Rule281, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic282 == topic2 { // 47
+			if f, ok1 := rule.(func(data *sensor_msgs.LaserScan) string); ok1 {
+				Rule282 = append(Rule282, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic283 == topic2 { // 48
+			if f, ok1 := rule.(func(data *sensor_msgs.LaserScan) string); ok1 {
+				Rule283 = append(Rule283, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else if Topic284 == topic2 { // 49
+			if f, ok1 := rule.(func(data *sensor_msgs.LaserScan) string); ok1 {
+				Rule284 = append(Rule284, f)
+				goto JudgeDone
+			}
+			log(triggerLocalPath)
+			continue
+		} else {
+			c_log.GlobalLogger.Error("未知的topic:", topic2)
+			continue
+		}
+	JudgeDone:
+		label, err := open.Lookup("Label")
+		if err != nil {
+			c_log.GlobalLogger.Error("加载本地插件 ", triggerLocalPath, " 中的 Label 方法失败。", err)
+			continue
+		}
+		labelFunc := label.(func() string)
+		labelString := labelFunc()
+		LabelMapTriggerId.Store(labelString, triggerId)
+		success++
+	}
+	c_log.GlobalLogger.Info("一共应加载", len(config.PlatformConfig.TaskTriggers), "个触发器,实际加载 ", success, " 个触发器。")
+}
+
+func log(triggerLocalPath string) {
+	c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的 Rule 方法参数格式不正确。")
+}

+ 286 - 0
aarch64/pjibot_clean/master/package/config/机器人话题和数据类型对应关系.txt

@@ -0,0 +1,286 @@
+/Electrification          std_msgs/Int16MultiArray  /opt/ros/noetic/share/std_msgs/msg/Int16MultiArray.msg /root/crf/ros_msg_types/std_msgs_msg/Int16MultiArray.msg
+/along_wall_start_point   geometry_msgs/PoseStamped /opt/ros/noetic/share/geometry_msgs/msg/PoseStamped.msg /root/crf/ros_msg_types/geometry_msgs_msg/PoseStamped.msg
+/amcl/parameter_descriptions dynamic_reconfigure/ConfigDescription /opt/ros/noetic/share/dynamic_reconfigure/msg/ConfigDescription.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/ConfigDescription.msg
+/amcl/parameter_updates   dynamic_reconfigure/Config /opt/ros/noetic/share/dynamic_reconfigure/msg/Config.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/Config.msg
+/amcl_enter_mapconvert_topic std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/amcl_pose                geometry_msgs/PoseWithCovarianceStamped /opt/ros/noetic/share/geometry_msgs/msg/PoseWithCovarianceStamped.msg /root/crf/ros_msg_types/geometry_msgs_msg/PoseWithCovarianceStamped.msg
+/amcl_relocalization_finish_pub std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/amcl_topic               std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/any_eye/run_line_light   std_msgs/Bool             /opt/ros/noetic/share/std_msgs/msg/Bool.msg /root/crf/ros_msg_types/std_msgs_msg/Bool.msg
+/application_heart_beat   std_msgs/Int8             /opt/ros/noetic/share/std_msgs/msg/Int8.msg /root/crf/ros_msg_types/std_msgs_msg/Int8.msg
+/auto_dock/heart          std_msgs/Int8             /opt/ros/noetic/share/std_msgs/msg/Int8.msg /root/crf/ros_msg_types/std_msgs_msg/Int8.msg
+/back_top_points_process  sensor_msgs/PointCloud2   /opt/ros/noetic/share/sensor_msgs/msg/PointCloud2.msg /root/crf/ros_msg_types/sensor_msgs_msg/PointCloud2.msg
+/batter                   sensor_msgs/BatteryState  /opt/ros/noetic/share/sensor_msgs/msg/BatteryState.msg /root/crf/ros_msg_types/sensor_msgs_msg/BatteryState.msg
+/boot_time                std_msgs/Int16            /opt/ros/noetic/share/std_msgs/msg/Int16.msg /root/crf/ros_msg_types/std_msgs_msg/Int16.msg
+/boundingboxes_line       visualization_msgs/Marker /opt/ros/noetic/share/visualization_msgs/msg/Marker.msg /root/crf/ros_msg_types/visualization_msgs_msg/Marker.msg
+/call_icp                 std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/camera/depth/camera_info sensor_msgs/CameraInfo    /opt/ros/noetic/share/sensor_msgs/msg/CameraInfo.msg /root/crf/ros_msg_types/sensor_msgs_msg/CameraInfo.msg
+/camera/depth/image_raw   sensor_msgs/Image         /opt/ros/noetic/share/sensor_msgs/msg/Image.msg /root/crf/ros_msg_types/sensor_msgs_msg/Image.msg
+/camera/depth/image_raw/compressed sensor_msgs/CompressedImage /opt/ros/noetic/share/sensor_msgs/msg/CompressedImage.msg /root/crf/ros_msg_types/sensor_msgs_msg/CompressedImage.msg
+/camera/depth/image_raw/compressed/parameter_descriptions dynamic_reconfigure/ConfigDescription /opt/ros/noetic/share/dynamic_reconfigure/msg/ConfigDescription.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/ConfigDescription.msg
+/camera/depth/image_raw/compressed/parameter_updates dynamic_reconfigure/Config /opt/ros/noetic/share/dynamic_reconfigure/msg/Config.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/Config.msg
+/camera/depth/image_raw/compressedDepth sensor_msgs/CompressedImage /opt/ros/noetic/share/sensor_msgs/msg/CompressedImage.msg /root/crf/ros_msg_types/sensor_msgs_msg/CompressedImage.msg
+/camera/depth/image_raw/compressedDepth/parameter_descriptions dynamic_reconfigure/ConfigDescription /opt/ros/noetic/share/dynamic_reconfigure/msg/ConfigDescription.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/ConfigDescription.msg
+/camera/depth/image_raw/compressedDepth/parameter_updates dynamic_reconfigure/Config /opt/ros/noetic/share/dynamic_reconfigure/msg/Config.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/Config.msg
+/camera/depth/image_raw/theora theora_image_transport/Packet /opt/ros/noetic/share/theora_image_transport/msg/Packet.msg /root/crf/ros_msg_types/theora_image_transport_msg/Packet.msg
+/camera/depth/image_raw/theora/parameter_descriptions dynamic_reconfigure/ConfigDescription /opt/ros/noetic/share/dynamic_reconfigure/msg/ConfigDescription.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/ConfigDescription.msg
+/camera/depth/image_raw/theora/parameter_updates dynamic_reconfigure/Config /opt/ros/noetic/share/dynamic_reconfigure/msg/Config.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/Config.msg
+/camera/depth/points      sensor_msgs/PointCloud2   /opt/ros/noetic/share/sensor_msgs/msg/PointCloud2.msg /root/crf/ros_msg_types/sensor_msgs_msg/PointCloud2.msg
+/camera/ir/camera_info    sensor_msgs/CameraInfo    /opt/ros/noetic/share/sensor_msgs/msg/CameraInfo.msg /root/crf/ros_msg_types/sensor_msgs_msg/CameraInfo.msg
+/camera/ir/image_raw      sensor_msgs/Image         /opt/ros/noetic/share/sensor_msgs/msg/Image.msg /root/crf/ros_msg_types/sensor_msgs_msg/Image.msg
+/camera/ir/image_raw/compressed sensor_msgs/CompressedImage /opt/ros/noetic/share/sensor_msgs/msg/CompressedImage.msg /root/crf/ros_msg_types/sensor_msgs_msg/CompressedImage.msg
+/camera/ir/image_raw/compressed/parameter_descriptions dynamic_reconfigure/ConfigDescription /opt/ros/noetic/share/dynamic_reconfigure/msg/ConfigDescription.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/ConfigDescription.msg
+/camera/ir/image_raw/compressed/parameter_updates dynamic_reconfigure/Config /opt/ros/noetic/share/dynamic_reconfigure/msg/Config.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/Config.msg
+/camera/ir/image_raw/compressedDepth sensor_msgs/CompressedImage /opt/ros/noetic/share/sensor_msgs/msg/CompressedImage.msg /root/crf/ros_msg_types/sensor_msgs_msg/CompressedImage.msg
+/camera/ir/image_raw/compressedDepth/parameter_descriptions dynamic_reconfigure/ConfigDescription /opt/ros/noetic/share/dynamic_reconfigure/msg/ConfigDescription.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/ConfigDescription.msg
+/camera/ir/image_raw/compressedDepth/parameter_updates dynamic_reconfigure/Config /opt/ros/noetic/share/dynamic_reconfigure/msg/Config.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/Config.msg
+/camera/ir/image_raw/theora theora_image_transport/Packet /opt/ros/noetic/share/theora_image_transport/msg/Packet.msg /root/crf/ros_msg_types/theora_image_transport_msg/Packet.msg
+/camera/ir/image_raw/theora/parameter_descriptions dynamic_reconfigure/ConfigDescription /opt/ros/noetic/share/dynamic_reconfigure/msg/ConfigDescription.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/ConfigDescription.msg
+/camera/ir/image_raw/theora/parameter_updates dynamic_reconfigure/Config /opt/ros/noetic/share/dynamic_reconfigure/msg/Config.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/Config.msg
+/charge_tag_pos           geometry_msgs/PoseStamped /opt/ros/noetic/share/geometry_msgs/msg/PoseStamped.msg /root/crf/ros_msg_types/geometry_msgs_msg/PoseStamped.msg
+/charge_target            geometry_msgs/PoseStamped /opt/ros/noetic/share/geometry_msgs/msg/PoseStamped.msg /root/crf/ros_msg_types/geometry_msgs_msg/PoseStamped.msg
+/clean_pnc/astar_path_planner/path nav_msgs/Path             /opt/ros/noetic/share/nav_msgs/msg/Path.msg /root/crf/ros_msg_types/nav_msgs_msg/Path.msg
+/clean_pnc/battery_state  std_msgs/Int8             /opt/ros/noetic/share/std_msgs/msg/Int8.msg /root/crf/ros_msg_types/std_msgs_msg/Int8.msg
+/clean_pnc/bumper         std_msgs/Bool             /opt/ros/noetic/share/std_msgs/msg/Bool.msg /root/crf/ros_msg_types/std_msgs_msg/Bool.msg
+/clean_pnc/charger/station_line nav_msgs/Path             /opt/ros/noetic/share/nav_msgs/msg/Path.msg /root/crf/ros_msg_types/nav_msgs_msg/Path.msg
+/clean_pnc/charging_station/detect_position geometry_msgs/PoseStamped /opt/ros/noetic/share/geometry_msgs/msg/PoseStamped.msg /root/crf/ros_msg_types/geometry_msgs_msg/PoseStamped.msg
+/clean_pnc/charging_station/odom_position geometry_msgs/PoseStamped /opt/ros/noetic/share/geometry_msgs/msg/PoseStamped.msg /root/crf/ros_msg_types/geometry_msgs_msg/PoseStamped.msg
+/clean_pnc/charging_station/position geometry_msgs/PoseStamped /opt/ros/noetic/share/geometry_msgs/msg/PoseStamped.msg /root/crf/ros_msg_types/geometry_msgs_msg/PoseStamped.msg
+/clean_pnc/clean_cmd      std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/clean_pnc/cost_map/footprint visualization_msgs/MarkerArray /opt/ros/noetic/share/visualization_msgs/msg/MarkerArray.msg /root/crf/ros_msg_types/visualization_msgs_msg/MarkerArray.msg
+/clean_pnc/cost_map/footprint_spec geometry_msgs/PolygonStamped /opt/ros/noetic/share/geometry_msgs/msg/PolygonStamped.msg /root/crf/ros_msg_types/geometry_msgs_msg/PolygonStamped.msg
+/clean_pnc/cost_map/global_costmap nav_msgs/OccupancyGrid    /opt/ros/noetic/share/nav_msgs/msg/OccupancyGrid.msg /root/crf/ros_msg_types/nav_msgs_msg/OccupancyGrid.msg
+/clean_pnc/cost_map/local_costmap nav_msgs/OccupancyGrid    /opt/ros/noetic/share/nav_msgs/msg/OccupancyGrid.msg /root/crf/ros_msg_types/nav_msgs_msg/OccupancyGrid.msg
+/clean_pnc/cost_map/task_costmap nav_msgs/OccupancyGrid    /opt/ros/noetic/share/nav_msgs/msg/OccupancyGrid.msg /root/crf/ros_msg_types/nav_msgs_msg/OccupancyGrid.msg
+/clean_pnc/cur_clean_area std_msgs/Float32          /opt/ros/noetic/share/std_msgs/msg/Float32.msg /root/crf/ros_msg_types/std_msgs_msg/Float32.msg
+/clean_pnc/current_task_list_loop_times std_msgs/Int32            /opt/ros/noetic/share/std_msgs/msg/Int32.msg /root/crf/ros_msg_types/std_msgs_msg/Int32.msg
+/clean_pnc/dwa_path_planner/global_path nav_msgs/Path             /opt/ros/noetic/share/nav_msgs/msg/Path.msg /root/crf/ros_msg_types/nav_msgs_msg/Path.msg
+/clean_pnc/error_code     clean_msg/ErrorInfo       /root/pjirobot/install/share/clean_msg/msg/ErrorInfo.msg /root/crf/ros_msg_types/clean_msg_msg/ErrorInfo.msg
+/clean_pnc/function_map/compute_follow_path_map nav_msgs/OccupancyGrid    /opt/ros/noetic/share/nav_msgs/msg/OccupancyGrid.msg /root/crf/ros_msg_types/nav_msgs_msg/OccupancyGrid.msg
+/clean_pnc/function_map/forbidden_clean_area nav_msgs/OccupancyGrid    /opt/ros/noetic/share/nav_msgs/msg/OccupancyGrid.msg /root/crf/ros_msg_types/nav_msgs_msg/OccupancyGrid.msg
+/clean_pnc/function_map/need_clean_area nav_msgs/OccupancyGrid    /opt/ros/noetic/share/nav_msgs/msg/OccupancyGrid.msg /root/crf/ros_msg_types/nav_msgs_msg/OccupancyGrid.msg
+/clean_pnc/function_map/no_need_clean_area nav_msgs/OccupancyGrid    /opt/ros/noetic/share/nav_msgs/msg/OccupancyGrid.msg /root/crf/ros_msg_types/nav_msgs_msg/OccupancyGrid.msg
+/clean_pnc/function_map/task_cleaned_map nav_msgs/OccupancyGrid    /opt/ros/noetic/share/nav_msgs/msg/OccupancyGrid.msg /root/crf/ros_msg_types/nav_msgs_msg/OccupancyGrid.msg
+/clean_pnc/function_map/task_list_cleaned_map nav_msgs/OccupancyGrid    /opt/ros/noetic/share/nav_msgs/msg/OccupancyGrid.msg /root/crf/ros_msg_types/nav_msgs_msg/OccupancyGrid.msg
+/clean_pnc/save_report    std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/clean_pnc/scram_button   std_msgs/Bool             /opt/ros/noetic/share/std_msgs/msg/Bool.msg /root/crf/ros_msg_types/std_msgs_msg/Bool.msg
+/clean_pnc/type/pause     std_msgs/Bool             /opt/ros/noetic/share/std_msgs/msg/Bool.msg /root/crf/ros_msg_types/std_msgs_msg/Bool.msg
+/clean_polygon            geometry_msgs/PolygonStamped /opt/ros/noetic/share/geometry_msgs/msg/PolygonStamped.msg /root/crf/ros_msg_types/geometry_msgs_msg/PolygonStamped.msg
+/clicked_point            geometry_msgs/PointStamped /opt/ros/noetic/share/geometry_msgs/msg/PointStamped.msg /root/crf/ros_msg_types/geometry_msgs_msg/PointStamped.msg
+/close_imu_topic_         std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/cloud_cmd                geometry_msgs/Twist       /opt/ros/noetic/share/geometry_msgs/msg/Twist.msg /root/crf/ros_msg_types/geometry_msgs_msg/Twist.msg
+/cmd_vel                  geometry_msgs/Twist       /opt/ros/noetic/share/geometry_msgs/msg/Twist.msg /root/crf/ros_msg_types/geometry_msgs_msg/Twist.msg
+/collisionDetection       nav_msgs/Path             /opt/ros/noetic/share/nav_msgs/msg/Path.msg /root/crf/ros_msg_types/nav_msgs_msg/Path.msg
+/create_map_info          common_msgs/CreateMapInfo /root/pjirobot/install/share/common_msgs/msg/CreateMapInfo.msg /root/crf/ros_msg_types/common_msgs_msg/CreateMapInfo.msg
+/ctrl_speed_deal_before   geometry_msgs/Twist       /opt/ros/noetic/share/geometry_msgs/msg/Twist.msg /root/crf/ros_msg_types/geometry_msgs_msg/Twist.msg
+/current/sensor_status    common_msgs/SensorStatus  /root/pjirobot/install/share/common_msgs/msg/SensorStatus.msg /root/crf/ros_msg_types/common_msgs_msg/SensorStatus.msg
+/custom_path              geometry_msgs/PoseArray   /opt/ros/noetic/share/geometry_msgs/msg/PoseArray.msg /root/crf/ros_msg_types/geometry_msgs_msg/PoseArray.msg
+/data_fusion_path         nav_msgs/Path             /opt/ros/noetic/share/nav_msgs/msg/Path.msg /root/crf/ros_msg_types/nav_msgs_msg/Path.msg
+/detect/boundingboxes     common_msgs/IdentifierObjsInfo /root/pjirobot/install/share/common_msgs/msg/IdentifierObjsInfo.msg /root/crf/ros_msg_types/common_msgs_msg/IdentifierObjsInfo.msg
+/diagnostic/mcu           common_msgs/McuDiagnostic /root/pjirobot/install/share/common_msgs/msg/McuDiagnostic.msg /root/crf/ros_msg_types/common_msgs_msg/McuDiagnostic.msg
+/diagnostics              diagnostic_msgs/DiagnosticArray /opt/ros/noetic/share/diagnostic_msgs/msg/DiagnosticArray.msg /root/crf/ros_msg_types/diagnostic_msgs_msg/DiagnosticArray.msg
+/disinfection             std_msgs/Int8             /opt/ros/noetic/share/std_msgs/msg/Int8.msg /root/crf/ros_msg_types/std_msgs_msg/Int8.msg
+/disinfection_info        std_msgs/Int16            /opt/ros/noetic/share/std_msgs/msg/Int16.msg /root/crf/ros_msg_types/std_msgs_msg/Int16.msg
+/dock_flag                geometry_msgs/Vector3Stamped /opt/ros/noetic/share/geometry_msgs/msg/Vector3Stamped.msg /root/crf/ros_msg_types/geometry_msgs_msg/Vector3Stamped.msg
+/dynamic_scan             sensor_msgs/LaserScan     /opt/ros/noetic/share/sensor_msgs/msg/LaserScan.msg /root/crf/ros_msg_types/sensor_msgs_msg/LaserScan.msg
+/dynamic_wall_line_pub    sensor_msgs/PointCloud2   /opt/ros/noetic/share/sensor_msgs/msg/PointCloud2.msg /root/crf/ros_msg_types/sensor_msgs_msg/PointCloud2.msg
+/elevate_scence           std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/elevate_state_topic      std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/elevator_dwa/task_status std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/engine/current_robot_mode std_msgs/Int32            /opt/ros/noetic/share/std_msgs/msg/Int32.msg /root/crf/ros_msg_types/std_msgs_msg/Int32.msg
+/engine/current_task_info common_msgs/TaskInfo      /root/pjirobot/install/share/common_msgs/msg/TaskInfo.msg /root/crf/ros_msg_types/common_msgs_msg/TaskInfo.msg
+/engine/map_info          common_msgs/MapInfo       /root/pjirobot/install/share/common_msgs/msg/MapInfo.msg /root/crf/ros_msg_types/common_msgs_msg/MapInfo.msg
+/engine/out_line_path     nav_msgs/Path             /opt/ros/noetic/share/nav_msgs/msg/Path.msg /root/crf/ros_msg_types/nav_msgs_msg/Path.msg
+/engine/video_stream_push common_msgs/VideoStream   /root/pjirobot/install/share/common_msgs/msg/VideoStream.msg /root/crf/ros_msg_types/common_msgs_msg/VideoStream.msg
+/floor_downsample         sensor_msgs/PointCloud2   /opt/ros/noetic/share/sensor_msgs/msg/PointCloud2.msg /root/crf/ros_msg_types/sensor_msgs_msg/PointCloud2.msg
+/follow_path_path         nav_msgs/Path             /opt/ros/noetic/share/nav_msgs/msg/Path.msg /root/crf/ros_msg_types/nav_msgs_msg/Path.msg
+/front_down_points_process sensor_msgs/PointCloud2   /opt/ros/noetic/share/sensor_msgs/msg/PointCloud2.msg /root/crf/ros_msg_types/sensor_msgs_msg/PointCloud2.msg
+/front_top_points_downsample1 sensor_msgs/PointCloud2   /opt/ros/noetic/share/sensor_msgs/msg/PointCloud2.msg /root/crf/ros_msg_types/sensor_msgs_msg/PointCloud2.msg
+/front_top_points_process sensor_msgs/PointCloud2   /opt/ros/noetic/share/sensor_msgs/msg/PointCloud2.msg /root/crf/ros_msg_types/sensor_msgs_msg/PointCloud2.msg
+/global_goal              geometry_msgs/PointStamped /opt/ros/noetic/share/geometry_msgs/msg/PointStamped.msg /root/crf/ros_msg_types/geometry_msgs_msg/PointStamped.msg
+/global_path              nav_msgs/Path             /opt/ros/noetic/share/nav_msgs/msg/Path.msg /root/crf/ros_msg_types/nav_msgs_msg/Path.msg
+/hst007_camera_pose       geometry_msgs/PoseStamped /opt/ros/noetic/share/geometry_msgs/msg/PoseStamped.msg /root/crf/ros_msg_types/geometry_msgs_msg/PoseStamped.msg
+/icp_initial_pose         geometry_msgs/PoseWithCovarianceStamped /opt/ros/noetic/share/geometry_msgs/msg/PoseWithCovarianceStamped.msg /root/crf/ros_msg_types/geometry_msgs_msg/PoseWithCovarianceStamped.msg
+/icp_localization_check_topic geometry_msgs/Pose        /opt/ros/noetic/share/geometry_msgs/msg/Pose.msg /root/crf/ros_msg_types/geometry_msgs_msg/Pose.msg
+/icp_relocalization_finish_pub_topic std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/icp_relocalization_pub_topic std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/icp_relocalization_sub_topic std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/icp_run_topic            std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/icp_score                std_msgs/Float64          /opt/ros/noetic/share/std_msgs/msg/Float64.msg /root/crf/ros_msg_types/std_msgs_msg/Float64.msg
+/icp_service              std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/icp_topic                std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/imu                      sensor_msgs/Imu           /opt/ros/noetic/share/sensor_msgs/msg/Imu.msg /root/crf/ros_msg_types/sensor_msgs_msg/Imu.msg
+/imu_cal_state            std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/imu_calibration_state    std_msgs/Int8             /opt/ros/noetic/share/std_msgs/msg/Int8.msg /root/crf/ros_msg_types/std_msgs_msg/Int8.msg
+/imu_calibration_temperature std_msgs/Int16            /opt/ros/noetic/share/std_msgs/msg/Int16.msg /root/crf/ros_msg_types/std_msgs_msg/Int16.msg
+/imu_slover_param         std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/incline_localization     std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/initialpose              geometry_msgs/PoseWithCovarianceStamped /opt/ros/noetic/share/geometry_msgs/msg/PoseWithCovarianceStamped.msg /root/crf/ros_msg_types/geometry_msgs_msg/PoseWithCovarianceStamped.msg
+/joint_states             sensor_msgs/JointState    /opt/ros/noetic/share/sensor_msgs/msg/JointState.msg /root/crf/ros_msg_types/sensor_msgs_msg/JointState.msg
+/kibana_log               std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/landmark                 cartographer_ros_msgs/LandmarkList /root/pjirobot/install/share/cartographer_ros_msgs/msg/LandmarkList.msg /root/crf/ros_msg_types/cartographer_ros_msgs_msg/LandmarkList.msg
+/laser_odom               nav_msgs/Odometry         /opt/ros/noetic/share/nav_msgs/msg/Odometry.msg /root/crf/ros_msg_types/nav_msgs_msg/Odometry.msg
+/leg_scan                 sensor_msgs/LaserScan     /opt/ros/noetic/share/sensor_msgs/msg/LaserScan.msg /root/crf/ros_msg_types/sensor_msgs_msg/LaserScan.msg
+/lm_imu                   std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/local_path_update        nav_msgs/Path             /opt/ros/noetic/share/nav_msgs/msg/Path.msg /root/crf/ros_msg_types/nav_msgs_msg/Path.msg
+/localation_monitor_topic std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/localization_convertMap_topic std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/localization_fail        std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/localization_monitor_node/localation_monitor_topic std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/localization_recover_pose geometry_msgs/PoseWithCovarianceStamped /opt/ros/noetic/share/geometry_msgs/msg/PoseWithCovarianceStamped.msg /root/crf/ros_msg_types/geometry_msgs_msg/PoseWithCovarianceStamped.msg
+/localization_rocover_state std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/localization_state_modiy std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/locate_info              common_msgs/LocateInfo    /root/pjirobot/install/share/common_msgs/msg/LocateInfo.msg /root/crf/ros_msg_types/common_msgs_msg/LocateInfo.msg
+/locate_state             std_msgs/Bool             /opt/ros/noetic/share/std_msgs/msg/Bool.msg /root/crf/ros_msg_types/std_msgs_msg/Bool.msg
+/lost_localization_state_ std_msgs/Float64MultiArray /opt/ros/noetic/share/std_msgs/msg/Float64MultiArray.msg /root/crf/ros_msg_types/std_msgs_msg/Float64MultiArray.msg
+/lost_localization_warning_state std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/manual_close_icp_topic   std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/map                      nav_msgs/OccupancyGrid    /opt/ros/noetic/share/nav_msgs/msg/OccupancyGrid.msg /root/crf/ros_msg_types/nav_msgs_msg/OccupancyGrid.msg
+/map_base64               std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/map_border               nav_msgs/Path             /opt/ros/noetic/share/nav_msgs/msg/Path.msg /root/crf/ros_msg_types/nav_msgs_msg/Path.msg
+/map_merge_node/amcl_topic std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/map_merge_node/icp_topic std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/map_metadata             nav_msgs/MapMetaData      /opt/ros/noetic/share/nav_msgs/msg/MapMetaData.msg /root/crf/ros_msg_types/nav_msgs_msg/MapMetaData.msg
+/move_base/GlobalPlanner/plan nav_msgs/Path             /opt/ros/noetic/share/nav_msgs/msg/Path.msg /root/crf/ros_msg_types/nav_msgs_msg/Path.msg
+/move_base_simple/goal    geometry_msgs/PoseStamped /opt/ros/noetic/share/geometry_msgs/msg/PoseStamped.msg /root/crf/ros_msg_types/geometry_msgs_msg/PoseStamped.msg
+/mpc_cost_map             nav_msgs/OccupancyGrid    /opt/ros/noetic/share/nav_msgs/msg/OccupancyGrid.msg /root/crf/ros_msg_types/nav_msgs_msg/OccupancyGrid.msg
+/mpc_cost_map1            nav_msgs/OccupancyGrid    /opt/ros/noetic/share/nav_msgs/msg/OccupancyGrid.msg /root/crf/ros_msg_types/nav_msgs_msg/OccupancyGrid.msg
+/multi_persion_block      std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/mutli_person_block_pub   std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/new_imu                  std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/node_Monitor             std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/node_Monitor/clean_pnc/state std_msgs/Bool             /opt/ros/noetic/share/std_msgs/msg/Bool.msg /root/crf/ros_msg_types/std_msgs_msg/Bool.msg
+/ob_camera_01/color/camera_info sensor_msgs/CameraInfo    /opt/ros/noetic/share/sensor_msgs/msg/CameraInfo.msg /root/crf/ros_msg_types/sensor_msgs_msg/CameraInfo.msg
+/ob_camera_01/color/image_raw sensor_msgs/Image         /opt/ros/noetic/share/sensor_msgs/msg/Image.msg /root/crf/ros_msg_types/sensor_msgs_msg/Image.msg
+/ob_camera_01/color/image_raw/compressed sensor_msgs/CompressedImage /opt/ros/noetic/share/sensor_msgs/msg/CompressedImage.msg /root/crf/ros_msg_types/sensor_msgs_msg/CompressedImage.msg
+/ob_camera_01/color/image_raw/compressed/parameter_descriptions dynamic_reconfigure/ConfigDescription /opt/ros/noetic/share/dynamic_reconfigure/msg/ConfigDescription.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/ConfigDescription.msg
+/ob_camera_01/color/image_raw/compressed/parameter_updates dynamic_reconfigure/Config /opt/ros/noetic/share/dynamic_reconfigure/msg/Config.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/Config.msg
+/ob_camera_01/color/image_raw/compressedDepth sensor_msgs/CompressedImage /opt/ros/noetic/share/sensor_msgs/msg/CompressedImage.msg /root/crf/ros_msg_types/sensor_msgs_msg/CompressedImage.msg
+/ob_camera_01/color/image_raw/compressedDepth/parameter_descriptions dynamic_reconfigure/ConfigDescription /opt/ros/noetic/share/dynamic_reconfigure/msg/ConfigDescription.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/ConfigDescription.msg
+/ob_camera_01/color/image_raw/compressedDepth/parameter_updates dynamic_reconfigure/Config /opt/ros/noetic/share/dynamic_reconfigure/msg/Config.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/Config.msg
+/ob_camera_01/color/image_raw/theora theora_image_transport/Packet /opt/ros/noetic/share/theora_image_transport/msg/Packet.msg /root/crf/ros_msg_types/theora_image_transport_msg/Packet.msg
+/ob_camera_01/color/image_raw/theora/parameter_descriptions dynamic_reconfigure/ConfigDescription /opt/ros/noetic/share/dynamic_reconfigure/msg/ConfigDescription.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/ConfigDescription.msg
+/ob_camera_01/color/image_raw/theora/parameter_updates dynamic_reconfigure/Config /opt/ros/noetic/share/dynamic_reconfigure/msg/Config.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/Config.msg
+/ob_camera_01/depth/camera_info sensor_msgs/CameraInfo    /opt/ros/noetic/share/sensor_msgs/msg/CameraInfo.msg /root/crf/ros_msg_types/sensor_msgs_msg/CameraInfo.msg
+/ob_camera_01/depth/image_raw sensor_msgs/Image         /opt/ros/noetic/share/sensor_msgs/msg/Image.msg /root/crf/ros_msg_types/sensor_msgs_msg/Image.msg
+/ob_camera_01/depth/image_raw/compressed sensor_msgs/CompressedImage /opt/ros/noetic/share/sensor_msgs/msg/CompressedImage.msg /root/crf/ros_msg_types/sensor_msgs_msg/CompressedImage.msg
+/ob_camera_01/depth/image_raw/compressed/parameter_descriptions dynamic_reconfigure/ConfigDescription /opt/ros/noetic/share/dynamic_reconfigure/msg/ConfigDescription.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/ConfigDescription.msg
+/ob_camera_01/depth/image_raw/compressed/parameter_updates dynamic_reconfigure/Config /opt/ros/noetic/share/dynamic_reconfigure/msg/Config.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/Config.msg
+/ob_camera_01/depth/image_raw/compressedDepth sensor_msgs/CompressedImage /opt/ros/noetic/share/sensor_msgs/msg/CompressedImage.msg /root/crf/ros_msg_types/sensor_msgs_msg/CompressedImage.msg
+/ob_camera_01/depth/image_raw/compressedDepth/parameter_descriptions dynamic_reconfigure/ConfigDescription /opt/ros/noetic/share/dynamic_reconfigure/msg/ConfigDescription.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/ConfigDescription.msg
+/ob_camera_01/depth/image_raw/compressedDepth/parameter_updates dynamic_reconfigure/Config /opt/ros/noetic/share/dynamic_reconfigure/msg/Config.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/Config.msg
+/ob_camera_01/depth/image_raw/theora theora_image_transport/Packet /opt/ros/noetic/share/theora_image_transport/msg/Packet.msg /root/crf/ros_msg_types/theora_image_transport_msg/Packet.msg
+/ob_camera_01/depth/image_raw/theora/parameter_descriptions dynamic_reconfigure/ConfigDescription /opt/ros/noetic/share/dynamic_reconfigure/msg/ConfigDescription.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/ConfigDescription.msg
+/ob_camera_01/depth/image_raw/theora/parameter_updates dynamic_reconfigure/Config /opt/ros/noetic/share/dynamic_reconfigure/msg/Config.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/Config.msg
+/ob_camera_01/depth/points sensor_msgs/PointCloud2   /opt/ros/noetic/share/sensor_msgs/msg/PointCloud2.msg /root/crf/ros_msg_types/sensor_msgs_msg/PointCloud2.msg
+/ob_camera_02/color/camera_info sensor_msgs/CameraInfo    /opt/ros/noetic/share/sensor_msgs/msg/CameraInfo.msg /root/crf/ros_msg_types/sensor_msgs_msg/CameraInfo.msg
+/ob_camera_02/color/image_raw sensor_msgs/Image         /opt/ros/noetic/share/sensor_msgs/msg/Image.msg /root/crf/ros_msg_types/sensor_msgs_msg/Image.msg
+/ob_camera_02/color/image_raw/compressed sensor_msgs/CompressedImage /opt/ros/noetic/share/sensor_msgs/msg/CompressedImage.msg /root/crf/ros_msg_types/sensor_msgs_msg/CompressedImage.msg
+/ob_camera_02/color/image_raw/compressed/parameter_descriptions dynamic_reconfigure/ConfigDescription /opt/ros/noetic/share/dynamic_reconfigure/msg/ConfigDescription.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/ConfigDescription.msg
+/ob_camera_02/color/image_raw/compressed/parameter_updates dynamic_reconfigure/Config /opt/ros/noetic/share/dynamic_reconfigure/msg/Config.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/Config.msg
+/ob_camera_02/color/image_raw/compressedDepth sensor_msgs/CompressedImage /opt/ros/noetic/share/sensor_msgs/msg/CompressedImage.msg /root/crf/ros_msg_types/sensor_msgs_msg/CompressedImage.msg
+/ob_camera_02/color/image_raw/compressedDepth/parameter_descriptions dynamic_reconfigure/ConfigDescription /opt/ros/noetic/share/dynamic_reconfigure/msg/ConfigDescription.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/ConfigDescription.msg
+/ob_camera_02/color/image_raw/compressedDepth/parameter_updates dynamic_reconfigure/Config /opt/ros/noetic/share/dynamic_reconfigure/msg/Config.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/Config.msg
+/ob_camera_02/color/image_raw/theora theora_image_transport/Packet /opt/ros/noetic/share/theora_image_transport/msg/Packet.msg /root/crf/ros_msg_types/theora_image_transport_msg/Packet.msg
+/ob_camera_02/color/image_raw/theora/parameter_descriptions dynamic_reconfigure/ConfigDescription /opt/ros/noetic/share/dynamic_reconfigure/msg/ConfigDescription.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/ConfigDescription.msg
+/ob_camera_02/color/image_raw/theora/parameter_updates dynamic_reconfigure/Config /opt/ros/noetic/share/dynamic_reconfigure/msg/Config.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/Config.msg
+/ob_camera_02/depth/camera_info sensor_msgs/CameraInfo    /opt/ros/noetic/share/sensor_msgs/msg/CameraInfo.msg /root/crf/ros_msg_types/sensor_msgs_msg/CameraInfo.msg
+/ob_camera_02/depth/image_raw sensor_msgs/Image         /opt/ros/noetic/share/sensor_msgs/msg/Image.msg /root/crf/ros_msg_types/sensor_msgs_msg/Image.msg
+/ob_camera_02/depth/image_raw/compressed sensor_msgs/CompressedImage /opt/ros/noetic/share/sensor_msgs/msg/CompressedImage.msg /root/crf/ros_msg_types/sensor_msgs_msg/CompressedImage.msg
+/ob_camera_02/depth/image_raw/compressed/parameter_descriptions dynamic_reconfigure/ConfigDescription /opt/ros/noetic/share/dynamic_reconfigure/msg/ConfigDescription.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/ConfigDescription.msg
+/ob_camera_02/depth/image_raw/compressed/parameter_updates dynamic_reconfigure/Config /opt/ros/noetic/share/dynamic_reconfigure/msg/Config.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/Config.msg
+/ob_camera_02/depth/image_raw/compressedDepth sensor_msgs/CompressedImage /opt/ros/noetic/share/sensor_msgs/msg/CompressedImage.msg /root/crf/ros_msg_types/sensor_msgs_msg/CompressedImage.msg
+/ob_camera_02/depth/image_raw/compressedDepth/parameter_descriptions dynamic_reconfigure/ConfigDescription /opt/ros/noetic/share/dynamic_reconfigure/msg/ConfigDescription.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/ConfigDescription.msg
+/ob_camera_02/depth/image_raw/compressedDepth/parameter_updates dynamic_reconfigure/Config /opt/ros/noetic/share/dynamic_reconfigure/msg/Config.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/Config.msg
+/ob_camera_02/depth/image_raw/theora theora_image_transport/Packet /opt/ros/noetic/share/theora_image_transport/msg/Packet.msg /root/crf/ros_msg_types/theora_image_transport_msg/Packet.msg
+/ob_camera_02/depth/image_raw/theora/parameter_descriptions dynamic_reconfigure/ConfigDescription /opt/ros/noetic/share/dynamic_reconfigure/msg/ConfigDescription.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/ConfigDescription.msg
+/ob_camera_02/depth/image_raw/theora/parameter_updates dynamic_reconfigure/Config /opt/ros/noetic/share/dynamic_reconfigure/msg/Config.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/Config.msg
+/ob_camera_02/depth/points sensor_msgs/PointCloud2   /opt/ros/noetic/share/sensor_msgs/msg/PointCloud2.msg /root/crf/ros_msg_types/sensor_msgs_msg/PointCloud2.msg
+/obberc_camera_back_pose  geometry_msgs/PoseStamped /opt/ros/noetic/share/geometry_msgs/msg/PoseStamped.msg /root/crf/ros_msg_types/geometry_msgs_msg/PoseStamped.msg
+/obberc_camera_pose       geometry_msgs/PoseStamped /opt/ros/noetic/share/geometry_msgs/msg/PoseStamped.msg /root/crf/ros_msg_types/geometry_msgs_msg/PoseStamped.msg
+/obstacle_detection       std_msgs/UInt8            /opt/ros/noetic/share/std_msgs/msg/UInt8.msg /root/crf/ros_msg_types/std_msgs_msg/UInt8.msg
+/odom                     nav_msgs/Odometry         /opt/ros/noetic/share/nav_msgs/msg/Odometry.msg /root/crf/ros_msg_types/nav_msgs_msg/Odometry.msg
+/odom_jump                std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/odom_localization        std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/odom_raw                 nav_msgs/Odometry         /opt/ros/noetic/share/nav_msgs/msg/Odometry.msg /root/crf/ros_msg_types/nav_msgs_msg/Odometry.msg
+/old_imu                  sensor_msgs/Imu           /opt/ros/noetic/share/sensor_msgs/msg/Imu.msg /root/crf/ros_msg_types/sensor_msgs_msg/Imu.msg
+/out_wallLine             sensor_msgs/PointCloud2   /opt/ros/noetic/share/sensor_msgs/msg/PointCloud2.msg /root/crf/ros_msg_types/sensor_msgs_msg/PointCloud2.msg
+/particlecloud            geometry_msgs/PoseArray   /opt/ros/noetic/share/geometry_msgs/msg/PoseArray.msg /root/crf/ros_msg_types/geometry_msgs_msg/PoseArray.msg
+/pointcloud_topic         sensor_msgs/PointCloud2   /opt/ros/noetic/share/sensor_msgs/msg/PointCloud2.msg /root/crf/ros_msg_types/sensor_msgs_msg/PointCloud2.msg
+/pole_scan                sensor_msgs/LaserScan     /opt/ros/noetic/share/sensor_msgs/msg/LaserScan.msg /root/crf/ros_msg_types/sensor_msgs_msg/LaserScan.msg
+/pose_correct_topic       geometry_msgs/PoseWithCovarianceStamped /opt/ros/noetic/share/geometry_msgs/msg/PoseWithCovarianceStamped.msg /root/crf/ros_msg_types/geometry_msgs_msg/PoseWithCovarianceStamped.msg
+/preventfalling           geometry_msgs/Vector3Stamped /opt/ros/noetic/share/geometry_msgs/msg/Vector3Stamped.msg /root/crf/ros_msg_types/geometry_msgs_msg/Vector3Stamped.msg
+/pro_map_ctrl             std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/qs/clean_area            common_msgs/FunctionAreas /root/pjirobot/install/share/common_msgs/msg/FunctionAreas.msg /root/crf/ros_msg_types/common_msgs_msg/FunctionAreas.msg
+/qs/start_detectwall_line std_msgs/Bool             /opt/ros/noetic/share/std_msgs/msg/Bool.msg /root/crf/ros_msg_types/std_msgs_msg/Bool.msg
+/reference_path           nav_msgs/Path             /opt/ros/noetic/share/nav_msgs/msg/Path.msg /root/crf/ros_msg_types/nav_msgs_msg/Path.msg
+/robot_add                std_msgs/Float64MultiArray /opt/ros/noetic/share/std_msgs/msg/Float64MultiArray.msg /root/crf/ros_msg_types/std_msgs_msg/Float64MultiArray.msg
+/robot_is_slip            std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/robot_kidnap_state       std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/robot_lost               std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/robot_pose               geometry_msgs/PoseStamped /opt/ros/noetic/share/geometry_msgs/msg/PoseStamped.msg /root/crf/ros_msg_types/geometry_msgs_msg/PoseStamped.msg
+/robot_pose_tf            geometry_msgs/PoseWithCovarianceStamped /opt/ros/noetic/share/geometry_msgs/msg/PoseWithCovarianceStamped.msg /root/crf/ros_msg_types/geometry_msgs_msg/PoseWithCovarianceStamped.msg
+/robot_shock              std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/robot_static_state       std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/robot_status             localization_monitor/RobotStatus /root/pjirobot/install/share/localization_monitor/msg/RobotStatus.msg /root/crf/ros_msg_types/localization_monitor_msg/RobotStatus.msg
+/robot_sub                std_msgs/Float64MultiArray /opt/ros/noetic/share/std_msgs/msg/Float64MultiArray.msg /root/crf/ros_msg_types/std_msgs_msg/Float64MultiArray.msg
+/robot_sudden_state       std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/room_segmentation_server/cancel actionlib_msgs/GoalID     /opt/ros/noetic/share/actionlib_msgs/msg/GoalID.msg /root/crf/ros_msg_types/actionlib_msgs_msg/GoalID.msg
+/room_segmentation_server/feedback ipa_building_msgs/MapSegmentationActionFeedback /root/pjirobot/install/share/ipa_building_msgs/msg/MapSegmentationActionFeedback.msg /root/crf/ros_msg_types/ipa_building_msgs_msg/MapSegmentationActionFeedback.msg
+/room_segmentation_server/goal ipa_building_msgs/MapSegmentationActionGoal /root/pjirobot/install/share/ipa_building_msgs/msg/MapSegmentationActionGoal.msg /root/crf/ros_msg_types/ipa_building_msgs_msg/MapSegmentationActionGoal.msg
+/room_segmentation_server/parameter_descriptions dynamic_reconfigure/ConfigDescription /opt/ros/noetic/share/dynamic_reconfigure/msg/ConfigDescription.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/ConfigDescription.msg
+/room_segmentation_server/parameter_updates dynamic_reconfigure/Config /opt/ros/noetic/share/dynamic_reconfigure/msg/Config.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/Config.msg
+/room_segmentation_server/result ipa_building_msgs/MapSegmentationActionResult /root/pjirobot/install/share/ipa_building_msgs/msg/MapSegmentationActionResult.msg /root/crf/ros_msg_types/ipa_building_msgs_msg/MapSegmentationActionResult.msg
+/room_segmentation_server/segmented_map nav_msgs/OccupancyGrid    /opt/ros/noetic/share/nav_msgs/msg/OccupancyGrid.msg /root/crf/ros_msg_types/nav_msgs_msg/OccupancyGrid.msg
+/room_segmentation_server/status actionlib_msgs/GoalStatusArray /opt/ros/noetic/share/actionlib_msgs/msg/GoalStatusArray.msg /root/crf/ros_msg_types/actionlib_msgs_msg/GoalStatusArray.msg
+/rosout                   rosgraph_msgs/Log         /opt/ros/noetic/share/rosgraph_msgs/msg/Log.msg /root/crf/ros_msg_types/rosgraph_msgs_msg/Log.msg
+/rosout_agg               rosgraph_msgs/Log         /opt/ros/noetic/share/rosgraph_msgs/msg/Log.msg /root/crf/ros_msg_types/rosgraph_msgs_msg/Log.msg
+/rviz_task_global_path    nav_msgs/Path             /opt/ros/noetic/share/nav_msgs/msg/Path.msg /root/crf/ros_msg_types/nav_msgs_msg/Path.msg
+/safety                   geometry_msgs/Vector3Stamped /opt/ros/noetic/share/geometry_msgs/msg/Vector3Stamped.msg /root/crf/ros_msg_types/geometry_msgs_msg/Vector3Stamped.msg
+/scan                     sensor_msgs/LaserScan     /opt/ros/noetic/share/sensor_msgs/msg/LaserScan.msg /root/crf/ros_msg_types/sensor_msgs_msg/LaserScan.msg
+/scan_back_top            sensor_msgs/LaserScan     /opt/ros/noetic/share/sensor_msgs/msg/LaserScan.msg /root/crf/ros_msg_types/sensor_msgs_msg/LaserScan.msg
+/scan_cliff               sensor_msgs/LaserScan     /opt/ros/noetic/share/sensor_msgs/msg/LaserScan.msg /root/crf/ros_msg_types/sensor_msgs_msg/LaserScan.msg
+/scan_front_down          sensor_msgs/LaserScan     /opt/ros/noetic/share/sensor_msgs/msg/LaserScan.msg /root/crf/ros_msg_types/sensor_msgs_msg/LaserScan.msg
+/scan_front_top           sensor_msgs/LaserScan     /opt/ros/noetic/share/sensor_msgs/msg/LaserScan.msg /root/crf/ros_msg_types/sensor_msgs_msg/LaserScan.msg
+/scan_map_icp_amcl_node/map_point sensor_msgs/PointCloud2   /opt/ros/noetic/share/sensor_msgs/msg/PointCloud2.msg /root/crf/ros_msg_types/sensor_msgs_msg/PointCloud2.msg
+/scan_map_icp_amcl_node/scan_point_transformed sensor_msgs/PointCloud2   /opt/ros/noetic/share/sensor_msgs/msg/PointCloud2.msg /root/crf/ros_msg_types/sensor_msgs_msg/PointCloud2.msg
+/segmentation_map_marker  visualization_msgs/MarkerArray /opt/ros/noetic/share/visualization_msgs/msg/MarkerArray.msg /root/crf/ros_msg_types/visualization_msgs_msg/MarkerArray.msg
+/sensor_task              common_msgs/SensorTask    /root/pjirobot/install/share/common_msgs/msg/SensorTask.msg /root/crf/ros_msg_types/common_msgs_msg/SensorTask.msg
+/slip_topic               std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/sonar_alarm              geometry_msgs/Vector3Stamped /opt/ros/noetic/share/geometry_msgs/msg/Vector3Stamped.msg /root/crf/ros_msg_types/geometry_msgs_msg/Vector3Stamped.msg
+/sonar_list               common_msgs/SonarList     /root/pjirobot/install/share/common_msgs/msg/SonarList.msg /root/crf/ros_msg_types/common_msgs_msg/SonarList.msg
+/srf_data                 nav_msgs/Odometry         /opt/ros/noetic/share/nav_msgs/msg/Odometry.msg /root/crf/ros_msg_types/nav_msgs_msg/Odometry.msg
+/srf_laser_odometry_node/srf_laser_truncated sensor_msgs/LaserScan     /opt/ros/noetic/share/sensor_msgs/msg/LaserScan.msg /root/crf/ros_msg_types/sensor_msgs_msg/LaserScan.msg
+/start_relocate           std_msgs/Bool             /opt/ros/noetic/share/std_msgs/msg/Bool.msg /root/crf/ros_msg_types/std_msgs_msg/Bool.msg
+/static_scan              sensor_msgs/LaserScan     /opt/ros/noetic/share/sensor_msgs/msg/LaserScan.msg /root/crf/ros_msg_types/sensor_msgs_msg/LaserScan.msg
+/sudden_stop_state_       std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/sunny/run_camera         std_msgs/Bool             /opt/ros/noetic/share/std_msgs/msg/Bool.msg /root/crf/ros_msg_types/std_msgs_msg/Bool.msg
+/sunny_topic/device_HST007/tof_frame/camera_info sensor_msgs/CameraInfo    /opt/ros/noetic/share/sensor_msgs/msg/CameraInfo.msg /root/crf/ros_msg_types/sensor_msgs_msg/CameraInfo.msg
+/sys_info                 common_msgs/SysInfo       /root/pjirobot/install/share/common_msgs/msg/SysInfo.msg /root/crf/ros_msg_types/common_msgs_msg/SysInfo.msg
+/tag_detections_image     sensor_msgs/Image         /opt/ros/noetic/share/sensor_msgs/msg/Image.msg /root/crf/ros_msg_types/sensor_msgs_msg/Image.msg
+/tag_detections_image/compressed sensor_msgs/CompressedImage /opt/ros/noetic/share/sensor_msgs/msg/CompressedImage.msg /root/crf/ros_msg_types/sensor_msgs_msg/CompressedImage.msg
+/tag_detections_image/compressed/parameter_descriptions dynamic_reconfigure/ConfigDescription /opt/ros/noetic/share/dynamic_reconfigure/msg/ConfigDescription.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/ConfigDescription.msg
+/tag_detections_image/compressed/parameter_updates dynamic_reconfigure/Config /opt/ros/noetic/share/dynamic_reconfigure/msg/Config.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/Config.msg
+/tag_detections_image/compressedDepth sensor_msgs/CompressedImage /opt/ros/noetic/share/sensor_msgs/msg/CompressedImage.msg /root/crf/ros_msg_types/sensor_msgs_msg/CompressedImage.msg
+/tag_detections_image/compressedDepth/parameter_descriptions dynamic_reconfigure/ConfigDescription /opt/ros/noetic/share/dynamic_reconfigure/msg/ConfigDescription.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/ConfigDescription.msg
+/tag_detections_image/compressedDepth/parameter_updates dynamic_reconfigure/Config /opt/ros/noetic/share/dynamic_reconfigure/msg/Config.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/Config.msg
+/tag_detections_image/theora theora_image_transport/Packet /opt/ros/noetic/share/theora_image_transport/msg/Packet.msg /root/crf/ros_msg_types/theora_image_transport_msg/Packet.msg
+/tag_detections_image/theora/parameter_descriptions dynamic_reconfigure/ConfigDescription /opt/ros/noetic/share/dynamic_reconfigure/msg/ConfigDescription.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/ConfigDescription.msg
+/tag_detections_image/theora/parameter_updates dynamic_reconfigure/Config /opt/ros/noetic/share/dynamic_reconfigure/msg/Config.msg /root/crf/ros_msg_types/dynamic_reconfigure_msg/Config.msg
+/tag_start                std_msgs/Bool             /opt/ros/noetic/share/std_msgs/msg/Bool.msg /root/crf/ros_msg_types/std_msgs_msg/Bool.msg
+/target1                  geometry_msgs/PoseStamped /opt/ros/noetic/share/geometry_msgs/msg/PoseStamped.msg /root/crf/ros_msg_types/geometry_msgs_msg/PoseStamped.msg
+/task                     geometry_msgs/Vector3Stamped /opt/ros/noetic/share/geometry_msgs/msg/Vector3Stamped.msg /root/crf/ros_msg_types/geometry_msgs_msg/Vector3Stamped.msg
+/task_feedback_info       common_msgs/TaskFeedbackInfo /root/pjirobot/install/share/common_msgs/msg/TaskFeedbackInfo.msg /root/crf/ros_msg_types/common_msgs_msg/TaskFeedbackInfo.msg
+/task_global_path         common_msgs/Points        /root/pjirobot/install/share/common_msgs/msg/Points.msg /root/crf/ros_msg_types/common_msgs_msg/Points.msg
+/tf                       tf2_msgs/TFMessage        /opt/ros/noetic/share/tf2_msgs/msg/TFMessage.msg /root/crf/ros_msg_types/tf2_msgs_msg/TFMessage.msg
+/tf_data_error            std_msgs/String           /opt/ros/noetic/share/std_msgs/msg/String.msg /root/crf/ros_msg_types/std_msgs_msg/String.msg
+/tf_static                tf2_msgs/TFMessage        /opt/ros/noetic/share/tf2_msgs/msg/TFMessage.msg /root/crf/ros_msg_types/tf2_msgs_msg/TFMessage.msg
+/udata_fusion_path        nav_msgs/Path             /opt/ros/noetic/share/nav_msgs/msg/Path.msg /root/crf/ros_msg_types/nav_msgs_msg/Path.msg
+/uploadBag                common_msgs/UpLoadFileList /root/pjirobot/install/share/common_msgs/msg/UpLoadFileList.msg /root/crf/ros_msg_types/common_msgs_msg/UpLoadFileList.msg
+/vl_left                  sensor_msgs/Range         /opt/ros/noetic/share/sensor_msgs/msg/Range.msg /root/crf/ros_msg_types/sensor_msgs_msg/Range.msg
+/xd1a_0                   sensor_msgs/LaserScan     /opt/ros/noetic/share/sensor_msgs/msg/LaserScan.msg /root/crf/ros_msg_types/sensor_msgs_msg/LaserScan.msg
+/xd1a_1                   sensor_msgs/LaserScan     /opt/ros/noetic/share/sensor_msgs/msg/LaserScan.msg /root/crf/ros_msg_types/sensor_msgs_msg/LaserScan.msg
+/xd1a_2                   sensor_msgs/LaserScan     /opt/ros/noetic/share/sensor_msgs/msg/LaserScan.msg /root/crf/ros_msg_types/sensor_msgs_msg/LaserScan.msg
+/xd1a_3                   sensor_msgs/LaserScan     /opt/ros/noetic/share/sensor_msgs/msg/LaserScan.msg /root/crf/ros_msg_types/sensor_msgs_msg/LaserScan.msg
+
+完成! 所有找到的消息类型定义已复制到: /root/crf/ros_msg_types

+ 284 - 0
aarch64/pjibot_clean/master/package/config/清洁机器人话题列表.txt

@@ -0,0 +1,284 @@
+/Electrification
+/along_wall_start_point
+/amcl/parameter_descriptions
+/amcl/parameter_updates
+/amcl_enter_mapconvert_topic
+/amcl_pose
+/amcl_relocalization_finish_pub
+/amcl_topic
+/any_eye/run_line_light
+/application_heart_beat
+/auto_dock/heart
+/back_top_points_process
+/batter
+/boot_time
+/boundingboxes_line
+/call_icp
+/camera/depth/camera_info
+/camera/depth/image_raw
+/camera/depth/image_raw/compressed
+/camera/depth/image_raw/compressed/parameter_descriptions
+/camera/depth/image_raw/compressed/parameter_updates
+/camera/depth/image_raw/compressedDepth
+/camera/depth/image_raw/compressedDepth/parameter_descriptions
+/camera/depth/image_raw/compressedDepth/parameter_updates
+/camera/depth/image_raw/theora
+/camera/depth/image_raw/theora/parameter_descriptions
+/camera/depth/image_raw/theora/parameter_updates
+/camera/depth/points
+/camera/ir/camera_info
+/camera/ir/image_raw
+/camera/ir/image_raw/compressed
+/camera/ir/image_raw/compressed/parameter_descriptions
+/camera/ir/image_raw/compressed/parameter_updates
+/camera/ir/image_raw/compressedDepth
+/camera/ir/image_raw/compressedDepth/parameter_descriptions
+/camera/ir/image_raw/compressedDepth/parameter_updates
+/camera/ir/image_raw/theora
+/camera/ir/image_raw/theora/parameter_descriptions
+/camera/ir/image_raw/theora/parameter_updates
+/charge_tag_pos
+/charge_target
+/clean_pnc/astar_path_planner/path
+/clean_pnc/battery_state
+/clean_pnc/bumper
+/clean_pnc/charger/station_line
+/clean_pnc/charging_station/detect_position
+/clean_pnc/charging_station/odom_position
+/clean_pnc/charging_station/position
+/clean_pnc/clean_cmd
+/clean_pnc/cost_map/footprint
+/clean_pnc/cost_map/footprint_spec
+/clean_pnc/cost_map/global_costmap
+/clean_pnc/cost_map/local_costmap
+/clean_pnc/cost_map/task_costmap
+/clean_pnc/cur_clean_area
+/clean_pnc/current_task_list_loop_times
+/clean_pnc/dwa_path_planner/global_path
+/clean_pnc/error_code
+/clean_pnc/function_map/compute_follow_path_map
+/clean_pnc/function_map/forbidden_clean_area
+/clean_pnc/function_map/need_clean_area
+/clean_pnc/function_map/no_need_clean_area
+/clean_pnc/function_map/task_cleaned_map
+/clean_pnc/function_map/task_list_cleaned_map
+/clean_pnc/save_report
+/clean_pnc/scram_button
+/clean_pnc/type/pause
+/clean_polygon
+/clicked_point
+/close_imu_topic_
+/cloud_cmd
+/cmd_vel
+/collisionDetection
+/create_map_info
+/ctrl_speed_deal_before
+/current/sensor_status
+/custom_path
+/data_fusion_path
+/detect/boundingboxes
+/diagnostic/mcu
+/diagnostics
+/disinfection
+/disinfection_info
+/dock_flag
+/dynamic_scan
+/dynamic_wall_line_pub
+/elevate_scence
+/elevate_state_topic
+/elevator_dwa/task_status
+/engine/current_robot_mode
+/engine/current_task_info
+/engine/map_info
+/engine/out_line_path
+/engine/video_stream_push
+/floor_downsample
+/follow_path_path
+/front_down_points_process
+/front_top_points_downsample1
+/front_top_points_process
+/global_goal
+/global_path
+/hst007_camera_pose
+/icp_initial_pose
+/icp_localization_check_topic
+/icp_relocalization_finish_pub_topic
+/icp_relocalization_pub_topic
+/icp_relocalization_sub_topic
+/icp_run_topic
+/icp_score
+/icp_service
+/icp_topic
+/imu
+/imu_cal_state
+/imu_calibration_state
+/imu_calibration_temperature
+/imu_slover_param
+/incline_localization
+/initialpose
+/joint_states
+/kibana_log
+/landmark
+/laser_odom
+/leg_scan
+/lm_imu
+/local_path_update
+/localation_monitor_topic
+/localization_convertMap_topic
+/localization_fail
+/localization_monitor_node/localation_monitor_topic
+/localization_recover_pose
+/localization_rocover_state
+/localization_state_modiy
+/locate_info
+/locate_state
+/lost_localization_state_
+/lost_localization_warning_state
+/manual_close_icp_topic
+/map
+/map_base64
+/map_border
+/map_merge_node/amcl_topic
+/map_merge_node/icp_topic
+/map_metadata
+/move_base/GlobalPlanner/plan
+/move_base_simple/goal
+/mpc_cost_map
+/mpc_cost_map1
+/multi_persion_block
+/mutli_person_block_pub
+/new_imu
+/node_Monitor
+/node_Monitor/clean_pnc/state
+/ob_camera_01/color/camera_info
+/ob_camera_01/color/image_raw
+/ob_camera_01/color/image_raw/compressed
+/ob_camera_01/color/image_raw/compressed/parameter_descriptions
+/ob_camera_01/color/image_raw/compressed/parameter_updates
+/ob_camera_01/color/image_raw/compressedDepth
+/ob_camera_01/color/image_raw/compressedDepth/parameter_descriptions
+/ob_camera_01/color/image_raw/compressedDepth/parameter_updates
+/ob_camera_01/color/image_raw/theora
+/ob_camera_01/color/image_raw/theora/parameter_descriptions
+/ob_camera_01/color/image_raw/theora/parameter_updates
+/ob_camera_01/depth/camera_info
+/ob_camera_01/depth/image_raw
+/ob_camera_01/depth/image_raw/compressed
+/ob_camera_01/depth/image_raw/compressed/parameter_descriptions
+/ob_camera_01/depth/image_raw/compressed/parameter_updates
+/ob_camera_01/depth/image_raw/compressedDepth
+/ob_camera_01/depth/image_raw/compressedDepth/parameter_descriptions
+/ob_camera_01/depth/image_raw/compressedDepth/parameter_updates
+/ob_camera_01/depth/image_raw/theora
+/ob_camera_01/depth/image_raw/theora/parameter_descriptions
+/ob_camera_01/depth/image_raw/theora/parameter_updates
+/ob_camera_01/depth/points
+/ob_camera_02/color/camera_info
+/ob_camera_02/color/image_raw
+/ob_camera_02/color/image_raw/compressed
+/ob_camera_02/color/image_raw/compressed/parameter_descriptions
+/ob_camera_02/color/image_raw/compressed/parameter_updates
+/ob_camera_02/color/image_raw/compressedDepth
+/ob_camera_02/color/image_raw/compressedDepth/parameter_descriptions
+/ob_camera_02/color/image_raw/compressedDepth/parameter_updates
+/ob_camera_02/color/image_raw/theora
+/ob_camera_02/color/image_raw/theora/parameter_descriptions
+/ob_camera_02/color/image_raw/theora/parameter_updates
+/ob_camera_02/depth/camera_info
+/ob_camera_02/depth/image_raw
+/ob_camera_02/depth/image_raw/compressed
+/ob_camera_02/depth/image_raw/compressed/parameter_descriptions
+/ob_camera_02/depth/image_raw/compressed/parameter_updates
+/ob_camera_02/depth/image_raw/compressedDepth
+/ob_camera_02/depth/image_raw/compressedDepth/parameter_descriptions
+/ob_camera_02/depth/image_raw/compressedDepth/parameter_updates
+/ob_camera_02/depth/image_raw/theora
+/ob_camera_02/depth/image_raw/theora/parameter_descriptions
+/ob_camera_02/depth/image_raw/theora/parameter_updates
+/ob_camera_02/depth/points
+/obberc_camera_back_pose
+/obberc_camera_pose
+/obstacle_detection
+/odom
+/odom_jump
+/odom_localization
+/odom_raw
+/old_imu
+/out_wallLine
+/particlecloud
+/pointcloud_topic
+/pole_scan
+/pose_correct_topic
+/preventfalling
+/pro_map_ctrl
+/qs/clean_area
+/qs/start_detectwall_line
+/reference_path
+/robot_add
+/robot_is_slip
+/robot_kidnap_state
+/robot_lost
+/robot_pose
+/robot_pose_tf
+/robot_shock
+/robot_static_state
+/robot_status
+/robot_sub
+/robot_sudden_state
+/room_segmentation_server/cancel
+/room_segmentation_server/feedback
+/room_segmentation_server/goal
+/room_segmentation_server/parameter_descriptions
+/room_segmentation_server/parameter_updates
+/room_segmentation_server/result
+/room_segmentation_server/segmented_map
+/room_segmentation_server/status
+/rosout
+/rosout_agg
+/rviz_task_global_path
+/safety
+/scan
+/scan_back_top
+/scan_cliff
+/scan_front_down
+/scan_front_top
+/scan_map_icp_amcl_node/map_point
+/scan_map_icp_amcl_node/scan_point_transformed
+/segmentation_map_marker
+/sensor_task
+/slip_topic
+/sonar_alarm
+/sonar_list
+/srf_data
+/srf_laser_odometry_node/srf_laser_truncated
+/start_relocate
+/static_scan
+/sudden_stop_state_
+/sunny/run_camera
+/sunny_topic/device_HST007/tof_frame/camera_info
+/sys_info
+/tag_detections_image
+/tag_detections_image/compressed
+/tag_detections_image/compressed/parameter_descriptions
+/tag_detections_image/compressed/parameter_updates
+/tag_detections_image/compressedDepth
+/tag_detections_image/compressedDepth/parameter_descriptions
+/tag_detections_image/compressedDepth/parameter_updates
+/tag_detections_image/theora
+/tag_detections_image/theora/parameter_descriptions
+/tag_detections_image/theora/parameter_updates
+/tag_start
+/target1
+/task
+/task_feedback_info
+/task_global_path
+/tf
+/tf_data_error
+/tf_static
+/udata_fusion_path
+/uploadBag
+/vl_left
+/xd1a_0
+/xd1a_1
+/xd1a_2
+/xd1a_3

+ 96 - 0
aarch64/pjibot_clean/master/package/service/collect_one_msg.go

@@ -0,0 +1,96 @@
+package service
+
+import (
+	"cicv-data-closedloop/aarch64/pjibot_clean/common/config"
+	"cicv-data-closedloop/common/config/c_log"
+	"cicv-data-closedloop/common/util"
+	"os"
+)
+
+func CollectOneMsg() {
+	collectMap()
+	collectTfStatic()
+	collectCostmap()
+}
+
+func collectMap() {
+
+	// rosbag record -O /root/cicv-data-closedloop/map_data.bag -l 1 /map
+	ossMapBagObjectKey := config.LocalConfig.OssBasePrefix + config.LocalConfig.EquipmentNo + "/map.bag"
+
+	var command []string
+	command = append(command, "record")
+	command = append(command, "-O")
+	command = append(command, config.CloudConfig.MapBagPath)
+	command = append(command, "-l")
+	command = append(command, "1")
+	command = append(command, "/map")
+	_, s, err := util.ExecuteWithEnvAndDir(config.RosbagEnvs, config.CloudConfig.BagDataDir, config.RosbagPath, command...)
+	if err != nil {
+		c_log.GlobalLogger.Error("程序异常退出。采集/map包", command, "出错:", s, "----", err)
+		os.Exit(-1)
+	}
+	c_log.GlobalLogger.Info("采集/map包", command, "完成。")
+	config.OssMutex.Lock()
+	err = config.OssBucket.PutObjectFromFile(ossMapBagObjectKey, config.CloudConfig.MapBagPath)
+	config.OssMutex.Unlock()
+	if err != nil {
+		c_log.GlobalLogger.Error("程序异常退出。上传/map包", config.CloudConfig.MapBagPath, "->", ossMapBagObjectKey, "出错:", err)
+		os.Exit(-1)
+	}
+	c_log.GlobalLogger.Info("上传/map包", config.CloudConfig.MapBagPath, "------", ossMapBagObjectKey, "成功。")
+}
+func collectTfStatic() {
+
+	// rosbag record -O /root/cicv-data-closedloop/map_data.bag -l 1 /map
+	ossMapBagObjectKey := config.LocalConfig.OssBasePrefix + config.LocalConfig.EquipmentNo + "/tfstatic.bag"
+
+	var command []string
+	command = append(command, "record")
+	command = append(command, "-O")
+	command = append(command, config.CloudConfig.MapBagPath)
+	command = append(command, "-l")
+	command = append(command, "1")
+	command = append(command, "/tf_static")
+	_, s, err := util.ExecuteWithEnvAndDir(config.RosbagEnvs, config.CloudConfig.BagDataDir, config.RosbagPath, command...)
+	if err != nil {
+		c_log.GlobalLogger.Error("程序异常退出。采集/tf_static包", command, "出错:", s, "----", err)
+		os.Exit(-1)
+	}
+	c_log.GlobalLogger.Info("采集/tf_static包", command, "完成。")
+	config.OssMutex.Lock()
+	err = config.OssBucket.PutObjectFromFile(ossMapBagObjectKey, config.CloudConfig.MapBagPath)
+	config.OssMutex.Unlock()
+	if err != nil {
+		c_log.GlobalLogger.Error("程序异常退出。上传/tf_static包", config.CloudConfig.MapBagPath, "->", ossMapBagObjectKey, "出错:", err)
+		os.Exit(-1)
+	}
+	c_log.GlobalLogger.Info("上传/tf_static包", config.CloudConfig.MapBagPath, "------", ossMapBagObjectKey, "成功。")
+}
+func collectCostmap() {
+
+	// rosbag record -O /root/cicv-data-closedloop/map_data.bag -l 1 /map
+	ossMapBagObjectKey := config.LocalConfig.OssBasePrefix + config.LocalConfig.EquipmentNo + "/costmap.bag"
+
+	var command []string
+	command = append(command, "record")
+	command = append(command, "-O")
+	command = append(command, config.CloudConfig.MapBagPath)
+	command = append(command, "-l")
+	command = append(command, "1")
+	command = append(command, "/move_base/global_costmap/costmap")
+	_, s, err := util.ExecuteWithEnvAndDir(config.RosbagEnvs, config.CloudConfig.BagDataDir, config.RosbagPath, command...)
+	if err != nil {
+		c_log.GlobalLogger.Error("程序异常退出。采集/move_base/global_costmap/costmap包", command, "出错:", s, "----", err)
+		os.Exit(-1)
+	}
+	c_log.GlobalLogger.Info("采集/move_base/global_costmap/costmap包", command, "完成。")
+	config.OssMutex.Lock()
+	err = config.OssBucket.PutObjectFromFile(ossMapBagObjectKey, config.CloudConfig.MapBagPath)
+	config.OssMutex.Unlock()
+	if err != nil {
+		c_log.GlobalLogger.Error("程序异常退出。上传/move_base/global_costmap/costmap包", config.CloudConfig.MapBagPath, "->", ossMapBagObjectKey, "出错:", err)
+		os.Exit(-1)
+	}
+	c_log.GlobalLogger.Info("上传/move_base/global_costmap/costmap包", config.CloudConfig.MapBagPath, "------", ossMapBagObjectKey, "成功。")
+}

+ 73 - 0
aarch64/pjibot_clean/master/package/service/move_bag_and_send_window.go

@@ -0,0 +1,73 @@
+package service
+
+import (
+	commonConfig "cicv-data-closedloop/aarch64/pjibot_clean/common/config"
+	commonService "cicv-data-closedloop/aarch64/pjibot_clean/common/service"
+	"cicv-data-closedloop/common/config/c_log"
+	"cicv-data-closedloop/common/domain"
+	"cicv-data-closedloop/common/entity"
+	"cicv-data-closedloop/common/util"
+	"time"
+)
+
+// 将时间窗口内的包全部move出去,并等待当前时间窗口结束触发上传
+func RunTimeWindowProducerQueue() {
+	c_log.GlobalLogger.Info("生产者队列goroutine - 启动")
+	for {
+		// 收到自杀信号
+		select {
+		case signal := <-commonService.ChannelKillMove:
+			if signal == 1 {
+				commonService.ChannelKillMove <- 1
+				if len(entity.TimeWindowProducerQueue) == 0 {
+					commonService.AddKillTimes("4")
+					return
+				}
+			} else { //signal == 2
+				commonService.AddKillTimes("4")
+				return
+			}
+		default:
+		}
+
+		// 处理
+		time.Sleep(time.Duration(1) * time.Second)
+		if len(entity.TimeWindowProducerQueue) > 0 {
+			// 处理
+			bags, _ := util.ListAbsolutePathWithSuffixAndSort(commonConfig.CloudConfig.BagDataDir, ".bag")
+			currentTimeWindow := entity.TimeWindowProducerQueue[0]
+			move := false
+			bigger := false
+			for _, bag := range bags {
+				bagTime := util.GetBagTime(bag)
+				// 2 如果bag不小于timeWindowBegin不大于timeWindowEnd,则移动
+				compare1 := util.TimeCustom1GreaterEqualThanTimeCustom2(bagTime, currentTimeWindow.TimeWindowBegin)
+				compare2 := util.TimeCustom1LessEqualThanTimeCustom2(bagTime, currentTimeWindow.TimeWindowEnd)
+				if compare1 && compare2 {
+					// 将bag包移动到Copy目录
+					domain.MoveFromDataToCopy(currentTimeWindow.FaultTime, commonConfig.CloudConfig.BagDataDir, bag, commonConfig.CloudConfig.BagCopyDir)
+					move = true
+				} else {
+					if util.TimeCustom1GreaterEqualThanTimeCustom2(bagTime, currentTimeWindow.TimeWindowBegin) {
+						// 必须已经生成了窗口之后的包才算窗口结束了
+						bigger = true
+						break
+					}
+				}
+			}
+			// 如果没有包可以供当前窗口移动,且已经生成了更新的包,则当前窗口已经可以上传
+			if !move && bigger {
+				time.Sleep(time.Duration(2) * time.Second)
+				c_log.GlobalLogger.Info("采集数据,发送record命令进程关闭信号。")
+				commonService.ChannelKillRosRecord <- 3
+				entity.ProcessingFlag = true
+				domain.SupplyCopyBags(commonConfig.CloudConfig.BagDataDir, commonConfig.CloudConfig.BagCopyDir, currentTimeWindow)
+				// 将时间窗口移出准备队列
+				entity.RemoveHeadOfTimeWindowProducerQueue()
+				// 将时间窗口加入运行队列
+				entity.AddTimeWindowToTimeWindowConsumerQueue(currentTimeWindow)
+				continue
+			}
+		}
+	}
+}

+ 9259 - 0
aarch64/pjibot_clean/master/package/service/produce_window.go

@@ -0,0 +1,9259 @@
+package service
+
+import (
+	commonConfig "cicv-data-closedloop/aarch64/pjibot_clean/common/config"
+	commonService "cicv-data-closedloop/aarch64/pjibot_clean/common/service"
+	masterConfig "cicv-data-closedloop/aarch64/pjibot_clean/master/package/config"
+	"cicv-data-closedloop/common/config/c_log"
+	"cicv-data-closedloop/common/entity"
+	"cicv-data-closedloop/common/util"
+	commonUtil "cicv-data-closedloop/common/util"
+	"cicv-data-closedloop/pjibot_clean_msgs/cartographer_ros_msgs"
+	"cicv-data-closedloop/pjibot_clean_msgs/clean_msg"
+	"cicv-data-closedloop/pjibot_clean_msgs/common_msgs"
+	"cicv-data-closedloop/pjibot_clean_msgs/dynamic_reconfigure"
+	"cicv-data-closedloop/pjibot_clean_msgs/ipa_building_msgs"
+	"cicv-data-closedloop/pjibot_clean_msgs/localization_monitor"
+	"cicv-data-closedloop/pjibot_clean_msgs/theora_image_transport"
+	"encoding/json"
+	"github.com/bluenviron/goroslib/v2"
+	"github.com/bluenviron/goroslib/v2/pkg/msgs/actionlib_msgs"
+	"github.com/bluenviron/goroslib/v2/pkg/msgs/diagnostic_msgs"
+	"github.com/bluenviron/goroslib/v2/pkg/msgs/geometry_msgs"
+	"github.com/bluenviron/goroslib/v2/pkg/msgs/nav_msgs"
+	"github.com/bluenviron/goroslib/v2/pkg/msgs/rosgraph_msgs"
+	"github.com/bluenviron/goroslib/v2/pkg/msgs/sensor_msgs"
+	"github.com/bluenviron/goroslib/v2/pkg/msgs/std_msgs"
+	"github.com/bluenviron/goroslib/v2/pkg/msgs/tf2_msgs"
+	"github.com/bluenviron/goroslib/v2/pkg/msgs/visualization_msgs"
+	"sync"
+	"time"
+)
+
+var (
+	triggerInterval = 3.0 // 每个触发器3秒触发一次
+	logInterval     = 3.0
+	logTime         = time.Now()
+)
+
+// 负责监听所有主题并修改时间窗口
+func PrepareTimeWindowProducerQueue() {
+
+	var err error
+	subscribers := make([]*goroslib.Subscriber, masterConfig.AllTopicsNumber)
+	subscribersTimes := make([]time.Time, masterConfig.AllTopicsNumber)
+	subscribersTimeMutexes := make([]sync.Mutex, masterConfig.AllTopicsNumber)
+	subscribersMutexes := make([]sync.Mutex, masterConfig.AllTopicsNumber)
+	for i, topic := range masterConfig.AllTopics {
+		for {
+			create := false // 判断是否创建成功,用于打印日志
+			if topic == masterConfig.Topic1 && len(masterConfig.Rule1) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.Int16MultiArray) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule1 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic2 && len(masterConfig.Rule2) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *geometry_msgs.PoseStamped) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule2 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic3 && len(masterConfig.Rule3) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.ConfigDescription) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule3 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic4 && len(masterConfig.Rule4) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.Config) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule4 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic5 && len(masterConfig.Rule5) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule5 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic6 && len(masterConfig.Rule6) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *geometry_msgs.PoseWithCovarianceStamped) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule6 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic7 && len(masterConfig.Rule7) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule7 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic8 && len(masterConfig.Rule8) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule8 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic9 && len(masterConfig.Rule9) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.Bool) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule9 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic10 && len(masterConfig.Rule10) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.Int8) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule10 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic11 && len(masterConfig.Rule11) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.Int8) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule11 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic12 && len(masterConfig.Rule12) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.PointCloud2) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule12 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic13 && len(masterConfig.Rule13) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.BatteryState) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule13 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic14 && len(masterConfig.Rule14) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.Int16) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule14 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic15 && len(masterConfig.Rule15) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *visualization_msgs.Marker) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule15 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic16 && len(masterConfig.Rule16) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule16 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic17 && len(masterConfig.Rule17) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.CameraInfo) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule17 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic18 && len(masterConfig.Rule18) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.Image) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule18 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic19 && len(masterConfig.Rule19) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.CompressedImage) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule19 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic20 && len(masterConfig.Rule20) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.ConfigDescription) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule20 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic21 && len(masterConfig.Rule21) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.Config) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule21 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic22 && len(masterConfig.Rule22) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.CompressedImage) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule22 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic23 && len(masterConfig.Rule23) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.ConfigDescription) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule23 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic24 && len(masterConfig.Rule24) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.Config) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule24 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic25 && len(masterConfig.Rule25) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *theora_image_transport.Packet) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule25 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic26 && len(masterConfig.Rule26) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.ConfigDescription) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule26 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic27 && len(masterConfig.Rule27) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.Config) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule27 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic28 && len(masterConfig.Rule28) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.PointCloud2) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule28 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic29 && len(masterConfig.Rule29) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.CameraInfo) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule29 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic30 && len(masterConfig.Rule30) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.Image) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule30 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic31 && len(masterConfig.Rule31) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.CompressedImage) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule31 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic32 && len(masterConfig.Rule32) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.ConfigDescription) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule32 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic33 && len(masterConfig.Rule33) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.Config) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule33 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic34 && len(masterConfig.Rule34) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.CompressedImage) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule34 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic35 && len(masterConfig.Rule35) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.ConfigDescription) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule35 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic36 && len(masterConfig.Rule36) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.Config) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule36 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic37 && len(masterConfig.Rule37) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *theora_image_transport.Packet) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule37 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic38 && len(masterConfig.Rule38) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.ConfigDescription) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule38 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic39 && len(masterConfig.Rule39) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.Config) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule39 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic40 && len(masterConfig.Rule40) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *geometry_msgs.PoseStamped) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule40 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic41 && len(masterConfig.Rule41) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *geometry_msgs.PoseStamped) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule41 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic42 && len(masterConfig.Rule42) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *nav_msgs.Path) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule42 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic43 && len(masterConfig.Rule43) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.Int8) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule43 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic44 && len(masterConfig.Rule44) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.Bool) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule44 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic45 && len(masterConfig.Rule45) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *nav_msgs.Path) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule45 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic46 && len(masterConfig.Rule46) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *geometry_msgs.PoseStamped) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule46 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic47 && len(masterConfig.Rule47) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *geometry_msgs.PoseStamped) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule47 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic48 && len(masterConfig.Rule48) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *geometry_msgs.PoseStamped) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule48 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic49 && len(masterConfig.Rule49) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule49 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic50 && len(masterConfig.Rule50) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *visualization_msgs.MarkerArray) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule50 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic51 && len(masterConfig.Rule51) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *geometry_msgs.PolygonStamped) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule51 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic52 && len(masterConfig.Rule52) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *nav_msgs.OccupancyGrid) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule52 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic53 && len(masterConfig.Rule53) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *nav_msgs.OccupancyGrid) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule53 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic54 && len(masterConfig.Rule54) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *nav_msgs.OccupancyGrid) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule54 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic55 && len(masterConfig.Rule55) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.Float32) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule55 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic56 && len(masterConfig.Rule56) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.Int32) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule56 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic57 && len(masterConfig.Rule57) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *nav_msgs.Path) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule57 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic58 && len(masterConfig.Rule58) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *clean_msg.ErrorInfo) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule58 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic59 && len(masterConfig.Rule59) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *nav_msgs.OccupancyGrid) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule59 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic60 && len(masterConfig.Rule60) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *nav_msgs.OccupancyGrid) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule60 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic61 && len(masterConfig.Rule61) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *nav_msgs.OccupancyGrid) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule61 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic62 && len(masterConfig.Rule62) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *nav_msgs.OccupancyGrid) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule62 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic63 && len(masterConfig.Rule63) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *nav_msgs.OccupancyGrid) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule63 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic64 && len(masterConfig.Rule64) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *nav_msgs.OccupancyGrid) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule64 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic65 && len(masterConfig.Rule65) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule65 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic66 && len(masterConfig.Rule66) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.Bool) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule66 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic67 && len(masterConfig.Rule67) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.Bool) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule67 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic68 && len(masterConfig.Rule68) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *geometry_msgs.PolygonStamped) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule68 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic69 && len(masterConfig.Rule69) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *geometry_msgs.PointStamped) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule69 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic70 && len(masterConfig.Rule70) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule70 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic71 && len(masterConfig.Rule71) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *geometry_msgs.Twist) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule71 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic72 && len(masterConfig.Rule72) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *geometry_msgs.Twist) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule72 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic73 && len(masterConfig.Rule73) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *nav_msgs.Path) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule73 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic74 && len(masterConfig.Rule74) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *common_msgs.CreateMapInfo) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule74 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic75 && len(masterConfig.Rule75) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *geometry_msgs.Twist) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule75 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic76 && len(masterConfig.Rule76) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *common_msgs.SensorStatus) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule76 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic77 && len(masterConfig.Rule77) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *geometry_msgs.PoseArray) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule77 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic78 && len(masterConfig.Rule78) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *nav_msgs.Path) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule78 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic79 && len(masterConfig.Rule79) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *common_msgs.IdentifierObjsInfo) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule79 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic80 && len(masterConfig.Rule80) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *common_msgs.McuDiagnostic) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule80 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic81 && len(masterConfig.Rule81) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *diagnostic_msgs.DiagnosticArray) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule81 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic82 && len(masterConfig.Rule82) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.Int8) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule82 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic83 && len(masterConfig.Rule83) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.Int16) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule83 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic84 && len(masterConfig.Rule84) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *geometry_msgs.Vector3Stamped) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule84 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic85 && len(masterConfig.Rule85) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.LaserScan) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule85 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic86 && len(masterConfig.Rule86) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.PointCloud2) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule86 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic87 && len(masterConfig.Rule87) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule87 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic88 && len(masterConfig.Rule88) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule88 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic89 && len(masterConfig.Rule89) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule89 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic90 && len(masterConfig.Rule90) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.Int32) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule90 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic91 && len(masterConfig.Rule91) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *common_msgs.TaskInfo) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule91 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic92 && len(masterConfig.Rule92) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *common_msgs.MapInfo) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule92 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic93 && len(masterConfig.Rule93) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *nav_msgs.Path) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule93 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic94 && len(masterConfig.Rule94) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *common_msgs.VideoStream) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule94 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic95 && len(masterConfig.Rule95) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.PointCloud2) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule95 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic96 && len(masterConfig.Rule96) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *nav_msgs.Path) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule96 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic97 && len(masterConfig.Rule97) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.PointCloud2) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule97 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic98 && len(masterConfig.Rule98) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.PointCloud2) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule98 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic99 && len(masterConfig.Rule99) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.PointCloud2) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule99 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic100 && len(masterConfig.Rule100) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *geometry_msgs.PointStamped) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule100 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic101 && len(masterConfig.Rule101) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *nav_msgs.Path) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule101 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic102 && len(masterConfig.Rule102) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *geometry_msgs.PoseStamped) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule102 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic103 && len(masterConfig.Rule103) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *geometry_msgs.PoseWithCovarianceStamped) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule103 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic104 && len(masterConfig.Rule104) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *geometry_msgs.Pose) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule104 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic105 && len(masterConfig.Rule105) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule105 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic106 && len(masterConfig.Rule106) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule106 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic107 && len(masterConfig.Rule107) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule107 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic108 && len(masterConfig.Rule108) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule108 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic109 && len(masterConfig.Rule109) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.Float64) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule109 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic110 && len(masterConfig.Rule110) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule110 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic111 && len(masterConfig.Rule111) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule111 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic112 && len(masterConfig.Rule112) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.Imu) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule112 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic113 && len(masterConfig.Rule113) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule113 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic114 && len(masterConfig.Rule114) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.Int8) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule114 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic115 && len(masterConfig.Rule115) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.Int16) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule115 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic116 && len(masterConfig.Rule116) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule116 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic117 && len(masterConfig.Rule117) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule117 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic118 && len(masterConfig.Rule118) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *geometry_msgs.PoseWithCovarianceStamped) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule118 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic119 && len(masterConfig.Rule119) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.JointState) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule119 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic120 && len(masterConfig.Rule120) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule120 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic121 && len(masterConfig.Rule121) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *cartographer_ros_msgs.LandmarkList) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule121 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic122 && len(masterConfig.Rule122) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *nav_msgs.Odometry) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule122 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic123 && len(masterConfig.Rule123) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.LaserScan) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule123 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic124 && len(masterConfig.Rule124) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule124 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic125 && len(masterConfig.Rule125) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *nav_msgs.Path) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule125 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic126 && len(masterConfig.Rule126) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule126 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic127 && len(masterConfig.Rule127) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule127 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic128 && len(masterConfig.Rule128) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule128 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic129 && len(masterConfig.Rule129) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule129 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic130 && len(masterConfig.Rule130) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *geometry_msgs.PoseWithCovarianceStamped) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule130 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic131 && len(masterConfig.Rule131) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule131 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic132 && len(masterConfig.Rule132) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule132 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic133 && len(masterConfig.Rule133) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *common_msgs.LocateInfo) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule133 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic134 && len(masterConfig.Rule134) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.Bool) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule134 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic135 && len(masterConfig.Rule135) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.Float64MultiArray) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule135 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic136 && len(masterConfig.Rule136) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule136 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic137 && len(masterConfig.Rule137) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule137 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic138 && len(masterConfig.Rule138) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *nav_msgs.OccupancyGrid) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule138 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic139 && len(masterConfig.Rule139) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule139 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic140 && len(masterConfig.Rule140) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *nav_msgs.Path) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule140 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic141 && len(masterConfig.Rule141) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule141 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic142 && len(masterConfig.Rule142) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule142 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic143 && len(masterConfig.Rule143) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *nav_msgs.MapMetaData) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule143 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic144 && len(masterConfig.Rule144) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *nav_msgs.Path) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule144 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic145 && len(masterConfig.Rule145) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *geometry_msgs.PoseStamped) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule145 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic146 && len(masterConfig.Rule146) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *nav_msgs.OccupancyGrid) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule146 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic147 && len(masterConfig.Rule147) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *nav_msgs.OccupancyGrid) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule147 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic148 && len(masterConfig.Rule148) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule148 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic149 && len(masterConfig.Rule149) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule149 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic150 && len(masterConfig.Rule150) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule150 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic151 && len(masterConfig.Rule151) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule151 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic152 && len(masterConfig.Rule152) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.Bool) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule152 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic153 && len(masterConfig.Rule153) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.CameraInfo) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule153 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic154 && len(masterConfig.Rule154) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.Image) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule154 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic155 && len(masterConfig.Rule155) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.CompressedImage) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule155 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic156 && len(masterConfig.Rule156) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.ConfigDescription) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule156 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic157 && len(masterConfig.Rule157) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.Config) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule157 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic158 && len(masterConfig.Rule158) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.CompressedImage) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule158 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic159 && len(masterConfig.Rule159) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.ConfigDescription) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule159 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic160 && len(masterConfig.Rule160) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.Config) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule160 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic161 && len(masterConfig.Rule161) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *theora_image_transport.Packet) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule161 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic162 && len(masterConfig.Rule162) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.ConfigDescription) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule162 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic163 && len(masterConfig.Rule163) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.Config) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule163 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic164 && len(masterConfig.Rule164) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.CameraInfo) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule164 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic165 && len(masterConfig.Rule165) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.Image) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule165 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic166 && len(masterConfig.Rule166) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.CompressedImage) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule166 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic167 && len(masterConfig.Rule167) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.ConfigDescription) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule167 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic168 && len(masterConfig.Rule168) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.Config) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule168 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic169 && len(masterConfig.Rule169) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.CompressedImage) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule169 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic170 && len(masterConfig.Rule170) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.ConfigDescription) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule170 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic171 && len(masterConfig.Rule171) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.Config) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule171 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic172 && len(masterConfig.Rule172) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *theora_image_transport.Packet) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule172 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic173 && len(masterConfig.Rule173) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.ConfigDescription) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule173 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic174 && len(masterConfig.Rule174) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.Config) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule174 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic175 && len(masterConfig.Rule175) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.PointCloud2) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule175 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic176 && len(masterConfig.Rule176) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.CameraInfo) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule176 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic177 && len(masterConfig.Rule177) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.Image) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule177 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic178 && len(masterConfig.Rule178) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.CompressedImage) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule178 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic179 && len(masterConfig.Rule179) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.ConfigDescription) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule179 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic180 && len(masterConfig.Rule180) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.Config) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule180 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic181 && len(masterConfig.Rule181) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.CompressedImage) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule181 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic182 && len(masterConfig.Rule182) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.ConfigDescription) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule182 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic183 && len(masterConfig.Rule183) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.Config) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule183 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic184 && len(masterConfig.Rule184) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *theora_image_transport.Packet) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule184 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic185 && len(masterConfig.Rule185) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.ConfigDescription) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule185 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic186 && len(masterConfig.Rule186) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.Config) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule186 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic187 && len(masterConfig.Rule187) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.CameraInfo) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule187 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic188 && len(masterConfig.Rule188) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.Image) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule188 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic189 && len(masterConfig.Rule189) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.CompressedImage) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule189 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic190 && len(masterConfig.Rule190) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.ConfigDescription) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule190 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic191 && len(masterConfig.Rule191) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.Config) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule191 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic192 && len(masterConfig.Rule192) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.CompressedImage) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule192 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic193 && len(masterConfig.Rule193) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.ConfigDescription) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule193 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic194 && len(masterConfig.Rule194) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.Config) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule194 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic195 && len(masterConfig.Rule195) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *theora_image_transport.Packet) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule195 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic196 && len(masterConfig.Rule196) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.ConfigDescription) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule196 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic197 && len(masterConfig.Rule197) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.Config) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule197 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic198 && len(masterConfig.Rule198) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.PointCloud2) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule198 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic199 && len(masterConfig.Rule199) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *geometry_msgs.PoseStamped) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule199 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic200 && len(masterConfig.Rule200) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *geometry_msgs.PoseStamped) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule200 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic201 && len(masterConfig.Rule201) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.UInt8) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule201 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic202 && len(masterConfig.Rule202) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *nav_msgs.Odometry) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule202 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic203 && len(masterConfig.Rule203) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule203 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic204 && len(masterConfig.Rule204) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule204 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic205 && len(masterConfig.Rule205) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *nav_msgs.Odometry) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule205 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic206 && len(masterConfig.Rule206) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.Imu) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule206 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic207 && len(masterConfig.Rule207) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.PointCloud2) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule207 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic208 && len(masterConfig.Rule208) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *geometry_msgs.PoseArray) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule208 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic209 && len(masterConfig.Rule209) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.PointCloud2) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule209 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic210 && len(masterConfig.Rule210) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.LaserScan) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule210 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic211 && len(masterConfig.Rule211) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *geometry_msgs.PoseWithCovarianceStamped) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule211 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic212 && len(masterConfig.Rule212) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *geometry_msgs.Vector3Stamped) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule212 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic213 && len(masterConfig.Rule213) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule213 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic214 && len(masterConfig.Rule214) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *common_msgs.FunctionAreas) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule214 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic215 && len(masterConfig.Rule215) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.Bool) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule215 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic216 && len(masterConfig.Rule216) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *nav_msgs.Path) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule216 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic217 && len(masterConfig.Rule217) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.Float64MultiArray) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule217 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic218 && len(masterConfig.Rule218) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule218 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic219 && len(masterConfig.Rule219) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule219 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic220 && len(masterConfig.Rule220) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule220 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic221 && len(masterConfig.Rule221) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *geometry_msgs.PoseStamped) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule221 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic222 && len(masterConfig.Rule222) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *geometry_msgs.PoseWithCovarianceStamped) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule222 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic223 && len(masterConfig.Rule223) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule223 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic224 && len(masterConfig.Rule224) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule224 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic225 && len(masterConfig.Rule225) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *localization_monitor.RobotStatus) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule225 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic226 && len(masterConfig.Rule226) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.Float64MultiArray) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule226 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic227 && len(masterConfig.Rule227) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule227 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic228 && len(masterConfig.Rule228) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *actionlib_msgs.GoalID) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule228 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic229 && len(masterConfig.Rule229) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *ipa_building_msgs.MapSegmentationActionFeedback) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule229 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic230 && len(masterConfig.Rule230) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *ipa_building_msgs.MapSegmentationActionGoal) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule230 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic231 && len(masterConfig.Rule231) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.ConfigDescription) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule231 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic232 && len(masterConfig.Rule232) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.Config) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule232 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic233 && len(masterConfig.Rule233) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *ipa_building_msgs.MapSegmentationActionResult) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule233 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic234 && len(masterConfig.Rule234) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *nav_msgs.OccupancyGrid) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule234 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic235 && len(masterConfig.Rule235) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *actionlib_msgs.GoalStatusArray) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule235 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic236 && len(masterConfig.Rule236) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *rosgraph_msgs.Log) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule236 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic237 && len(masterConfig.Rule237) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *rosgraph_msgs.Log) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule237 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic238 && len(masterConfig.Rule238) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *nav_msgs.Path) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule238 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic239 && len(masterConfig.Rule239) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *geometry_msgs.Vector3Stamped) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule239 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic240 && len(masterConfig.Rule240) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.LaserScan) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule240 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic241 && len(masterConfig.Rule241) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.LaserScan) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule241 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic242 && len(masterConfig.Rule242) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.LaserScan) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule242 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic243 && len(masterConfig.Rule243) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.LaserScan) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule243 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic244 && len(masterConfig.Rule244) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.LaserScan) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule244 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic245 && len(masterConfig.Rule245) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.PointCloud2) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule245 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic246 && len(masterConfig.Rule246) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.PointCloud2) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule246 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic247 && len(masterConfig.Rule247) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *visualization_msgs.MarkerArray) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule247 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic248 && len(masterConfig.Rule248) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *common_msgs.SensorTask) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule248 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic249 && len(masterConfig.Rule249) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule249 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic250 && len(masterConfig.Rule250) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *geometry_msgs.Vector3Stamped) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule250 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic251 && len(masterConfig.Rule251) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *common_msgs.SonarList) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule251 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic252 && len(masterConfig.Rule252) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *nav_msgs.Odometry) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule252 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic253 && len(masterConfig.Rule253) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.LaserScan) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule253 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic254 && len(masterConfig.Rule254) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.Bool) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule254 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic255 && len(masterConfig.Rule255) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.LaserScan) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule255 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic256 && len(masterConfig.Rule256) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule256 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic257 && len(masterConfig.Rule257) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.Bool) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule257 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic258 && len(masterConfig.Rule258) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.CameraInfo) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule258 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic259 && len(masterConfig.Rule259) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *common_msgs.SysInfo) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule259 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic260 && len(masterConfig.Rule260) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.Image) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule260 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic261 && len(masterConfig.Rule261) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.CompressedImage) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule261 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic262 && len(masterConfig.Rule262) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.ConfigDescription) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule262 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic263 && len(masterConfig.Rule263) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.Config) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule263 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic264 && len(masterConfig.Rule264) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.CompressedImage) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule264 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic265 && len(masterConfig.Rule265) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.ConfigDescription) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule265 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic266 && len(masterConfig.Rule266) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.Config) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule266 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic267 && len(masterConfig.Rule267) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *theora_image_transport.Packet) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule267 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic268 && len(masterConfig.Rule268) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.ConfigDescription) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule268 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic269 && len(masterConfig.Rule269) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *dynamic_reconfigure.Config) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule269 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic270 && len(masterConfig.Rule270) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.Bool) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule270 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic271 && len(masterConfig.Rule271) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *geometry_msgs.PoseStamped) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule271 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic272 && len(masterConfig.Rule272) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *geometry_msgs.Vector3Stamped) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule272 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic273 && len(masterConfig.Rule273) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *common_msgs.TaskFeedbackInfo) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule273 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic274 && len(masterConfig.Rule274) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *common_msgs.Points) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule274 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic275 && len(masterConfig.Rule275) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *tf2_msgs.TFMessage) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule275 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic276 && len(masterConfig.Rule276) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *std_msgs.String) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule276 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic277 && len(masterConfig.Rule277) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *tf2_msgs.TFMessage) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule277 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic278 && len(masterConfig.Rule278) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *nav_msgs.Path) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule278 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic279 && len(masterConfig.Rule279) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *common_msgs.UpLoadFileList) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule279 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic280 && len(masterConfig.Rule280) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.Range) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule280 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic281 && len(masterConfig.Rule281) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.LaserScan) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule281 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic282 && len(masterConfig.Rule282) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.LaserScan) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule282 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic283 && len(masterConfig.Rule283) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.LaserScan) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule283 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+			if topic == masterConfig.Topic284 && len(masterConfig.Rule284) > 0 {
+				subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+					Node:  commonConfig.RosNode,
+					Topic: topic,
+					Callback: func(data *sensor_msgs.LaserScan) {
+						subscribersTimeMutexes[i].Lock()
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
+							subscribersMutexes[i].Lock()
+							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
+							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
+							var faultLabel string
+							for _, f := range masterConfig.Rule284 {
+								faultLabel = f(data)
+								if faultLabel != "" {
+									if !canCollect() {
+										break
+									}
+									subscribersTimes[i] = time.Now()
+									c_log.GlobalLogger.Errorf("触发事件【xxx】,开始采集。", faultLabel)
+									saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+									break
+								}
+							}
+							subscribersMutexes[i].Unlock()
+						}
+						subscribersTimeMutexes[i].Unlock()
+					},
+				})
+				if err == nil {
+					create = true
+				}
+			}
+
+			if err != nil {
+				c_log.GlobalLogger.Infof("创建订阅者报错,可能由于节点未启动,再次尝试【%v】", err)
+				time.Sleep(time.Duration(2) * time.Second)
+				continue
+			} else {
+				if create {
+					c_log.GlobalLogger.Infof("创建订阅者订阅话题【%v】", topic)
+				}
+				break
+			}
+		}
+	}
+	c_log.GlobalLogger.Infof("全部订阅者创建完成。")
+	select {
+	case signal := <-commonService.ChannelKillSubscriber:
+		if signal == 1 {
+			commonConfig.RosNode.Close()
+			commonService.AddKillTimes("3")
+			return
+		}
+	}
+}
+
+func saveTimeWindow(faultLabel string, faultHappenTime string, lastTimeWindow *entity.TimeWindow) {
+	masterTopics, slaveTopics := getTopicsOfNode(faultLabel)
+	if lastTimeWindow == nil || commonUtil.TimeCustom1GreaterTimeCustom2(faultHappenTime, lastTimeWindow.TimeWindowEnd) {
+		// 2-1 如果是不在旧故障窗口内,添加一个新窗口
+		newTimeWindow := entity.TimeWindow{
+			FaultTime:       faultHappenTime,
+			TimeWindowBegin: commonUtil.TimeCustomChange(faultHappenTime, -commonConfig.PlatformConfig.TaskBeforeTime),
+			TimeWindowEnd:   commonUtil.TimeCustomChange(faultHappenTime, commonConfig.PlatformConfig.TaskAfterTime),
+			Length:          commonConfig.PlatformConfig.TaskBeforeTime + commonConfig.PlatformConfig.TaskAfterTime + 1,
+			Labels:          []string{faultLabel},
+			MasterTopics:    masterTopics,
+			SlaveTopics:     slaveTopics,
+		}
+		c_log.GlobalLogger.Infof("不在旧故障窗口内,向生产者队列添加一个新窗口,【Lable】=%v,【FaultTime】=%v,【Length】=%v", newTimeWindow.Labels, newTimeWindow.FaultTime, newTimeWindow.Length)
+		entity.AddTimeWindowToTimeWindowProducerQueue(newTimeWindow)
+	} else {
+		// 2-2 如果在旧故障窗口内
+		entity.TimeWindowProducerQueueMutex.RLock()
+		defer entity.TimeWindowProducerQueueMutex.RUnlock()
+		// 2-2-1 更新故障窗口end时间
+		maxEnd := commonUtil.TimeCustomChange(lastTimeWindow.TimeWindowBegin, commonConfig.PlatformConfig.TaskMaxTime)
+		expectEnd := commonUtil.TimeCustomChange(faultHappenTime, commonConfig.PlatformConfig.TaskAfterTime)
+		if commonUtil.TimeCustom1GreaterTimeCustom2(expectEnd, maxEnd) {
+			lastTimeWindow.TimeWindowEnd = maxEnd
+			lastTimeWindow.Length = commonConfig.PlatformConfig.TaskMaxTime
+		} else {
+			if commonUtil.TimeCustom1GreaterTimeCustom2(expectEnd, lastTimeWindow.TimeWindowEnd) {
+				lastTimeWindow.TimeWindowEnd = expectEnd
+				lastTimeWindow.Length = commonUtil.CalculateDifferenceOfTimeCustom(lastTimeWindow.TimeWindowBegin, expectEnd)
+			}
+		}
+		// 2-2-2 更新label
+		labels := lastTimeWindow.Labels
+		lastTimeWindow.Labels = commonUtil.AppendIfNotExists(labels, faultLabel)
+		// 2-2-3 更新 topic
+		sourceMasterTopics := lastTimeWindow.MasterTopics
+		lastTimeWindow.MasterTopics = commonUtil.MergeSlice(sourceMasterTopics, masterTopics)
+		sourceSlaveTopics := lastTimeWindow.SlaveTopics
+		lastTimeWindow.SlaveTopics = commonUtil.MergeSlice(sourceSlaveTopics, slaveTopics)
+		c_log.GlobalLogger.Infof("在旧故障窗口内,更新生产者队列最新的窗口,【Lable】=%v,【FaultTime】=%v,【Length】=%v", lastTimeWindow.Labels, lastTimeWindow.FaultTime, lastTimeWindow.Length)
+	}
+}
+
+func getTopicsOfNode(faultLabel string) (masterTopics []string, slaveTopics []string) {
+	// 获取所有需要采集的topic
+	var faultCodeTopics []string
+	for _, code := range commonConfig.CloudConfig.Triggers {
+		if code.Label == faultLabel {
+			faultCodeTopics = code.Topics
+		}
+	}
+	return faultCodeTopics, nil
+}
+
+// 判断是否可采集数据
+func canCollect() bool {
+	// 如果开启了采集频率限制,则云端判断采集数量是否超过限额
+	if commonConfig.CloudConfig.CollectLimit.Flag == 1 {
+		c_log.GlobalLogger.Error("当前设备已开启数采频率限制,需判断采集数量是否达到限额。")
+		responseString, err := commonUtil.HttpPostJsonWithHeaders(
+			commonConfig.CloudConfig.CollectLimit.Url,
+			map[string]string{"Authorization": "U9yKpD6kZZDDe4LFKK6myAxBUT1XRrDM"},
+			map[string]string{
+				"snCode":            commonConfig.LocalConfig.SecretKey,
+				"collectLimitDay":   util.ToString(commonConfig.CloudConfig.CollectLimit.Day),
+				"collectLimitWeek":  util.ToString(commonConfig.CloudConfig.CollectLimit.Week),
+				"collectLimitMonth": util.ToString(commonConfig.CloudConfig.CollectLimit.Month),
+				"collectLimitYear":  util.ToString(commonConfig.CloudConfig.CollectLimit.Year),
+			},
+		)
+		if err != nil {
+			c_log.GlobalLogger.Error("发送http请求获取是否允许采集失败:", err)
+			return false
+		}
+		// 解析JSON字符串到Response结构体
+		var resp entity.Response
+		err = json.Unmarshal([]byte(responseString), &resp)
+		if err != nil {
+			c_log.GlobalLogger.Error("解析是否允许采集接口返回结果失败:", err)
+			return false
+		}
+		if resp.Code != 200 { // 不是200 代表不允许采集
+			c_log.GlobalLogger.Info("采集数量已超过限额,当前周期内不再采集。", resp.Code)
+			return false
+		}
+	} else {
+		c_log.GlobalLogger.Error("当前设备未开启数采频率限制,无需判断采集数量是否达到限额。")
+	}
+
+	// 本地判断是否存在正在处理的数据
+	if entity.ProcessingFlag {
+		c_log.GlobalLogger.Info("存在正在处理的数据,此次不再采集。")
+		return false
+	}
+
+	c_log.GlobalLogger.Info("允许采集。")
+	return true
+}

+ 3 - 0
aarch64/pjibot_clean/start-control.sh

@@ -0,0 +1,3 @@
+#!/bin/bash
+chmod 777 /root/cicv-data-closedloop/pji-control.exe
+nohup /root/cicv-data-closedloop/pji-control.exe > /root/cicv-data-closedloop/log/pji-control.out 2>&1 &

+ 3 - 0
aarch64/pjibot_clean/start-master.sh

@@ -0,0 +1,3 @@
+#!/bin/bash
+chmod 777 /root/cicv-data-closedloop/pji-master.exe
+nohup /root/cicv-data-closedloop/pji-master.exe > /root/cicv-data-closedloop/log/pji-master.out 2>&1 &

+ 189 - 0
aarch64/pjibot_clean/清洁机器人默认配置文件-cloud-config.yaml

@@ -0,0 +1,189 @@
+---
+collect-limit:
+  url: http://36.110.106.142:12341/web_server/collect_limit/can_collect
+  flag: 1 # 数采频率限制标志 0 - 关闭数采频率限制  1 - 开启数采频率限制
+  day: 10
+  week: 70
+  month: 120
+  year: 144
+collect-num-plus:
+  url: http://36.110.106.142:12341/web_server/collect_limit/plus_collect_num
+monitor:
+  url: http://36.110.106.142:12341/web_server/monitor/insert
+platform:
+  url-device-auth: http://36.110.106.156:11121/device/auth
+  url-task-poll: http://36.110.106.156:11121/device/task/poll
+  url-task: http://36.110.106.156:11121/device/task
+bag-number: 60
+config-refresh-interval: 60
+disk: # 存储用的挂载点限制阈值,防止磁盘爆满
+  name: /dev/mmcblk0p8 # 磁盘名称
+  used: 20000000000 # 磁盘占用阈值,单位bytes
+  path: # 扫描的目录
+    - /root/cicv-data-closedloop
+    - /root/pjirobot/data/cicv-data-closedloop
+data-dir:
+  src: /root/pjirobot/ # 需要额外采集的 data 目录
+  src-sub:
+    - data/config
+    - data/map
+    - data/mapBuf
+  dest: /root/pjirobot/data.zip
+map-buf-files:
+  - /root/pjirobot/data/mapBuf/forbid_area.json
+  - /root/pjirobot/data/mapBuf/forbid_area.yaml
+  - /root/pjirobot/data/mapBuf/forbid_area_init.json
+  - /root/pjirobot/data/mapBuf/forbid_area_init.yaml
+  - /root/pjirobot/data/mapBuf/function_area.json
+  - /root/pjirobot/data/mapBuf/function_area_init.json
+  - /root/pjirobot/data/mapBuf/function_links.json
+  - /root/pjirobot/data/mapBuf/map.json
+  - /root/pjirobot/data/mapBuf/map.pbstream
+  - /root/pjirobot/data/mapBuf/map.pgm
+  - /root/pjirobot/data/mapBuf/map.yaml
+  - /root/pjirobot/data/mapBuf/map_type.json
+  - /root/pjirobot/data/mapBuf/param.yaml
+  - /root/pjirobot/data/mapBuf/segment_map.png
+  - /root/pjirobot/data/mapBuf/segment_map_original.png
+  - /root/pjirobot/data/mapBuf/stations.json
+  - /root/pjirobot/data/mapBuf/stations_init.json
+  - /root/pjirobot/data/mapBuf/version.json
+map-bag-path: /root/cicv-data-closedloop/map.bag
+bag-data-dir: /root/pjirobot/data/cicv-data-closedloop/data/
+bag-copy-dir: /root/pjirobot/data/cicv-data-closedloop/copy/
+triggers-dir: /root/pjirobot/data/cicv-data-closedloop/triggers/
+time-window-send-gap: 6
+rpc-port: 12341
+ros:
+  master-address: 192.168.1.104:11311
+  nodes:
+    - /amcl
+    - /ob_camera_01/camera
+    - /ob_camera_02/camera
+    - /node_diagnostics
+    - /localization_monitor_node
+    - /move_base
+    - /sensor_fusion_node
+    - /ltme_node
+    - /scan_map_icp_amcl_node
+    - /monitor
+
+hosts:
+  - name: node1
+    ip: 192.168.1.104
+    rosbag:
+      path: "/opt/ros/melodic/bin/rosbag"
+      envs:
+        - "C_INCLUDE_PATH=/usr/include/libdrm:"
+        - "USER=root"
+        - "ROS_PACKAGE_PATH=/opt/ros/noetic/share"
+        - "LD_LIBRARY_PATH=/opt/ros/noetic/lib"
+        - "ROS_ETC_DIR=/opt/ros/noetic/etc/ros"
+        - "SHLVL=0"
+        - "HOME=/root"
+        - "ROS_PYTHON_VERSION=3"
+        - "PCMANFM_OUTLINE_MODE=on"
+        - "CPLUS_INCLUDE_PATH=/usr/include/libdrm:"
+        - "ROS_DISTRO=noetic"
+        - "ROS_VERSION=1"
+        - "PKG_CONFIG_PATH=/opt/ros/noetic/lib/pkgconfig:/usr/local/lib/pkgconfig:"
+        - "PATH=/opt/ros/noetic/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/go/bin:/root/go/bin"
+        - "ROS_ROOT=/opt/ros/noetic/share/ros"
+        - "ROSLISP_PACKAGE_DIRECTORIES="
+        - "ROS_MASTER_URI=http://localhost:11311"
+        - "PYTHONPATH=/opt/ros/noetic/lib/python3/dist-packages"
+        - "ROS_HOSTNAME=192.168.1.104"
+        - "CMAKE_PREFIX_PATH=/opt/ros/noetic"
+    topics:
+      - /amcl_pose # /amcl
+      - /diagnostics # /amcl /node_diagnostics
+      - /locate_info # /localization_monitor_node
+      - /obstacle_detection # /move_base
+      - /odom # /sensor_fusion_node
+      - /move_base/global_costmap/costmap # /move_base
+      - /move_base/global_costmap/costmap_updates # /move_base
+      - /move_base/local_costmap/costmap # /move_base
+      - /move_base/local_costmap/costmap_updates # /move_base
+      - /scan # /ltme_node
+      - /scan_map_icp_amcl_node/scan_point_transformed # /scan_map_icp_amcl_node
+      - /sys_info
+      - /imu
+      # 算法评价新增
+      - /map
+      - /sonar
+      - /tf
+      - /tf_static
+      - /cmd_vel
+      - /move_base/DWAPlannerROS/global_plan
+      - /move_base/DWAPlannerROS/local_plan
+      - /move_base/GlobalPlanner/plan
+      - /move_base/global_costmap/footprint
+      - /move_base/local_costmap/footprint
+      - /robot_pose_tf
+
+
+full-collect: true # 控制是否根据不同的触发器采集不通的topic,一般设置为true,即忽略下面的配置
+triggers:
+  - label: detectfault
+    topics:
+      - /diagnostics
+      - /locate_info
+      - /obstacle_detection
+      - /odom
+      - /move_base/global_costmap/costmap
+      - /move_base/global_costmap/costmap_updates
+      - /scan_map_icp_amcl_node/scan_point_transformed
+  - label: unstabledriving
+    topics:
+      - /diagnostics
+      - /locate_info
+      - /obstacle_detection
+      - /odom
+      - /move_base/global_costmap/costmap
+      - /move_base/global_costmap/costmap_updates
+      - /scan_map_icp_amcl_node/scan_point_transformed
+  - label: locationfailed
+    topics:
+      - /diagnostics
+      - /locate_info
+      - /obstacle_detection
+      - /odom
+      - /move_base/global_costmap/costmap
+      - /move_base/global_costmap/costmap_updates
+      - /scan_map_icp_amcl_node/scan_point_transformed
+  - label: obstacledetection
+    topics:
+      - /diagnostics
+      - /locate_info
+      - /obstacle_detection
+      - /odom
+      - /move_base/global_costmap/costmap
+      - /move_base/global_costmap/costmap_updates
+      - /scan_map_icp_amcl_node/scan_point_transformed
+  - label: overspeed
+    topics:
+      - /diagnostics
+      - /locate_info
+      - /obstacle_detection
+      - /odom
+      - /move_base/global_costmap/costmap
+      - /move_base/global_costmap/costmap_updates
+      - /scan_map_icp_amcl_node/scan_point_transformed
+  - label: cpuoveroccupied
+    topics:
+      - /diagnostics
+      - /locate_info
+      - /obstacle_detection
+      - /odom
+      - /move_base/global_costmap/costmap
+      - /move_base/global_costmap/costmap_updates
+      - /scan_map_icp_amcl_node/scan_point_transformed
+  - label: memoveroccupied
+    topics:
+      - /diagnostics
+      - /locate_info
+      - /obstacle_detection
+      - /odom
+      - /move_base/global_costmap/costmap
+      - /move_base/global_costmap/costmap_updates
+      - /scan_map_icp_amcl_node/scan_point_transformed

+ 20 - 0
aarch64/pjibot_clean/清洁机器人默认配置文件-local-config.yaml

@@ -0,0 +1,20 @@
+type: 1 # 机器人类型 1 引导机器人 2 配送机器人 3 巡检机器人 4 清洁机器人
+node:
+  name: node1
+  ip: 192.168.1.104
+rosparam-path: /opt/ros/melodic/bin/rosparam
+# 获取oss连接信息的接口url
+url-get-oss-config: http://36.110.106.156:18379/oss/pji?token=nXonLUcMtGcrQqqKiyygIwyVbvizE0wD
+# 朴津机器人数据前缀
+oss-base-prefix: pji-double-camera/
+# oss上的配置文件的名称
+cloud-config-filename: cloud-config.yaml
+# 将oss上的配置文件下载到本地的路径
+cloud-config-local-path: /root/cicv-data-closedloop/config/cloud-config.yaml
+# websocket端口号
+local-websocket-port: 9002
+restart-cmd:
+  dir: "/root/cicv-data-closedloop/"
+  name: "sh"
+  args:
+    - "start-master.sh"

+ 2 - 1
aarch64/pjibot_delivery/master/package/config/trigger_var.go

@@ -2,12 +2,13 @@ package config
 
 import (
 	"cicv-data-closedloop/pjibot_delivery_msgs"
+	"sync"
+
 	"github.com/bluenviron/goroslib/v2/pkg/msgs/diagnostic_msgs"
 	"github.com/bluenviron/goroslib/v2/pkg/msgs/geometry_msgs"
 	"github.com/bluenviron/goroslib/v2/pkg/msgs/nav_msgs"
 	"github.com/bluenviron/goroslib/v2/pkg/msgs/sensor_msgs"
 	"github.com/bluenviron/goroslib/v2/pkg/msgs/std_msgs"
-	"sync"
 )
 
 var (

+ 2 - 2
aarch64/pjibot_guide/common/config/c_cloud.go

@@ -266,9 +266,9 @@ func getSnCode() (string, error) {
 	command = append(command, "sn")
 	_, snOutput, err := util.ExecuteSync(LocalConfig.RosparamPath, command...)
 	if err != nil {
-		return "", errors.New("执行获取sn码命令" + util.ToString(command) + "出错:" + util.ToString(err))
+		return "", errors.New("执行获取sn码命令" + LocalConfig.RosparamPath + util.ToString(command) + "出错:" + util.ToString(err))
 	}
-	c_log.GlobalLogger.Info("执行获取sn码命令", command, "成功,结果为:", snOutput)
+	c_log.GlobalLogger.Info("执行获取sn码命令", LocalConfig.RosparamPath, command, "成功,结果为:", snOutput)
 	snCode := strings.Replace(strings.Replace(snOutput, " ", "", -1), "\n", "", -1)
 	return snCode, nil
 }

+ 5 - 5
aarch64/pjibot_guide/引导机器人默认配置文件-cloud-config.yaml

@@ -2,9 +2,9 @@
 collect-limit:
   url: http://36.110.106.142:12341/web_server/collect_limit/can_collect
   flag: 1 # 数采频率限制标志 0 - 关闭数采频率限制  1 - 开启数采频率限制
-  day: 1
-  week: 3
-  month: 12
+  day: 10
+  week: 70
+  month: 120
   year: 144
 collect-num-plus:
   url: http://36.110.106.142:12341/web_server/collect_limit/plus_collect_num
@@ -16,10 +16,10 @@ platform:
   url-task: http://36.110.106.156:11121/device/task
 bag-number: 60
 config-refresh-interval: 60
-disk:
+disk: # 存储用的挂载点限制阈值,防止磁盘爆满
   name: /dev/mmcblk0p8 # 磁盘名称
   used: 20000000000 # 磁盘占用阈值,单位bytes
-  path:
+  path: # 扫描的目录
     - /root/cicv-data-closedloop
     - /root/pjirobot/data/cicv-data-closedloop
 data-dir:

+ 1 - 1
aarch64/pjibot_guide/引导机器人默认配置文件-local-config.yaml

@@ -1,4 +1,4 @@
-type: 1 # 机器人类型 1 引导机器人 2 配送机器人 3 巡检机器人
+type: 1 # 机器人类型 1 引导机器人 2 配送机器人 3 巡检机器人 4 清洁机器人
 node:
   name: node1
   ip: 192.168.1.104

+ 7 - 0
deploy/build-pji_clean.sh

@@ -0,0 +1,7 @@
+#!/bin/bash
+
+
+mkdir -p ./deploy/exe/pjibot_clean/
+# 引导机器人
+go build -o ./deploy/exe/pjibot_clean/pji-control.exe ./aarch64/pjibot_clean/control/main.go
+go build -o ./deploy/exe/pjibot_clean/pji-master.exe ./aarch64/pjibot_clean/master/main.go

+ 8 - 0
deploy/build-pji_delivery.sh

@@ -0,0 +1,8 @@
+#!/bin/bash
+
+
+mkdir -p ./deploy/exe/pjibot_delivery/
+
+# 配送机器人
+go build -o ./deploy/exe/pjibot_delivery/pji-control.exe ./aarch64/pjibot_delivery/control/main.go
+go build -o ./deploy/exe/pjibot_delivery/pji-master.exe ./aarch64/pjibot_delivery/master/main.go

+ 7 - 0
deploy/build-pji_guide.sh

@@ -0,0 +1,7 @@
+#!/bin/bash
+
+
+mkdir -p ./deploy/exe/pjibot_guide/
+# 引导机器人
+go build -o ./deploy/exe/pjibot_guide/pji-control.exe ./aarch64/pjibot_guide/control/main.go
+go build -o ./deploy/exe/pjibot_guide/pji-master.exe ./aarch64/pjibot_guide/master/main.go

+ 8 - 0
deploy/build-pji_patrol.sh

@@ -0,0 +1,8 @@
+#!/bin/bash
+
+
+mkdir -p ./deploy/exe/pjibot_patrol/
+
+# 巡检机器人
+go build -o ./deploy/exe/pjibot_patrol/pji-control.exe ./aarch64/pjibot_patrol/control/main.go
+go build -o ./deploy/exe/pjibot_patrol/pji-master.exe ./aarch64/pjibot_patrol/master/main.go

+ 4 - 0
deploy/build-rosbag_command.sh

@@ -0,0 +1,4 @@
+#!/bin/bash
+
+# 在cicv-data-closedloop根目录执行命令
+go build -o ./deploy/exe/rosbag_command.exe ./tools/rosbag_command/main/main.go

+ 0 - 69
kinglong_msgs/common_msgs.go

@@ -1,69 +0,0 @@
-package kinglong_msgs
-
-import (
-	"github.com/bluenviron/goroslib/v2/pkg/msg"
-	"github.com/bluenviron/goroslib/v2/pkg/msgs/std_msgs"
-)
-
-type FaultInfo struct {
-	msg.Package  `ros:"common_msgs"`
-	TimestampSec float64
-	ModuleName   string
-	Version      string
-	ErrorCode    int32
-	Msg          string
-	FaultLevel   int8
-	FaultType    int8
-}
-
-type Header struct {
-	msg.Package    `ros:"common_msgs"`
-	SequenceNum    int32
-	TimeStamp      float64
-	ModuleName     string
-	Version        string
-	FaultVec       FaultVec
-	TimeStatistics TimeStatistics
-}
-
-type FaultVec struct {
-	msg.Package      `ros:"common_msgs"`
-	InfoVec          []FaultInfo
-	ModuleFaultLevel int32
-}
-
-type TimeStatistics struct {
-	msg.Package      `ros:"common_msgs"`
-	DevTimeStatusMsg []TimeStatus
-	SendingTimestamp float64
-}
-
-type TimeStatus struct {
-	msg.Package         `ros:"common_msgs"`
-	Dtime               float64
-	SourceNodeName      string
-	DestinationNodeName string
-}
-
-type Retrieval struct {
-	msg.Package            `ros:"common_msgs"`
-	Header                 std_msgs.Header `rosname:"header"`
-	AsVehAccelerationValue float64         `rosname:"AS_Veh_Acceleration_Value"` // 惯导采集到的加速度
-	AsDriverTakeoverReq    int16           `rosname:"AS_Driver_TakeOver_Req"`    // 驾驶员接管提醒(2B9)
-	VcuAccelPosValue       float64         `rosname:"VCU_Accel_Pos_Value"`       // 实际加速踏板位置
-	VcuBrkPelPosValue      float64         `rosname:"VCU_BrkPel_Pos_Value"`      // 实际制动踏板位置
-	VcuRealSpeed           float64         `rosname:"VCU_Real_Speed"`            // 当前车速
-	VcuCurrentGear         int16           `rosname:"VCU_Current_Gear"`          // 当前档位
-	VcuParkingSt           int16           `rosname:"VCU_Parking_St"`            // 当前P档位
-	AutoDLimitInReason     int16           `rosname:"AutoD_Limitin_Reason"`      // 限制进入自动驾驶原因
-	EmergencyStopReason    int16           `rosname:"Emergency_Stop_Reason"`     // 紧急停车激活原因
-	VcuDriverTakeoverReq   int16           `rosname:"VCU_Driver_TakeOver_Req"`   // 驾驶员接管提醒(2BA)
-	VcuVehicleDriveModeSt  int16           `rosname:"VCU_Vehicle_Drive_Mode_St"` // 车辆驾驶模式
-	AutoDOutReason         int16           `rosname:"AutoD_Out_Reason"`          // 退出自动驾驶原因
-	BrakeSysFaultSt        int16           `rosname:"Brak_Sys_Fault_St"`         // 制动系统故障
-	StrgAngleRealValue     float64         `rosname:"Strg_Angle_Real_Value"`     // 方向盘实际转角
-	StrgAngleSpdValue      float64         `rosname:"Strg_Angle_Spd_Value"`      // 方向盘当前实际速度反馈
-	StrgWorkmodeSt         int16           `rosname:"Strg_WorkMode_St"`          // 当前系统实际工作模式
-	BCHornSt               int16           `rosname:"BC_Horn_St"`                // 喇叭状态
-
-}

+ 0 - 54
kinglong_msgs/control_msgs.go

@@ -1,54 +0,0 @@
-package kinglong_msgs
-
-import (
-	"github.com/bluenviron/goroslib/v2/pkg/msg"
-	"github.com/bluenviron/goroslib/v2/pkg/msgs/std_msgs"
-)
-
-type JinlongControlCommand struct {
-	msg.Package                   `ros:"autoware_msgs"`
-	Header                        std_msgs.Header
-	ASStrgAngleReq                float64 `rosname:"AS_Strg_Angle_Req"`
-	ASStrgWorkModeReq             int16   `rosname:"AS_Strg_WorkMode_Req"`
-	ASStrg0Enable                 int16   `rosname:"AS_Strg0_Enable"`
-	ASSteeringTorqueSuperposition float64 `rosname:"AS_Steering_torque_superposition"`
-	ASStrgSpdReq                  float64 `rosname:"AS_Strg_Spd_Req"`
-	ASStrg1Enable                 int16   `rosname:"AS_Strg1_Enable"`
-	ASStrgLifeSignal              int16   `rosname:"AS_Strg_Life_Signal"`
-	ASAutoDReq                    int16   `rosname:"AS_AutoD_Req"`
-	ASLongitCtrlmode              int16   `rosname:"AS_Longit_Ctrlmode"`
-	ASAutoDEmergBrkRelease        int16   `rosname:"AS_AutoD_EmergBrk_Release"`
-	ASAutoDCollisionRelease       int16   `rosname:"AS_AutoD_Collision_Release"`
-	ASAutoDAccelPosReq            float64 `rosname:"AS_AutoD_Accel_Pos_Req"`
-	ASAutoDShiftReq               int16   `rosname:"AS_AutoD_Shift_Req"`
-	ASAutoDPShiftReq              int16   `rosname:"AS_AutoD_P_Shift_Req"`
-	ASAutoDBrkModeReq             int16   `rosname:"AS_AutoD_BrkMode_Req"`
-	ASAutoDBrkPelPosReq           float64 `rosname:"AS_AutoD_BrkPelPos_Req"`
-	ASAutoDSpdLimit               float64 `rosname:"AS_AutoD_Spd_Limit"`
-	ASAutoAccelerationReq         float64 `rosname:"AS_Auto_Acceleration_Req"`
-	ASAutoDLifeSignal             int16   `rosname:"AS_AutoD_Life_Signal"`
-	ASAutoDSpdReq                 float64 `rosname:"AS_AutoD_Spd_Req"`
-	ASSpdLifeSignal               int16   `rosname:"AS_Spd_Life_Signal"`
-	ASAlarmLampReq                int16   `rosname:"AS_AlarmLamp_Req"`
-	ASFrontDoorCtrlReq            int16   `rosname:"AS_Front_Door_Ctrl_Req"`
-	ASLowBeamStartReq             int16   `rosname:"AS_LowBeam_Start_Req"`
-	ASTurnLeftLightStartReq       int16   `rosname:"AS_TurnLeftLight_Start_Req"`
-	ASTurnRightLightStartReq      int16   `rosname:"AS_TurnRightLight_Start_Req"`
-	ASMiniLightStartReq           int16   `rosname:"AS_MiniLight_Start_Req"`
-	ASHornStartReq                int16   `rosname:"AS_Horn_Start_Req"`
-	ASTreadleOperatingReq         int16   `rosname:"AS_Treadle_Operating_Req"`
-	ASFDoorButtonLockReq          int16   `rosname:"AS_FDoorButtonLock_Req"`
-	ASMidDoorCtrlReq              int16   `rosname:"AS_Mid_Door_Ctrl_Req"`
-	ASMDoorButtonLockReq          int16   `rosname:"AS_MDoorButtonLock_Req"`
-	ASRearDoorCtrlReq             int16   `rosname:"AS_Rear_Door_Ctrl_Req"`
-	ASRDoorButtonLockReq          int16   `rosname:"AS_RDoorButtonLock_Req"`
-	ASFrontFogReq                 int16   `rosname:"AS_FrontFog_Req"`
-	ASRearFogReq                  int16   `rosname:"AS_RearFog_Req"`
-	ASWarninglightReq             int16   `rosname:"AS_Warninglight_Req"`
-	ASHighBeamStartReq            int16   `rosname:"AS_HighBeam_Start_Req"`
-	TargetX                       float64
-	TargetY                       float64
-	LateralError                  float64
-	Velocity                      float64
-	AutoMode                      int16
-}

+ 0 - 104
kinglong_msgs/perception_msgs.go

@@ -1,104 +0,0 @@
-package kinglong_msgs
-
-import (
-	"github.com/bluenviron/goroslib/v2/pkg/msg"
-	"github.com/bluenviron/goroslib/v2/pkg/msgs/std_msgs"
-)
-
-// PerceptionObjects v2304
-type PerceptionObjects struct {
-	msg.Package `ros:"perception_msgs"`
-	Header      Header
-	Objs        []Object
-	Cells       []ObstacleCell
-}
-
-type Object struct {
-	msg.Package    `ros:"perception_msgs"`
-	Id             uint32
-	X              float32
-	Y              float32
-	Z              float32
-	Vxrel          float32
-	Vyrel          float32
-	Xabs           float64
-	Yabs           float64
-	Vxabs          float32
-	Vyabs          float32
-	Width          float32
-	Length         float32
-	Height         float32
-	Speed          float32
-	Heading        float32
-	Type           uint8
-	Source         uint8
-	Confidence     float32
-	Age            uint32
-	Velocitystatus uint8
-	Cells          []ObstacleCell
-}
-
-type ObstacleCell struct {
-	msg.Package `ros:"perception_msgs"`
-	Idc         int32
-	X           float64
-	Y           float64
-	Xg          float64
-	Yg          float64
-}
-
-type PerceptionLocalization struct {
-	msg.Package `ros:"perception_msgs"`
-
-	Header      std_msgs.Header
-	FrameUnmber uint64
-	FusionLevel int8
-	Status      int8
-	Roll        float64
-	Pitch       float64
-	Yaw         float64
-	RollStd     float32
-	PitchStd    float32
-	YawStd      float32
-
-	Qw float64
-	Qx float64
-	Qy float64
-	Qz float64
-
-	AngularVelocityX float64
-	AngularVelocityY float64
-	AngularVelocityZ float64
-
-	Latitude     float64
-	Longitude    float64
-	Altitude     float64
-	LatitudeStd  float32
-	LongitudeStd float32
-	AltitudeStd  float32
-
-	PositionX    float64
-	PositionY    float64
-	PositionZ    float64
-	PositionXStd float32
-	PositionYStd float32
-	PositionZStd float32
-
-	VelocityX    float64
-	VelocityY    float64
-	VelocityZ    float64
-	VelocityXStd float32
-	VelocityYStd float32
-	VelocityZStd float32
-
-	VelocityRx    float64
-	VelocityRy    float64
-	VelocityRz    float64
-	VelocityRxStd float32
-	VelocityRyStd float32
-	VelocityRzStd float32
-
-	AccelX float64
-	AccelY float64
-	AccelZ float64
-}

+ 10 - 0
pjibot_clean_msgs/actionlib_msgs_msg/GoalID.msg

@@ -0,0 +1,10 @@
+# The stamp should store the time at which this goal was requested.
+# It is used by an action server when it tries to preempt all
+# goals that were requested before a certain time
+time stamp
+
+# The id provides a way to associate feedback and
+# result message with specific goal requests. The id
+# specified must be unique.
+string id
+

+ 23 - 0
pjibot_clean_msgs/actionlib_msgs_msg/GoalStatus.msg

@@ -0,0 +1,23 @@
+GoalID goal_id
+uint8 status
+uint8 PENDING         = 0   # The goal has yet to be processed by the action server
+uint8 ACTIVE          = 1   # The goal is currently being processed by the action server
+uint8 PREEMPTED       = 2   # The goal received a cancel request after it started executing
+                            #   and has since completed its execution (Terminal State)
+uint8 SUCCEEDED       = 3   # The goal was achieved successfully by the action server (Terminal State)
+uint8 ABORTED         = 4   # The goal was aborted during execution by the action server due
+                            #    to some failure (Terminal State)
+uint8 REJECTED        = 5   # The goal was rejected by the action server without being processed,
+                            #    because the goal was unattainable or invalid (Terminal State)
+uint8 PREEMPTING      = 6   # The goal received a cancel request after it started executing
+                            #    and has not yet completed execution
+uint8 RECALLING       = 7   # The goal received a cancel request before it started executing,
+                            #    but the action server has not yet confirmed that the goal is canceled
+uint8 RECALLED        = 8   # The goal received a cancel request before it started executing
+                            #    and was successfully cancelled (Terminal State)
+uint8 LOST            = 9   # An action client can determine that a goal is LOST. This should not be
+                            #    sent over the wire by an action server
+
+#Allow for the user to associate a string with GoalStatus for debugging
+string text
+

+ 5 - 0
pjibot_clean_msgs/actionlib_msgs_msg/GoalStatusArray.msg

@@ -0,0 +1,5 @@
+# Stores the statuses for goals that are currently being tracked
+# by an action server
+Header header
+GoalStatus[] status_list
+

+ 18 - 0
pjibot_clean_msgs/cartographer_ros_msgs/msg_bagfileprogress.go

@@ -0,0 +1,18 @@
+//autogenerated:yes
+//nolint:revive,lll
+package cartographer_ros_msgs
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+)
+
+type BagfileProgress struct {
+	msg.Package        `ros:"cartographer_ros_msgs"`
+	CurrentBagfileName string
+	CurrentBagfileId   uint32
+	TotalBagfiles      uint32
+	TotalMessages      uint32
+	ProcessedMessages  uint32
+	TotalSeconds       float32
+	ProcessedSeconds   float32
+}

+ 13 - 0
pjibot_clean_msgs/cartographer_ros_msgs/msg_histogrambucket.go

@@ -0,0 +1,13 @@
+//autogenerated:yes
+//nolint:revive,lll
+package cartographer_ros_msgs
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+)
+
+type HistogramBucket struct {
+	msg.Package    `ros:"cartographer_ros_msgs"`
+	BucketBoundary float64
+	Count          float64
+}

+ 16 - 0
pjibot_clean_msgs/cartographer_ros_msgs/msg_landmarkentry.go

@@ -0,0 +1,16 @@
+//autogenerated:yes
+//nolint:revive,lll
+package cartographer_ros_msgs
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+	"github.com/bluenviron/goroslib/v2/pkg/msgs/geometry_msgs"
+)
+
+type LandmarkEntry struct {
+	msg.Package                   `ros:"cartographer_ros_msgs"`
+	Id                            string
+	TrackingFromLandmarkTransform geometry_msgs.Pose
+	TranslationWeight             float64
+	RotationWeight                float64
+}

+ 14 - 0
pjibot_clean_msgs/cartographer_ros_msgs/msg_landmarklist.go

@@ -0,0 +1,14 @@
+//autogenerated:yes
+//nolint:revive,lll
+package cartographer_ros_msgs
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+	"github.com/bluenviron/goroslib/v2/pkg/msgs/std_msgs"
+)
+
+type LandmarkList struct {
+	msg.Package `ros:"cartographer_ros_msgs"`
+	Header      std_msgs.Header
+	Landmarks   []LandmarkEntry
+}

+ 17 - 0
pjibot_clean_msgs/cartographer_ros_msgs/msg_laserscanstates.go

@@ -0,0 +1,17 @@
+//autogenerated:yes
+//nolint:revive,lll
+package cartographer_ros_msgs
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+)
+
+const (
+	LaserScanStates_OK      uint8 = 0
+	LaserScanStates_MISSING uint8 = 1
+)
+
+type LaserScanStates struct {
+	msg.Package     `ros:"cartographer_ros_msgs"`
+	msg.Definitions `ros:"uint8 OK=0,uint8 MISSING=1"`
+}

+ 22 - 0
pjibot_clean_msgs/cartographer_ros_msgs/msg_metric.go

@@ -0,0 +1,22 @@
+//autogenerated:yes
+//nolint:revive,lll
+package cartographer_ros_msgs
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+)
+
+const (
+	Metric_TYPE_COUNTER   uint8 = 0
+	Metric_TYPE_GAUGE     uint8 = 1
+	Metric_TYPE_HISTOGRAM uint8 = 2
+)
+
+type Metric struct {
+	msg.Package     `ros:"cartographer_ros_msgs"`
+	msg.Definitions `ros:"uint8 TYPE_COUNTER=0,uint8 TYPE_GAUGE=1,uint8 TYPE_HISTOGRAM=2"`
+	Type            uint8
+	Labels          []MetricLabel
+	Value           float64
+	CountsByBucket  []HistogramBucket
+}

+ 14 - 0
pjibot_clean_msgs/cartographer_ros_msgs/msg_metricfamily.go

@@ -0,0 +1,14 @@
+//autogenerated:yes
+//nolint:revive,lll
+package cartographer_ros_msgs
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+)
+
+type MetricFamily struct {
+	msg.Package `ros:"cartographer_ros_msgs"`
+	Name        string
+	Description string
+	Metrics     []Metric
+}

+ 13 - 0
pjibot_clean_msgs/cartographer_ros_msgs/msg_metriclabel.go

@@ -0,0 +1,13 @@
+//autogenerated:yes
+//nolint:revive,lll
+package cartographer_ros_msgs
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+)
+
+type MetricLabel struct {
+	msg.Package `ros:"cartographer_ros_msgs"`
+	Key         string
+	Value       string
+}

+ 17 - 0
pjibot_clean_msgs/cartographer_ros_msgs/msg_robotpose.go

@@ -0,0 +1,17 @@
+//autogenerated:yes
+//nolint:revive,lll
+package cartographer_ros_msgs
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+	"github.com/bluenviron/goroslib/v2/pkg/msgs/geometry_msgs"
+)
+
+type RobotPose struct {
+	msg.Package        `ros:"cartographer_ros_msgs"`
+	RobotPose          geometry_msgs.Pose
+	CovarianceScore    float32
+	CurrentTrajectory  string
+	LastUpdatePose     geometry_msgs.Pose
+	LastUpdateDuration float32
+}

+ 31 - 0
pjibot_clean_msgs/cartographer_ros_msgs/msg_statuscode.go

@@ -0,0 +1,31 @@
+//autogenerated:yes
+//nolint:revive,lll
+package cartographer_ros_msgs
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+)
+
+const (
+	StatusCode_OK                  uint8 = 0
+	StatusCode_CANCELLED           uint8 = 1
+	StatusCode_UNKNOWN             uint8 = 2
+	StatusCode_INVALID_ARGUMENT    uint8 = 3
+	StatusCode_DEADLINE_EXCEEDED   uint8 = 4
+	StatusCode_NOT_FOUND           uint8 = 5
+	StatusCode_ALREADY_EXISTS      uint8 = 6
+	StatusCode_PERMISSION_DENIED   uint8 = 7
+	StatusCode_RESOURCE_EXHAUSTED  uint8 = 8
+	StatusCode_FAILED_PRECONDITION uint8 = 9
+	StatusCode_ABORTED             uint8 = 10
+	StatusCode_OUT_OF_RANGE        uint8 = 11
+	StatusCode_UNIMPLEMENTED       uint8 = 12
+	StatusCode_INTERNAL            uint8 = 13
+	StatusCode_UNAVAILABLE         uint8 = 14
+	StatusCode_DATA_LOSS           uint8 = 15
+)
+
+type StatusCode struct {
+	msg.Package     `ros:"cartographer_ros_msgs"`
+	msg.Definitions `ros:"uint8 OK=0,uint8 CANCELLED=1,uint8 UNKNOWN=2,uint8 INVALID_ARGUMENT=3,uint8 DEADLINE_EXCEEDED=4,uint8 NOT_FOUND=5,uint8 ALREADY_EXISTS=6,uint8 PERMISSION_DENIED=7,uint8 RESOURCE_EXHAUSTED=8,uint8 FAILED_PRECONDITION=9,uint8 ABORTED=10,uint8 OUT_OF_RANGE=11,uint8 UNIMPLEMENTED=12,uint8 INTERNAL=13,uint8 UNAVAILABLE=14,uint8 DATA_LOSS=15"`
+}

+ 13 - 0
pjibot_clean_msgs/cartographer_ros_msgs/msg_statusresponse.go

@@ -0,0 +1,13 @@
+//autogenerated:yes
+//nolint:revive,lll
+package cartographer_ros_msgs
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+)
+
+type StatusResponse struct {
+	msg.Package `ros:"cartographer_ros_msgs"`
+	Code        uint8
+	Message     string
+}

+ 17 - 0
pjibot_clean_msgs/cartographer_ros_msgs/msg_submapentry.go

@@ -0,0 +1,17 @@
+//autogenerated:yes
+//nolint:revive,lll
+package cartographer_ros_msgs
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+	"github.com/bluenviron/goroslib/v2/pkg/msgs/geometry_msgs"
+)
+
+type SubmapEntry struct {
+	msg.Package   `ros:"cartographer_ros_msgs"`
+	TrajectoryId  int32
+	SubmapIndex   int32
+	SubmapVersion int32
+	Pose          geometry_msgs.Pose
+	IsFrozen      bool
+}

+ 14 - 0
pjibot_clean_msgs/cartographer_ros_msgs/msg_submaplist.go

@@ -0,0 +1,14 @@
+//autogenerated:yes
+//nolint:revive,lll
+package cartographer_ros_msgs
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+	"github.com/bluenviron/goroslib/v2/pkg/msgs/std_msgs"
+)
+
+type SubmapList struct {
+	msg.Package `ros:"cartographer_ros_msgs"`
+	Header      std_msgs.Header
+	Submap      []SubmapEntry
+}

+ 17 - 0
pjibot_clean_msgs/cartographer_ros_msgs/msg_submaptexture.go

@@ -0,0 +1,17 @@
+//autogenerated:yes
+//nolint:revive,lll
+package cartographer_ros_msgs
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+	"github.com/bluenviron/goroslib/v2/pkg/msgs/geometry_msgs"
+)
+
+type SubmapTexture struct {
+	msg.Package `ros:"cartographer_ros_msgs"`
+	Cells       []uint8
+	Width       int32
+	Height      int32
+	Resolution  float64
+	SlicePose   geometry_msgs.Pose
+}

+ 23 - 0
pjibot_clean_msgs/cartographer_ros_msgs/msg_trajectorystates.go

@@ -0,0 +1,23 @@
+//autogenerated:yes
+//nolint:revive,lll
+package cartographer_ros_msgs
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+	"github.com/bluenviron/goroslib/v2/pkg/msgs/std_msgs"
+)
+
+const (
+	TrajectoryStates_ACTIVE   uint8 = 0
+	TrajectoryStates_FINISHED uint8 = 1
+	TrajectoryStates_FROZEN   uint8 = 2
+	TrajectoryStates_DELETED  uint8 = 3
+)
+
+type TrajectoryStates struct {
+	msg.Package     `ros:"cartographer_ros_msgs"`
+	msg.Definitions `ros:"uint8 ACTIVE=0,uint8 FINISHED=1,uint8 FROZEN=2,uint8 DELETED=3"`
+	Header          std_msgs.Header
+	TrajectoryId    []int32
+	TrajectoryState []uint8
+}

+ 5 - 0
pjibot_clean_msgs/cartographer_ros_msgs/package.go

@@ -0,0 +1,5 @@
+// Package cartographer_ros_msgs contains message definitions.
+//
+//autogenerated:yes
+//nolint:revive
+package cartographer_ros_msgs

+ 24 - 0
pjibot_clean_msgs/cartographer_ros_msgs/srv_deletetrajectory.go

@@ -0,0 +1,24 @@
+//autogenerated:yes
+//nolint:revive,lll
+package cartographer_ros_msgs
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+)
+
+type DeleteTrajectoryReq struct {
+	msg.Package  `ros:"cartographer_ros_msgs"`
+	TrajectoryId string
+}
+
+type DeleteTrajectoryRes struct {
+	msg.Package  `ros:"cartographer_ros_msgs"`
+	Status       StatusResponse
+	TrajectoryId int32
+}
+
+type DeleteTrajectory struct {
+	msg.Package `ros:"cartographer_ros_msgs"`
+	DeleteTrajectoryReq
+	DeleteTrajectoryRes
+}

+ 23 - 0
pjibot_clean_msgs/cartographer_ros_msgs/srv_finishtrajectory.go

@@ -0,0 +1,23 @@
+//autogenerated:yes
+//nolint:revive,lll
+package cartographer_ros_msgs
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+)
+
+type FinishTrajectoryReq struct {
+	msg.Package  `ros:"cartographer_ros_msgs"`
+	TrajectoryId int32
+}
+
+type FinishTrajectoryRes struct {
+	msg.Package `ros:"cartographer_ros_msgs"`
+	Status      StatusResponse
+}
+
+type FinishTrajectory struct {
+	msg.Package `ros:"cartographer_ros_msgs"`
+	FinishTrajectoryReq
+	FinishTrajectoryRes
+}

+ 23 - 0
pjibot_clean_msgs/cartographer_ros_msgs/srv_gettrajectorystates.go

@@ -0,0 +1,23 @@
+//autogenerated:yes
+//nolint:revive,lll
+package cartographer_ros_msgs
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+)
+
+type GetTrajectoryStatesReq struct {
+	msg.Package `ros:"cartographer_ros_msgs"`
+}
+
+type GetTrajectoryStatesRes struct {
+	msg.Package      `ros:"cartographer_ros_msgs"`
+	Status           StatusResponse
+	TrajectoryStates TrajectoryStates
+}
+
+type GetTrajectoryStates struct {
+	msg.Package `ros:"cartographer_ros_msgs"`
+	GetTrajectoryStatesReq
+	GetTrajectoryStatesRes
+}

+ 25 - 0
pjibot_clean_msgs/cartographer_ros_msgs/srv_readmetrics.go

@@ -0,0 +1,25 @@
+//autogenerated:yes
+//nolint:revive,lll
+package cartographer_ros_msgs
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+	"time"
+)
+
+type ReadMetricsReq struct {
+	msg.Package `ros:"cartographer_ros_msgs"`
+}
+
+type ReadMetricsRes struct {
+	msg.Package    `ros:"cartographer_ros_msgs"`
+	Status         StatusResponse
+	MetricFamilies []MetricFamily
+	Timestamp      time.Time
+}
+
+type ReadMetrics struct {
+	msg.Package `ros:"cartographer_ros_msgs"`
+	ReadMetricsReq
+	ReadMetricsRes
+}

+ 22 - 0
pjibot_clean_msgs/cartographer_ros_msgs/srv_scanqualityquery.go

@@ -0,0 +1,22 @@
+//autogenerated:yes
+//nolint:revive,lll
+package cartographer_ros_msgs
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+)
+
+type ScanQualityQueryReq struct {
+	msg.Package `ros:"cartographer_ros_msgs"`
+}
+
+type ScanQualityQueryRes struct {
+	msg.Package `ros:"cartographer_ros_msgs"`
+	Status      StatusResponse
+}
+
+type ScanQualityQuery struct {
+	msg.Package `ros:"cartographer_ros_msgs"`
+	ScanQualityQueryReq
+	ScanQualityQueryRes
+}

+ 29 - 0
pjibot_clean_msgs/cartographer_ros_msgs/srv_starttrajectory.go

@@ -0,0 +1,29 @@
+//autogenerated:yes
+//nolint:revive,lll
+package cartographer_ros_msgs
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+	"github.com/bluenviron/goroslib/v2/pkg/msgs/geometry_msgs"
+)
+
+type StartTrajectoryReq struct {
+	msg.Package            `ros:"cartographer_ros_msgs"`
+	ConfigurationDirectory string
+	ConfigurationBasename  string
+	UseInitialPose         bool
+	InitialPose            geometry_msgs.Pose
+	RelativeToTrajectoryId int32
+}
+
+type StartTrajectoryRes struct {
+	msg.Package  `ros:"cartographer_ros_msgs"`
+	Status       StatusResponse
+	TrajectoryId int32
+}
+
+type StartTrajectory struct {
+	msg.Package `ros:"cartographer_ros_msgs"`
+	StartTrajectoryReq
+	StartTrajectoryRes
+}

+ 26 - 0
pjibot_clean_msgs/cartographer_ros_msgs/srv_submapquery.go

@@ -0,0 +1,26 @@
+//autogenerated:yes
+//nolint:revive,lll
+package cartographer_ros_msgs
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+)
+
+type SubmapQueryReq struct {
+	msg.Package  `ros:"cartographer_ros_msgs"`
+	TrajectoryId int32
+	SubmapIndex  int32
+}
+
+type SubmapQueryRes struct {
+	msg.Package   `ros:"cartographer_ros_msgs"`
+	Status        StatusResponse
+	SubmapVersion int32
+	Textures      []SubmapTexture
+}
+
+type SubmapQuery struct {
+	msg.Package `ros:"cartographer_ros_msgs"`
+	SubmapQueryReq
+	SubmapQueryRes
+}

+ 24 - 0
pjibot_clean_msgs/cartographer_ros_msgs/srv_switchmap.go

@@ -0,0 +1,24 @@
+//autogenerated:yes
+//nolint:revive,lll
+package cartographer_ros_msgs
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+)
+
+type SwitchMapReq struct {
+	msg.Package `ros:"cartographer_ros_msgs"`
+	Filename    string
+	FrozenState bool
+}
+
+type SwitchMapRes struct {
+	msg.Package `ros:"cartographer_ros_msgs"`
+	Result      int32
+}
+
+type SwitchMap struct {
+	msg.Package `ros:"cartographer_ros_msgs"`
+	SwitchMapReq
+	SwitchMapRes
+}

+ 25 - 0
pjibot_clean_msgs/cartographer_ros_msgs/srv_trajectoryquery.go

@@ -0,0 +1,25 @@
+//autogenerated:yes
+//nolint:revive,lll
+package cartographer_ros_msgs
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+	"github.com/bluenviron/goroslib/v2/pkg/msgs/geometry_msgs"
+)
+
+type TrajectoryQueryReq struct {
+	msg.Package  `ros:"cartographer_ros_msgs"`
+	TrajectoryId int32
+}
+
+type TrajectoryQueryRes struct {
+	msg.Package `ros:"cartographer_ros_msgs"`
+	Status      StatusResponse
+	Trajectory  []geometry_msgs.PoseStamped
+}
+
+type TrajectoryQuery struct {
+	msg.Package `ros:"cartographer_ros_msgs"`
+	TrajectoryQueryReq
+	TrajectoryQueryRes
+}

+ 24 - 0
pjibot_clean_msgs/cartographer_ros_msgs/srv_writestate.go

@@ -0,0 +1,24 @@
+//autogenerated:yes
+//nolint:revive,lll
+package cartographer_ros_msgs
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+)
+
+type WriteStateReq struct {
+	msg.Package              `ros:"cartographer_ros_msgs"`
+	Filename                 string
+	IncludeUnfinishedSubmaps bool
+}
+
+type WriteStateRes struct {
+	msg.Package `ros:"cartographer_ros_msgs"`
+	Status      StatusResponse
+}
+
+type WriteState struct {
+	msg.Package `ros:"cartographer_ros_msgs"`
+	WriteStateReq
+	WriteStateRes
+}

+ 14 - 0
pjibot_clean_msgs/clean_msg/msg_alongwallpath.go

@@ -0,0 +1,14 @@
+//autogenerated:yes
+//nolint:revive,lll
+package clean_msg
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+)
+
+type AlongWallPath struct {
+	msg.Package `ros:"clean_msg"`
+	Direction   int64
+	Points      []GridPhits
+	CleanLabel  int32
+}

+ 13 - 0
pjibot_clean_msgs/clean_msg/msg_destinationpoint.go

@@ -0,0 +1,13 @@
+//autogenerated:yes
+//nolint:revive,lll
+package clean_msg
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+)
+
+type DestinationPoint struct {
+	msg.Package `ros:"clean_msg"`
+	Angle       float32
+	Position    GridPosition
+}

+ 38 - 0
pjibot_clean_msgs/clean_msg/msg_errorinfo.go

@@ -0,0 +1,38 @@
+//autogenerated:yes
+//nolint:revive,lll
+package clean_msg
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+)
+
+const (
+	ErrorInfo_NORMAL                             uint8 = 0
+	ErrorInfo_ERROR_CHARGER_NAVI                 uint8 = 1
+	ErrorInfo_ERROR_PATH_FOLLOWER_NAVI           uint8 = 2
+	ErrorInfo_ERROR_NAVIGATOR_NAVI               uint8 = 3
+	ErrorInfo_ERROR_STANDBY_NAVI                 uint8 = 4
+	ErrorInfo_ERROR_CHARGER_CHECK_STATION        uint8 = 5
+	ErrorInfo_ERROR_WALL_FOLLOWER_NAVI           uint8 = 6
+	ErrorInfo_ERROR_CHARGER_LOAD_STATION         uint8 = 7
+	ErrorInfo_ERROR_CHARGER_CHARGING             uint8 = 8
+	ErrorInfo_ERROR_WALL_FOLLOWER_WALL_REACHABLE uint8 = 9
+	ErrorInfo_ERROR_START_TASK_MANUAL_CHARGING   uint8 = 10
+	ErrorInfo_ERROR_START_TASK_LOCALIZED         uint8 = 11
+	ErrorInfo_ERROR_START_TASK_OUT_OF_STATION    uint8 = 12
+	ErrorInfo_ERROR_START_TASK_LOAD_MAP          uint8 = 13
+	ErrorInfo_ERROR_START_TASK_BUMPING           uint8 = 14
+	ErrorInfo_ERROR_START_TASK_EMERGENCY_BUTTON  uint8 = 15
+	ErrorInfo_ERROR_START_TASK_LOW_BATTERY       uint8 = 16
+	ErrorInfo_ERROR_PATH_FOLLOWER_PATH_REACHABLE uint8 = 17
+	ErrorInfo_ERROR_WALL_FOLLOWER_PLANNING       uint8 = 18
+	ErrorInfo_ERROR_LOCAL_PLANNER_PLANNING       uint8 = 19
+	ErrorInfo_ERROR_AREA_CLEANER_AREA_REACHABLE  uint8 = 20
+)
+
+type ErrorInfo struct {
+	msg.Package     `ros:"clean_msg"`
+	msg.Definitions `ros:"uint8 NORMAL=0,uint8 ERROR_CHARGER_NAVI=1,uint8 ERROR_PATH_FOLLOWER_NAVI=2,uint8 ERROR_NAVIGATOR_NAVI=3,uint8 ERROR_STANDBY_NAVI=4,uint8 ERROR_CHARGER_CHECK_STATION=5,uint8 ERROR_WALL_FOLLOWER_NAVI=6,uint8 ERROR_CHARGER_LOAD_STATION=7,uint8 ERROR_CHARGER_CHARGING=8,uint8 ERROR_WALL_FOLLOWER_WALL_REACHABLE=9,uint8 ERROR_START_TASK_MANUAL_CHARGING=10,uint8 ERROR_START_TASK_LOCALIZED=11,uint8 ERROR_START_TASK_OUT_OF_STATION=12,uint8 ERROR_START_TASK_LOAD_MAP=13,uint8 ERROR_START_TASK_BUMPING=14,uint8 ERROR_START_TASK_EMERGENCY_BUTTON=15,uint8 ERROR_START_TASK_LOW_BATTERY=16,uint8 ERROR_PATH_FOLLOWER_PATH_REACHABLE=17,uint8 ERROR_WALL_FOLLOWER_PLANNING=18,uint8 ERROR_LOCAL_PLANNER_PLANNING=19,uint8 ERROR_AREA_CLEANER_AREA_REACHABLE=20"`
+	EquipmentId     uint8
+	ErrorData       uint8
+}

+ 14 - 0
pjibot_clean_msgs/clean_msg/msg_gridphits.go

@@ -0,0 +1,14 @@
+//autogenerated:yes
+//nolint:revive,lll
+package clean_msg
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+)
+
+type GridPhits struct {
+	msg.Package `ros:"clean_msg"`
+	X           int32
+	Y           int32
+	Angle       float32
+}

+ 13 - 0
pjibot_clean_msgs/clean_msg/msg_gridposition.go

@@ -0,0 +1,13 @@
+//autogenerated:yes
+//nolint:revive,lll
+package clean_msg
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+)
+
+type GridPosition struct {
+	msg.Package `ros:"clean_msg"`
+	X           int32
+	Y           int32
+}

+ 17 - 0
pjibot_clean_msgs/clean_msg/msg_partition.go

@@ -0,0 +1,17 @@
+//autogenerated:yes
+//nolint:revive,lll
+package clean_msg
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+)
+
+type Partition struct {
+	msg.Package      `ros:"clean_msg"`
+	MapName          string
+	PathName         string
+	PartitionSide    []GridPhits
+	CleanOrientation float32
+	CleanWalls       []AlongWallPath
+	CleanLabel       int32
+}

+ 12 - 0
pjibot_clean_msgs/clean_msg/msg_partitionlist.go

@@ -0,0 +1,12 @@
+//autogenerated:yes
+//nolint:revive,lll
+package clean_msg
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+)
+
+type PartitionList struct {
+	msg.Package `ros:"clean_msg"`
+	Data        []Partition
+}

+ 16 - 0
pjibot_clean_msgs/clean_msg/msg_path.go

@@ -0,0 +1,16 @@
+//autogenerated:yes
+//nolint:revive,lll
+package clean_msg
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+	"github.com/bluenviron/goroslib/v2/pkg/msgs/geometry_msgs"
+)
+
+type Path struct {
+	msg.Package `ros:"clean_msg"`
+	Radius      float32
+	Radio       int32
+	Data        []GridPhits
+	Path        []geometry_msgs.Vector3
+}

+ 14 - 0
pjibot_clean_msgs/clean_msg/msg_pathlist.go

@@ -0,0 +1,14 @@
+//autogenerated:yes
+//nolint:revive,lll
+package clean_msg
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+)
+
+type PathList struct {
+	msg.Package `ros:"clean_msg"`
+	MapName     string
+	PathName    string
+	Data        []Path
+}

+ 13 - 0
pjibot_clean_msgs/clean_msg/msg_rangelist.go

@@ -0,0 +1,13 @@
+//autogenerated:yes
+//nolint:revive,lll
+package clean_msg
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+	"github.com/bluenviron/goroslib/v2/pkg/msgs/sensor_msgs"
+)
+
+type RangeList struct {
+	msg.Package `ros:"clean_msg"`
+	Range       []sensor_msgs.Range
+}

+ 22 - 0
pjibot_clean_msgs/clean_msg/msg_sweepsystem.go

@@ -0,0 +1,22 @@
+//autogenerated:yes
+//nolint:revive,lll
+package clean_msg
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+	"github.com/bluenviron/goroslib/v2/pkg/msgs/std_msgs"
+)
+
+type SweepSystem struct {
+	msg.Package   `ros:"clean_msg"`
+	CleanModel    std_msgs.Bool
+	SwitchControl std_msgs.Bool
+	BesideBrush   std_msgs.Bool
+	MiddleBrush   std_msgs.Bool
+	PushBeam      std_msgs.Bool
+	Fan           std_msgs.Bool
+	WaterPump     std_msgs.Bool
+	VibratingDust std_msgs.Bool
+	Baffle        std_msgs.Bool
+	Lamp          std_msgs.Bool
+}

+ 29 - 0
pjibot_clean_msgs/clean_msg/msg_task.go

@@ -0,0 +1,29 @@
+//autogenerated:yes
+//nolint:revive,lll
+package clean_msg
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+)
+
+const (
+	Task_STANDBY          uint8 = 0
+	Task_PATH_FOLLOW      uint8 = 1
+	Task_GO_TO_TARGET     uint8 = 2
+	Task_GO_HOME          uint8 = 3
+	Task_ZONE_CLEAN       uint8 = 4
+	Task_WALLFOLLOW_LEFT  uint8 = 5
+	Task_WALLFOLLOW_RIGHT uint8 = 6
+	Task_GO_BACK          uint8 = 7
+	Task_AREA_NAVIGATOR   uint8 = 8
+)
+
+type Task struct {
+	msg.Package     `ros:"clean_msg"`
+	msg.Definitions `ros:"uint8 STANDBY=0,uint8 PATH_FOLLOW=1,uint8 GO_TO_TARGET=2,uint8 GO_HOME=3,uint8 ZONE_CLEAN=4,uint8 WALLFOLLOW_LEFT=5,uint8 WALLFOLLOW_RIGHT=6,uint8 GO_BACK=7,uint8 AREA_NAVIGATOR=8"`
+	Type            uint8
+	Data            TaskData
+	TaskId          string
+	TaskType        int32
+	SubTaskType     int32
+}

+ 21 - 0
pjibot_clean_msgs/clean_msg/msg_taskdata.go

@@ -0,0 +1,21 @@
+//autogenerated:yes
+//nolint:revive,lll
+package clean_msg
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+	"github.com/bluenviron/goroslib/v2/pkg/msgs/geometry_msgs"
+)
+
+type TaskData struct {
+	msg.Package      `ros:"clean_msg"`
+	CleanPartion     Partition
+	CustomPath       PathList
+	NaviGoal         DestinationPoint
+	AlongWallPath    AlongWallPath
+	RecordPath       Partition
+	GlobleWallPath   []geometry_msgs.Vector3
+	RotateToGoal     bool
+	FindNearTarget   bool
+	IsArcSegmentPath bool
+}

+ 13 - 0
pjibot_clean_msgs/clean_msg/msg_tasklist.go

@@ -0,0 +1,13 @@
+//autogenerated:yes
+//nolint:revive,lll
+package clean_msg
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+)
+
+type TaskList struct {
+	msg.Package `ros:"clean_msg"`
+	Data        []Task
+	Frequency   int64
+}

+ 12 - 0
pjibot_clean_msgs/clean_msg/msg_virtualwalllist.go

@@ -0,0 +1,12 @@
+//autogenerated:yes
+//nolint:revive,lll
+package clean_msg
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+)
+
+type VirtualWallList struct {
+	msg.Package `ros:"clean_msg"`
+	Data        []PathList
+}

+ 19 - 0
pjibot_clean_msgs/clean_msg/msg_washsystem.go

@@ -0,0 +1,19 @@
+//autogenerated:yes
+//nolint:revive,lll
+package clean_msg
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+	"github.com/bluenviron/goroslib/v2/pkg/msgs/std_msgs"
+)
+
+type WashSystem struct {
+	msg.Package      `ros:"clean_msg"`
+	CleanSwitch      std_msgs.Int8
+	BrushSwitch      std_msgs.Bool
+	BrushPush        std_msgs.Int8
+	SuctioNozzle     std_msgs.Bool
+	SuctioNozzlePush std_msgs.Int8
+	WaterPump        std_msgs.Bool
+	ElectricBall     std_msgs.Bool
+}

+ 5 - 0
pjibot_clean_msgs/clean_msg/package.go

@@ -0,0 +1,5 @@
+// Package clean_msg contains message definitions.
+//
+//autogenerated:yes
+//nolint:revive
+package clean_msg

+ 23 - 0
pjibot_clean_msgs/clean_msg/srv_checkcustompath.go

@@ -0,0 +1,23 @@
+//autogenerated:yes
+//nolint:revive,lll
+package clean_msg
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+)
+
+type CheckCustomPathReq struct {
+	msg.Package `ros:"clean_msg"`
+	Path        Path
+}
+
+type CheckCustomPathRes struct {
+	msg.Package `ros:"clean_msg"`
+	State       bool
+}
+
+type CheckCustomPath struct {
+	msg.Package `ros:"clean_msg"`
+	CheckCustomPathReq
+	CheckCustomPathRes
+}

+ 24 - 0
pjibot_clean_msgs/clean_msg/srv_getalongwallpath.go

@@ -0,0 +1,24 @@
+//autogenerated:yes
+//nolint:revive,lll
+package clean_msg
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+)
+
+type GetAlongWallPathReq struct {
+	msg.Package `ros:"clean_msg"`
+	Direction   int64
+	Point       GridPosition
+}
+
+type GetAlongWallPathRes struct {
+	msg.Package `ros:"clean_msg"`
+	Points      []GridPhits
+}
+
+type GetAlongWallPath struct {
+	msg.Package `ros:"clean_msg"`
+	GetAlongWallPathReq
+	GetAlongWallPathRes
+}

+ 24 - 0
pjibot_clean_msgs/clean_msg/srv_loadforbiddenarea.go

@@ -0,0 +1,24 @@
+//autogenerated:yes
+//nolint:revive,lll
+package clean_msg
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+)
+
+type LoadForbiddenAreaReq struct {
+	msg.Package `ros:"clean_msg"`
+	MapName     string
+	UncleanArea PartitionList
+}
+
+type LoadForbiddenAreaRes struct {
+	msg.Package `ros:"clean_msg"`
+	State       bool
+}
+
+type LoadForbiddenArea struct {
+	msg.Package `ros:"clean_msg"`
+	LoadForbiddenAreaReq
+	LoadForbiddenAreaRes
+}

+ 25 - 0
pjibot_clean_msgs/clean_msg/srv_loadmap.go

@@ -0,0 +1,25 @@
+//autogenerated:yes
+//nolint:revive,lll
+package clean_msg
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+)
+
+type LoadMapReq struct {
+	msg.Package `ros:"clean_msg"`
+	MapName     string
+	UncleanArea PartitionList
+	Wall        VirtualWallList
+}
+
+type LoadMapRes struct {
+	msg.Package `ros:"clean_msg"`
+	State       bool
+}
+
+type LoadMap struct {
+	msg.Package `ros:"clean_msg"`
+	LoadMapReq
+	LoadMapRes
+}

+ 23 - 0
pjibot_clean_msgs/clean_msg/srv_loadtask.go

@@ -0,0 +1,23 @@
+//autogenerated:yes
+//nolint:revive,lll
+package clean_msg
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+)
+
+type LoadTaskReq struct {
+	msg.Package `ros:"clean_msg"`
+	Info        TaskList
+}
+
+type LoadTaskRes struct {
+	msg.Package `ros:"clean_msg"`
+	ErrorCode   int8 `rosname:"errorCode"`
+}
+
+type LoadTask struct {
+	msg.Package `ros:"clean_msg"`
+	LoadTaskReq
+	LoadTaskRes
+}

+ 24 - 0
pjibot_clean_msgs/clean_msg/srv_loadvirtualwall.go

@@ -0,0 +1,24 @@
+//autogenerated:yes
+//nolint:revive,lll
+package clean_msg
+
+import (
+	"github.com/bluenviron/goroslib/v2/pkg/msg"
+)
+
+type LoadVirtualWallReq struct {
+	msg.Package `ros:"clean_msg"`
+	MapName     string
+	Wall        VirtualWallList
+}
+
+type LoadVirtualWallRes struct {
+	msg.Package `ros:"clean_msg"`
+	State       bool
+}
+
+type LoadVirtualWall struct {
+	msg.Package `ros:"clean_msg"`
+	LoadVirtualWallReq
+	LoadVirtualWallRes
+}

+ 3 - 0
pjibot_clean_msgs/clean_msg_msg/AlongWallPath.msg

@@ -0,0 +1,3 @@
+int64 direction                     # 0-右沿墙, 1-左沿墙
+clean_msg/GridPhits[] points        # [pixel], world coordinates
+int32 clean_label                   # 0-全图贴边  1-区域贴边

+ 2 - 0
pjibot_clean_msgs/clean_msg_msg/DestinationPoint.msg

@@ -0,0 +1,2 @@
+float32 angle
+clean_msg/GridPosition position

+ 24 - 0
pjibot_clean_msgs/clean_msg_msg/ErrorInfo.msg

@@ -0,0 +1,24 @@
+uint8 NORMAL = 0
+uint8 ERROR_CHARGER_NAVI = 1
+uint8 ERROR_PATH_FOLLOWER_NAVI = 2
+uint8 ERROR_NAVIGATOR_NAVI = 3
+uint8 ERROR_STANDBY_NAVI = 4
+uint8 ERROR_CHARGER_CHECK_STATION = 5
+uint8 ERROR_WALL_FOLLOWER_NAVI = 6
+uint8 ERROR_CHARGER_LOAD_STATION = 7
+uint8 ERROR_CHARGER_CHARGING = 8
+uint8 ERROR_WALL_FOLLOWER_WALL_REACHABLE = 9
+uint8 ERROR_START_TASK_MANUAL_CHARGING = 10
+uint8 ERROR_START_TASK_LOCALIZED = 11
+uint8 ERROR_START_TASK_OUT_OF_STATION = 12
+uint8 ERROR_START_TASK_LOAD_MAP = 13
+uint8 ERROR_START_TASK_BUMPING = 14
+uint8 ERROR_START_TASK_EMERGENCY_BUTTON = 15
+uint8 ERROR_START_TASK_LOW_BATTERY = 16
+uint8 ERROR_PATH_FOLLOWER_PATH_REACHABLE = 17
+uint8 ERROR_WALL_FOLLOWER_PLANNING = 18
+uint8 ERROR_LOCAL_PLANNER_PLANNING = 19
+uint8 ERROR_AREA_CLEANER_AREA_REACHABLE = 20
+
+uint8 equipment_id
+uint8 error_data

+ 3 - 0
pjibot_clean_msgs/clean_msg_msg/GridPhits.msg

@@ -0,0 +1,3 @@
+int32 x
+int32 y
+float32 angle

Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff