孟令鑫 vor 1 Jahr
Ursprung
Commit
b2b127d9b9

+ 10 - 12
aarch64/kinglong/common/config/c_ros.go

@@ -4,7 +4,7 @@ import (
 	"cicv-data-closedloop/common/config/c_log"
 	"cicv-data-closedloop/common/util"
 	"github.com/bluenviron/goroslib/v2"
-	"os"
+	"time"
 )
 
 var (
@@ -14,18 +14,17 @@ var (
 )
 
 func InitRosConfig() {
-	c_log.GlobalLogger.Info("初始化RosNode - 开始")
 	var err error
-	RosNode, err = goroslib.NewNode(goroslib.NodeConf{
-		Name:          "node" + util.GetNowTimeCustom(),
-		MasterAddress: CloudConfig.Ros.MasterAddress,
-	})
-	if err != nil {
-		c_log.GlobalLogger.Error("初始化RosNode - 失败:", err)
-		os.Exit(-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)
-	// 获取 rosbag 命令路径和环境变量
+	// 2 获取 rosbag 命令路径和环境变量
 	for _, host := range CloudConfig.Hosts {
 		if host.Name == LocalConfig.Node.Name {
 			RosbagPath = host.Rosbag.Path
@@ -34,5 +33,4 @@ func InitRosConfig() {
 		}
 	}
 	c_log.GlobalLogger.Infof("rosbag 命令路径为:%v,环境变量为:%v", RosbagPath, RosbagEnvs)
-
 }

+ 0 - 33
aarch64/kinglong/common/init/common_init.go

@@ -1,33 +0,0 @@
-package init
-
-import (
-	"cicv-data-closedloop/aarch64/kinglong/common/config"
-	"cicv-data-closedloop/aarch64/kinglong/common/service"
-)
-
-func Init() {
-
-	// 初始化本地配置文件(第1处配置,在本地文件)
-	config.InitLocalConfig()
-
-	// 初始化Oss连接信息
-	config.InitOssConfig()
-
-	// 初始化业务逻辑配置信息,配置文件在oss上(第2处配置,在oss文件)
-	config.InitCloudConfig()
-
-	go config.RefreshCloudConfig()
-
-	// 初始化数据闭环平台的配置(第3处配置,在数据闭环平台接口)
-	config.InitPlatformConfig()
-
-	// 初始化ros节点
-	config.InitRosConfig()
-
-	// 维护data目录缓存的包数量
-	go service.BagCacheClean()
-
-	// 磁盘占用过高时根据缓存策略处理copy目录
-	go service.DiskClean()
-
-}

+ 22 - 2
aarch64/kinglong/master/main/master.go

@@ -2,7 +2,6 @@ package main
 
 import (
 	commonConfig "cicv-data-closedloop/aarch64/kinglong/common/config"
-	commonInit "cicv-data-closedloop/aarch64/kinglong/common/init"
 	commonService "cicv-data-closedloop/aarch64/kinglong/common/service"
 	masterConfig "cicv-data-closedloop/aarch64/kinglong/master/package/config"
 	masterService "cicv-data-closedloop/aarch64/kinglong/master/package/service"
@@ -14,7 +13,28 @@ func init() {
 	//runtime.GOMAXPROCS(1)
 	// 初始化日志配置
 	c_log.InitLog("mnt/media/sda1/cicv-data-closedloop/log", "kinglong-master")
-	commonInit.Init()
+	// 初始化本地配置文件(第1处配置,在本地文件)
+	commonConfig.InitLocalConfig()
+
+	// 初始化Oss连接信息
+	commonConfig.InitOssConfig()
+
+	// 初始化业务逻辑配置信息,配置文件在oss上(第2处配置,在oss文件)
+	commonConfig.InitCloudConfig()
+
+	go commonConfig.RefreshCloudConfig()
+
+	// 初始化数据闭环平台的配置(第3处配置,在数据闭环平台接口)
+	commonConfig.InitPlatformConfig()
+
+	// 初始化ros节点
+	commonConfig.InitRosConfig()
+
+	// 维护data目录缓存的包数量
+	go commonService.BagCacheClean()
+
+	// 磁盘占用过高时根据缓存策略处理copy目录
+	go commonService.DiskClean()
 	// 初始化加载触发器插件文件
 	masterConfig.InitTriggerConfig()
 	// 初始化rpc监听

+ 0 - 12
aarch64/kinglong/master/package/service/produce_window.go

@@ -43,10 +43,6 @@ func PrepareTimeWindowProducerQueue() {
 					yaw = data.Yaw
 					m.RUnlock()
 
-					if len(masterConfig.TopicOfCicvLocation) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()
@@ -72,10 +68,6 @@ func PrepareTimeWindowProducerQueue() {
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *kinglong_msgs.PerceptionObjects) {
-					if len(masterConfig.TopicOfTpperception) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()
@@ -101,10 +93,6 @@ func PrepareTimeWindowProducerQueue() {
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *kinglong_msgs.Retrieval) {
-					if len(masterConfig.TopicOfDataRead) == 0 && len(masterConfig.RuleOfDataRead) > 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()

+ 26 - 6
aarch64/kinglong/slave/main/slave.go

@@ -1,8 +1,7 @@
 package main
 
 import (
-	"cicv-data-closedloop/aarch64/kinglong/common/config"
-	commonInit "cicv-data-closedloop/aarch64/kinglong/common/init"
+	commonConfig "cicv-data-closedloop/aarch64/kinglong/common/config"
 	commonService "cicv-data-closedloop/aarch64/kinglong/common/service"
 	slaveConfig "cicv-data-closedloop/aarch64/kinglong/slave/package/config"
 	slaveService "cicv-data-closedloop/aarch64/kinglong/slave/package/service"
@@ -13,9 +12,30 @@ import (
 func init() {
 	//runtime.GOMAXPROCS(1)
 	c_log.InitLog("mnt/media/sda1/cicv-data-closedloop/log", "kinglong-master")
-	commonInit.Init()
+	// 初始化本地配置文件(第1处配置,在本地文件)
+	commonConfig.InitLocalConfig()
+
+	// 初始化Oss连接信息
+	commonConfig.InitOssConfig()
+
+	// 初始化业务逻辑配置信息,配置文件在oss上(第2处配置,在oss文件)
+	commonConfig.InitCloudConfig()
+
+	go commonConfig.RefreshCloudConfig()
+
+	// 初始化数据闭环平台的配置(第3处配置,在数据闭环平台接口)
+	commonConfig.InitPlatformConfig()
+
+	// 初始化ros节点
+	commonConfig.InitRosConfig()
+
+	// 维护data目录缓存的包数量
+	go commonService.BagCacheClean()
+
+	// 磁盘占用过高时根据缓存策略处理copy目录
+	go commonService.DiskClean()
 	slaveConfig.InitTcpListener()
-	config.InitKillSignalListener(config.CloudConfig.Hosts[1].Ip)
+	commonConfig.InitKillSignalListener(commonConfig.CloudConfig.Hosts[1].Ip)
 	// 等待重启,接收到重启信号,会把信号分发给以下channel
 	go commonService.WaitKillSelf()
 }
@@ -24,13 +44,13 @@ func init() {
 func main() {
 
 	// 1 负责打包数据到data目录
-	go commonService.BagRecord(config.CloudConfig.Hosts[1].Name)
+	go commonService.BagRecord(commonConfig.CloudConfig.Hosts[1].Name)
 	// 2 负责监控故障,并修改timeWindow
 	go slaveService.PrepareTimeWindowProducerQueue()
 	// 3
 	go slaveService.RunTimeWindowProducerQueue()
 	// 4 排队运行时间窗口
-	go commonService.RunTimeWindowConsumerQueue(config.CloudConfig.Hosts[1].Name)
+	go commonService.RunTimeWindowConsumerQueue(commonConfig.CloudConfig.Hosts[1].Name)
 
 	// 阻塞主线程,等待其他线程执行。
 	select {}

+ 5 - 7
aarch64/pji/common/config/c_ros.go

@@ -15,20 +15,18 @@ var (
 
 func InitRosConfig() {
 	var err error
+	// 1
 	c_log.GlobalLogger.Info("初始化RosNode - 开始")
 	for {
 		time.Sleep(time.Duration(2) * time.Second)
-		c_log.GlobalLogger.Error("初始化RosNode - 进行中:", err)
-		if RosNode, err = goroslib.NewNode(goroslib.NodeConf{
-			Name:          "node" + util.GetNowTimeCustom(),
-			MasterAddress: CloudConfig.Ros.MasterAddress,
-		}); err != nil {
+		if RosNode, err = goroslib.NewNode(goroslib.NodeConf{Name: "node" + util.GetNowTimeCustom(), MasterAddress: CloudConfig.Ros.MasterAddress}); err != nil {
+			c_log.GlobalLogger.Info("初始化RosNode - 进行中:", err)
 			continue
 		}
-		c_log.GlobalLogger.Info("初始化RosNode - 成功:", CloudConfig.Ros.MasterAddress)
 		break
 	}
-	// 获取 rosbag 命令路径和环境变量
+	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

+ 0 - 4
aarch64/pji/master/package/service/produce_window.go

@@ -28,10 +28,6 @@ func PrepareTimeWindowProducerQueue() {
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *std_msgs.UInt8) {
-					if len(masterConfig.RuleOfObstacleDetection) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()

+ 11 - 10
aarch64/pjisuv/common/config/c_ros.go

@@ -4,7 +4,7 @@ import (
 	"cicv-data-closedloop/common/config/c_log"
 	"cicv-data-closedloop/common/util"
 	"github.com/bluenviron/goroslib/v2"
-	"os"
+	"time"
 )
 
 var (
@@ -14,18 +14,19 @@ var (
 )
 
 func InitRosConfig() {
-	c_log.GlobalLogger.Info("初始化RosNode - 开始")
 	var err error
-	RosNode, err = goroslib.NewNode(goroslib.NodeConf{
-		Name:          "node" + util.GetNowTimeCustom(),
-		MasterAddress: CloudConfig.Ros.MasterAddress,
-	})
-	if err != nil {
-		c_log.GlobalLogger.Error("初始化RosNode - 失败:", err)
-		os.Exit(-1)
+	// 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)
-	// 获取 rosbag 命令路径和环境变量
+	// 2 获取 rosbag 命令路径和环境变量
 	for _, host := range CloudConfig.Hosts {
 		if host.Name == LocalConfig.Node.Name {
 			RosbagPath = host.Rosbag.Path

+ 0 - 33
aarch64/pjisuv/common/init/common_init.go

@@ -1,33 +0,0 @@
-package init
-
-import (
-	"cicv-data-closedloop/aarch64/pjisuv/common/config"
-	"cicv-data-closedloop/aarch64/pjisuv/common/service"
-)
-
-func Init() {
-
-	// 初始化本地配置文件(第1处配置,在本地文件)
-	config.InitLocalConfig()
-
-	// 初始化Oss连接信息
-	config.InitOssConfig()
-
-	// 初始化业务逻辑配置信息,配置文件在oss上(第2处配置,在oss文件)
-	config.InitCloudConfig()
-
-	go config.RefreshCloudConfig()
-
-	// 初始化数据闭环平台的配置(第3处配置,在数据闭环平台接口)
-	config.InitPlatformConfig()
-
-	// 初始化ros节点
-	config.InitRosConfig()
-
-	// 维护data目录缓存的包数量
-	go service.BagCacheClean()
-
-	// 磁盘占用过高时根据缓存策略处理copy目录
-	go service.DiskClean()
-
-}

+ 22 - 2
aarch64/pjisuv/master/main/master.go

@@ -2,7 +2,6 @@ package main
 
 import (
 	commonConfig "cicv-data-closedloop/aarch64/pjisuv/common/config"
-	commonInit "cicv-data-closedloop/aarch64/pjisuv/common/init"
 	commonService "cicv-data-closedloop/aarch64/pjisuv/common/service"
 	masterConfig "cicv-data-closedloop/aarch64/pjisuv/master/package/config"
 	masterService "cicv-data-closedloop/aarch64/pjisuv/master/package/service"
@@ -13,7 +12,28 @@ func init() {
 	// 初始化日志配置
 	//runtime.GOMAXPROCS(1)
 	c_log.InitLog("/mnt/media/sda1/cicv-data-closedloop/log/", "pjisuv-master")
-	commonInit.Init()
+	// 初始化本地配置文件(第1处配置,在本地文件)
+	commonConfig.InitLocalConfig()
+
+	// 初始化Oss连接信息
+	commonConfig.InitOssConfig()
+
+	// 初始化业务逻辑配置信息,配置文件在oss上(第2处配置,在oss文件)
+	commonConfig.InitCloudConfig()
+
+	go commonConfig.RefreshCloudConfig()
+
+	// 初始化数据闭环平台的配置(第3处配置,在数据闭环平台接口)
+	commonConfig.InitPlatformConfig()
+
+	// 初始化ros节点
+	commonConfig.InitRosConfig()
+
+	// 维护data目录缓存的包数量
+	go commonService.BagCacheClean()
+
+	// 磁盘占用过高时根据缓存策略处理copy目录
+	go commonService.DiskClean()
 	// 初始化加载触发器插件文件
 	masterConfig.InitTriggerConfig()
 	// 初始化rpc监听

+ 101 - 1
aarch64/pjisuv/master/package/config/master_trigger_config.go

@@ -8,6 +8,7 @@ import (
 	"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"
 	"github.com/bluenviron/goroslib/v2/pkg/msgs/tf2_msgs"
 	"github.com/bluenviron/goroslib/v2/pkg/msgs/visualization_msgs"
 	"plugin"
@@ -154,6 +155,42 @@ var (
 	RuleOfUngroundCloudpoints  []func(data *sensor_msgs.PointCloud2) string
 
 	//35
+	TopicOfCameraImage = "/camera_image"
+	RuleOfCameraImage  []func(data *sensor_msgs.Image) string
+
+	//36
+	TopicOfCameraObstacles = "/camera_obstacles"
+	RuleOfCameraObstacles  []func(data *pjisuv_msgs.CameraObjectList) string
+
+	//37
+	TopicOfCamRes = "/cam_res"
+	RuleOfCamRes  []func(data *sensor_msgs.Image) string
+
+	//38
+	TopicOfCamObjects = "/camera_obstacles"
+	RuleOfCamObjects  []func(data *pjisuv_msgs.CameraObjectList) string
+
+	//39
+	TopicOfTftrafficlight = "/tftrafficlight"
+	RuleOfTftrafficlight  []func(data *pjisuv_msgs.TrafficLightDetection) string
+
+	//40
+	TopicOfStationStatus = "/station_status"
+	RuleOfStationStatus  []func(data *std_msgs.Bool) string
+
+	//41
+	TopicOfDestinationPose = "/destination_pose"
+	RuleOfDestinationPose  []func(data *visualization_msgs.MarkerArray) string
+
+	//42
+	TopicOfMapDisplay = "/map_display"
+	RuleOfMapDisplay  []func(data *nav_msgs.Path) string
+
+	//43
+	TopicOfRoutingRviz = "/routing_rviz"
+	RuleOfRoutingRviz  []func(data *nav_msgs.Path) string
+
+	//44
 	TopicOfDataRead = "/data_read"
 	RuleOfDataRead  []func(data *pjisuv_msgs.Retrieval) string
 
@@ -438,7 +475,70 @@ func InitTriggerConfig() {
 				continue
 			}
 			RuleOfUngroundCloudpoints = append(RuleOfUngroundCloudpoints, f)
-		} else if TopicOfDataRead == topic2 { //34
+		} else if TopicOfCameraImage == topic2 { //35
+			f, ok := rule.(func(data *sensor_msgs.Image) string)
+			if ok != true {
+				c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *sensor_msgs.Image) string):", err)
+				continue
+			}
+			RuleOfCameraImage = append(RuleOfCameraImage, f)
+		} else if TopicOfCameraObstacles == topic2 { //36
+			f, ok := rule.(func(data *pjisuv_msgs.CameraObjectList) string)
+			if ok != true {
+				c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.CameraObjectList) string):", err)
+				continue
+			}
+			RuleOfCameraObstacles = append(RuleOfCameraObstacles, f)
+		} else if TopicOfCamRes == topic2 { //37
+			f, ok := rule.(func(data *sensor_msgs.Image) string)
+			if ok != true {
+				c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *sensor_msgs.Image) string):", err)
+				continue
+			}
+			RuleOfCamRes = append(RuleOfCamRes, f)
+		} else if TopicOfCamObjects == topic2 { //38
+			f, ok := rule.(func(data *pjisuv_msgs.CameraObjectList) string)
+			if ok != true {
+				c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.CameraObjectList) string):", err)
+				continue
+			}
+			RuleOfCamObjects = append(RuleOfCamObjects, f)
+		} else if TopicOfTftrafficlight == topic2 { //39
+			f, ok := rule.(func(data *pjisuv_msgs.TrafficLightDetection) string)
+			if ok != true {
+				c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.TrafficLightDetection) string):", err)
+				continue
+			}
+			RuleOfTftrafficlight = append(RuleOfTftrafficlight, f)
+		} else if TopicOfStationStatus == topic2 { //40
+			f, ok := rule.(func(data *std_msgs.Bool) string)
+			if ok != true {
+				c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *std_msgs.Bool) string):", err)
+				continue
+			}
+			RuleOfStationStatus = append(RuleOfStationStatus, f)
+		} else if TopicOfDestinationPose == topic2 { //41
+			f, ok := rule.(func(data *visualization_msgs.MarkerArray) string)
+			if ok != true {
+				c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *visualization_msgs.MarkerArray) string):", err)
+				continue
+			}
+			RuleOfDestinationPose = append(RuleOfDestinationPose, f)
+		} else if TopicOfMapDisplay == topic2 { //42
+			f, ok := rule.(func(data *nav_msgs.Path) string)
+			if ok != true {
+				c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *nav_msgs.Path) string):", err)
+				continue
+			}
+			RuleOfMapDisplay = append(RuleOfMapDisplay, f)
+		} else if TopicOfRoutingRviz == topic2 { //43
+			f, ok := rule.(func(data *nav_msgs.Path) string)
+			if ok != true {
+				c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *nav_msgs.Path) string):", err)
+				continue
+			}
+			RuleOfRoutingRviz = append(RuleOfRoutingRviz, f)
+		} else if TopicOfDataRead == topic2 { //44
 			f, ok := rule.(func(data *pjisuv_msgs.Retrieval) string)
 			if ok != true {
 				c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.Retrieval) string):", err)

+ 236 - 140
aarch64/pjisuv/master/package/service/produce_window.go

@@ -12,6 +12,7 @@ import (
 	"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"
 	"github.com/bluenviron/goroslib/v2/pkg/msgs/tf2_msgs"
 	"github.com/bluenviron/goroslib/v2/pkg/msgs/visualization_msgs"
 	"sync"
@@ -43,10 +44,6 @@ func PrepareTimeWindowProducerQueue() {
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *visualization_msgs.MarkerArray) {
-					if len(masterConfig.TopicOfAmrPose) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()
@@ -74,10 +71,6 @@ func PrepareTimeWindowProducerQueue() {
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *pjisuv_msgs.BoundingBoxArray) {
-					if len(masterConfig.TopicOfBoundingBoxesFast) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()
@@ -105,10 +98,6 @@ func PrepareTimeWindowProducerQueue() {
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *pjisuv_msgs.FaultVec) {
-					if len(masterConfig.TopicOfCameraFault) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()
@@ -136,10 +125,6 @@ func PrepareTimeWindowProducerQueue() {
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *pjisuv_msgs.Frame) {
-					if len(masterConfig.TopicOfCanData) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()
@@ -167,10 +152,6 @@ func PrepareTimeWindowProducerQueue() {
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *sensor_msgs.PointCloud2) {
-					if len(masterConfig.TopicOfCh128x1LslidarPointCloud) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()
@@ -198,10 +179,6 @@ func PrepareTimeWindowProducerQueue() {
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *sensor_msgs.PointCloud2) {
-					if len(masterConfig.TopicOfCh64wLLslidarPointCloud) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()
@@ -229,10 +206,6 @@ func PrepareTimeWindowProducerQueue() {
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *sensor_msgs.LaserScan) {
-					if len(masterConfig.TopicOfCh64wLScan) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()
@@ -260,10 +233,6 @@ func PrepareTimeWindowProducerQueue() {
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *sensor_msgs.PointCloud2) {
-					if len(masterConfig.TopicOfCh64wRLslidarPointCloud) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()
@@ -291,10 +260,6 @@ func PrepareTimeWindowProducerQueue() {
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *sensor_msgs.LaserScan) {
-					if len(masterConfig.TopicOfCh64wRScan) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()
@@ -322,10 +287,6 @@ func PrepareTimeWindowProducerQueue() {
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *pjisuv_msgs.PerceptionCicvMovingObjects) {
-					if len(masterConfig.TopicOfCicvLidarclusterMovingObjects) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()
@@ -353,10 +314,6 @@ func PrepareTimeWindowProducerQueue() {
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *pjisuv_msgs.Trajectory) {
-					if len(masterConfig.TopicOfCicvAmrTrajectory) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()
@@ -391,10 +348,6 @@ func PrepareTimeWindowProducerQueue() {
 					yaw = data.Yaw
 					m.RUnlock()
 
-					if len(masterConfig.TopicOfCicvLocation) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()
@@ -421,10 +374,6 @@ func PrepareTimeWindowProducerQueue() {
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *pjisuv_msgs.AutowareCloudClusterArray) {
-					if len(masterConfig.TopicOfCloudClusters) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()
@@ -452,10 +401,6 @@ func PrepareTimeWindowProducerQueue() {
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *pjisuv_msgs.HeartBeatInfo) {
-					if len(masterConfig.TopicOfHeartbeatInfo) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()
@@ -483,10 +428,6 @@ func PrepareTimeWindowProducerQueue() {
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *geometry_msgs.Vector3Stamped) {
-					if len(masterConfig.TopicOfLidarPretreatmentCost) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()
@@ -514,10 +455,6 @@ func PrepareTimeWindowProducerQueue() {
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *nav_msgs.Odometry) {
-					if len(masterConfig.TopicOfLidarPretreatmentOdometry) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()
@@ -545,10 +482,6 @@ func PrepareTimeWindowProducerQueue() {
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *geometry_msgs.PolygonStamped) {
-					if len(masterConfig.TopicOfLidarRoi) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()
@@ -576,10 +509,6 @@ func PrepareTimeWindowProducerQueue() {
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *nav_msgs.Path) {
-					if len(masterConfig.TopicOfLine1) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()
@@ -607,10 +536,6 @@ func PrepareTimeWindowProducerQueue() {
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *nav_msgs.Path) {
-					if len(masterConfig.TopicOfLine2) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()
@@ -638,10 +563,6 @@ func PrepareTimeWindowProducerQueue() {
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *pjisuv_msgs.PolygonStamped) {
-					if len(masterConfig.TopicOfMapPolygon) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()
@@ -669,10 +590,6 @@ func PrepareTimeWindowProducerQueue() {
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *visualization_msgs.MarkerArray) {
-					if len(masterConfig.TopicOfObstacleDisplay) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()
@@ -700,10 +617,6 @@ func PrepareTimeWindowProducerQueue() {
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *pjisuv_msgs.CommonVehicleCmd) {
-					if len(masterConfig.TopicOfPjControlPub) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()
@@ -731,10 +644,6 @@ func PrepareTimeWindowProducerQueue() {
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *sensor_msgs.PointCloud2) {
-					if len(masterConfig.TopicOfPointsCluster) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()
@@ -762,10 +671,6 @@ func PrepareTimeWindowProducerQueue() {
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *sensor_msgs.PointCloud2) {
-					if len(masterConfig.TopicOfPointsConcat) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()
@@ -793,10 +698,6 @@ func PrepareTimeWindowProducerQueue() {
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *nav_msgs.Path) {
-					if len(masterConfig.TopicOfReferenceDisplay) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()
@@ -824,10 +725,6 @@ func PrepareTimeWindowProducerQueue() {
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *pjisuv_msgs.Trajectory) {
-					if len(masterConfig.TopicOfReferenceTrajectory) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()
@@ -855,10 +752,6 @@ func PrepareTimeWindowProducerQueue() {
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *sensor_msgs.PointCloud2) {
-					if len(masterConfig.TopicOfRoiPoints) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()
@@ -886,10 +779,6 @@ func PrepareTimeWindowProducerQueue() {
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *nav_msgs.Path) {
-					if len(masterConfig.TopicOfRoiPolygon) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()
@@ -917,10 +806,6 @@ func PrepareTimeWindowProducerQueue() {
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *tf2_msgs.TFMessage) {
-					if len(masterConfig.TopicOfTf) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()
@@ -948,10 +833,6 @@ func PrepareTimeWindowProducerQueue() {
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *pjisuv_msgs.PerceptionObjects) {
-					if len(masterConfig.TopicOfTpperception) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()
@@ -978,10 +859,6 @@ func PrepareTimeWindowProducerQueue() {
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *visualization_msgs.MarkerArray) {
-					if len(masterConfig.TopicOfTpperceptionVis) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()
@@ -1009,10 +886,6 @@ func PrepareTimeWindowProducerQueue() {
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *pjisuv_msgs.RoutePlan) {
-					if len(masterConfig.TopicOfTprouteplan) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()
@@ -1040,10 +913,6 @@ func PrepareTimeWindowProducerQueue() {
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *nav_msgs.Path) {
-					if len(masterConfig.TopicOfTrajectoryDisplay) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()
@@ -1071,10 +940,6 @@ func PrepareTimeWindowProducerQueue() {
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *sensor_msgs.PointCloud2) {
-					if len(masterConfig.TopicOfUngroundCloudpoints) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()
@@ -1097,15 +962,246 @@ func PrepareTimeWindowProducerQueue() {
 		}
 
 		// 35
+		if topic == masterConfig.TopicOfCameraImage && len(masterConfig.RuleOfCameraImage) > 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() > 1 {
+						subscribersMutexes[i].Lock()
+						faultHappenTime := util.GetNowTimeCustom()   // 获取当前故障发生时间
+						lastTimeWindow := entity.GetLastTimeWindow() // 获取最后一个时间窗口
+						var faultLabel string
+						for _, f := range masterConfig.RuleOfCameraImage {
+							faultLabel = f(data)
+							if faultLabel != "" {
+								saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+								subscribersTimes[i] = time.Now()
+								break
+							}
+						}
+						subscribersMutexes[i].Unlock()
+					}
+					subscribersTimeMutexes[i].Unlock()
+				},
+			})
+		}
+		// 36
+		if topic == masterConfig.TopicOfCameraObstacles && len(masterConfig.RuleOfCameraObstacles) > 0 {
+			subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+				Node:  commonConfig.RosNode,
+				Topic: topic,
+				Callback: func(data *pjisuv_msgs.CameraObjectList) {
+					subscribersTimeMutexes[i].Lock()
+					if time.Since(subscribersTimes[i]).Seconds() > 1 {
+						subscribersMutexes[i].Lock()
+						faultHappenTime := util.GetNowTimeCustom()   // 获取当前故障发生时间
+						lastTimeWindow := entity.GetLastTimeWindow() // 获取最后一个时间窗口
+						var faultLabel string
+						for _, f := range masterConfig.RuleOfCameraObstacles {
+							faultLabel = f(data)
+							if faultLabel != "" {
+								saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+								subscribersTimes[i] = time.Now()
+								break
+							}
+						}
+						subscribersMutexes[i].Unlock()
+					}
+					subscribersTimeMutexes[i].Unlock()
+				},
+			})
+		}
+		// 37
+		if topic == masterConfig.TopicOfCamRes && len(masterConfig.RuleOfCamRes) > 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() > 1 {
+						subscribersMutexes[i].Lock()
+						faultHappenTime := util.GetNowTimeCustom()   // 获取当前故障发生时间
+						lastTimeWindow := entity.GetLastTimeWindow() // 获取最后一个时间窗口
+						var faultLabel string
+						for _, f := range masterConfig.RuleOfCamRes {
+							faultLabel = f(data)
+							if faultLabel != "" {
+								saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+								subscribersTimes[i] = time.Now()
+								break
+							}
+						}
+						subscribersMutexes[i].Unlock()
+					}
+					subscribersTimeMutexes[i].Unlock()
+				},
+			})
+		}
+		// 38
+		if topic == masterConfig.TopicOfCamObjects && len(masterConfig.RuleOfCamObjects) > 0 {
+			subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+				Node:  commonConfig.RosNode,
+				Topic: topic,
+				Callback: func(data *pjisuv_msgs.CameraObjectList) {
+					subscribersTimeMutexes[i].Lock()
+					if time.Since(subscribersTimes[i]).Seconds() > 1 {
+						subscribersMutexes[i].Lock()
+						faultHappenTime := util.GetNowTimeCustom()   // 获取当前故障发生时间
+						lastTimeWindow := entity.GetLastTimeWindow() // 获取最后一个时间窗口
+						var faultLabel string
+						for _, f := range masterConfig.RuleOfCamObjects {
+							faultLabel = f(data)
+							if faultLabel != "" {
+								saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+								subscribersTimes[i] = time.Now()
+								break
+							}
+						}
+						subscribersMutexes[i].Unlock()
+					}
+					subscribersTimeMutexes[i].Unlock()
+				},
+			})
+		}
+		// 39
+		if topic == masterConfig.TopicOfTftrafficlight && len(masterConfig.RuleOfTftrafficlight) > 0 {
+			subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
+				Node:  commonConfig.RosNode,
+				Topic: topic,
+				Callback: func(data *pjisuv_msgs.TrafficLightDetection) {
+					subscribersTimeMutexes[i].Lock()
+					if time.Since(subscribersTimes[i]).Seconds() > 1 {
+						subscribersMutexes[i].Lock()
+						faultHappenTime := util.GetNowTimeCustom()   // 获取当前故障发生时间
+						lastTimeWindow := entity.GetLastTimeWindow() // 获取最后一个时间窗口
+						var faultLabel string
+						for _, f := range masterConfig.RuleOfTftrafficlight {
+							faultLabel = f(data)
+							if faultLabel != "" {
+								saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+								subscribersTimes[i] = time.Now()
+								break
+							}
+						}
+						subscribersMutexes[i].Unlock()
+					}
+					subscribersTimeMutexes[i].Unlock()
+				},
+			})
+		}
+		// 40
+		if topic == masterConfig.TopicOfStationStatus && len(masterConfig.RuleOfStationStatus) > 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() > 1 {
+						subscribersMutexes[i].Lock()
+						faultHappenTime := util.GetNowTimeCustom()   // 获取当前故障发生时间
+						lastTimeWindow := entity.GetLastTimeWindow() // 获取最后一个时间窗口
+						var faultLabel string
+						for _, f := range masterConfig.RuleOfStationStatus {
+							faultLabel = f(data)
+							if faultLabel != "" {
+								saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+								subscribersTimes[i] = time.Now()
+								break
+							}
+						}
+						subscribersMutexes[i].Unlock()
+					}
+					subscribersTimeMutexes[i].Unlock()
+				},
+			})
+		}
+		// 41
+		if topic == masterConfig.TopicOfDestinationPose && len(masterConfig.RuleOfDestinationPose) > 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() > 1 {
+						subscribersMutexes[i].Lock()
+						faultHappenTime := util.GetNowTimeCustom()   // 获取当前故障发生时间
+						lastTimeWindow := entity.GetLastTimeWindow() // 获取最后一个时间窗口
+						var faultLabel string
+						for _, f := range masterConfig.RuleOfDestinationPose {
+							faultLabel = f(data)
+							if faultLabel != "" {
+								saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+								subscribersTimes[i] = time.Now()
+								break
+							}
+						}
+						subscribersMutexes[i].Unlock()
+					}
+					subscribersTimeMutexes[i].Unlock()
+				},
+			})
+		}
+		// 42
+		if topic == masterConfig.TopicOfMapDisplay && len(masterConfig.RuleOfMapDisplay) > 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() > 1 {
+						subscribersMutexes[i].Lock()
+						faultHappenTime := util.GetNowTimeCustom()   // 获取当前故障发生时间
+						lastTimeWindow := entity.GetLastTimeWindow() // 获取最后一个时间窗口
+						var faultLabel string
+						for _, f := range masterConfig.RuleOfMapDisplay {
+							faultLabel = f(data)
+							if faultLabel != "" {
+								saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+								subscribersTimes[i] = time.Now()
+								break
+							}
+						}
+						subscribersMutexes[i].Unlock()
+					}
+					subscribersTimeMutexes[i].Unlock()
+				},
+			})
+		}
+		// 43
+		if topic == masterConfig.TopicOfRoutingRviz && len(masterConfig.RuleOfRoutingRviz) > 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() > 1 {
+						subscribersMutexes[i].Lock()
+						faultHappenTime := util.GetNowTimeCustom()   // 获取当前故障发生时间
+						lastTimeWindow := entity.GetLastTimeWindow() // 获取最后一个时间窗口
+						var faultLabel string
+						for _, f := range masterConfig.RuleOfRoutingRviz {
+							faultLabel = f(data)
+							if faultLabel != "" {
+								saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+								subscribersTimes[i] = time.Now()
+								break
+							}
+						}
+						subscribersMutexes[i].Unlock()
+					}
+					subscribersTimeMutexes[i].Unlock()
+				},
+			})
+		}
+
+		// 44
 		if topic == masterConfig.TopicOfDataRead && len(masterConfig.RuleOfDataRead) > 0 {
 			subscribers[i], err = goroslib.NewSubscriber(goroslib.SubscriberConf{
 				Node:  commonConfig.RosNode,
 				Topic: topic,
 				Callback: func(data *pjisuv_msgs.Retrieval) {
-					if len(masterConfig.TopicOfDataRead) == 0 {
-						c_log.GlobalLogger.Infof("话题 %v 没有触发器", topic)
-						return
-					}
 					subscribersTimeMutexes[i].Lock()
 					if time.Since(subscribersTimes[i]).Seconds() > 1 {
 						subscribersMutexes[i].Lock()

+ 22 - 2
aarch64/pjisuv/slave/main/slave.go

@@ -2,7 +2,6 @@ package main
 
 import (
 	commonConfig "cicv-data-closedloop/aarch64/pjisuv/common/config"
-	commonInit "cicv-data-closedloop/aarch64/pjisuv/common/init"
 	commonService "cicv-data-closedloop/aarch64/pjisuv/common/service"
 	slaveConfig "cicv-data-closedloop/aarch64/pjisuv/slave/package/config"
 	slaveService "cicv-data-closedloop/aarch64/pjisuv/slave/package/service"
@@ -13,7 +12,28 @@ import (
 func init() {
 	//runtime.GOMAXPROCS(1)
 	c_log.InitLog("/mnt/media/sda1/cicv-data-closedloop/log/", "pjisuv-slave")
-	commonInit.Init()
+	// 初始化本地配置文件(第1处配置,在本地文件)
+	commonConfig.InitLocalConfig()
+
+	// 初始化Oss连接信息
+	commonConfig.InitOssConfig()
+
+	// 初始化业务逻辑配置信息,配置文件在oss上(第2处配置,在oss文件)
+	commonConfig.InitCloudConfig()
+
+	go commonConfig.RefreshCloudConfig()
+
+	// 初始化数据闭环平台的配置(第3处配置,在数据闭环平台接口)
+	commonConfig.InitPlatformConfig()
+
+	// 初始化ros节点
+	commonConfig.InitRosConfig()
+
+	// 维护data目录缓存的包数量
+	go commonService.BagCacheClean()
+
+	// 磁盘占用过高时根据缓存策略处理copy目录
+	go commonService.DiskClean()
 	slaveConfig.InitTcpListener()
 	commonConfig.InitKillSignalListener(commonConfig.CloudConfig.Hosts[1].Ip)
 	// 等待重启,接收到重启信号,会把信号分发给以下channel

+ 2 - 1
common/domain/d_service.go

@@ -36,9 +36,10 @@ func SupplyCopyBags(bagDataDir string, bagCopyDir string, currentTimeWindow enti
 	time.Sleep(time.Duration(gap) * time.Second)
 	// 获取data目录下的包列表
 	dataBags, _ := util.ListAbsolutePathWithSuffixAndSort(bagDataDir, ".bag")
-	c_log.GlobalLogger.Info("故障 ", currentTimeWindow.FaultTime, "需要补充 ", gap, " 个 bag 包")
+	c_log.GlobalLogger.Info("故障 ", currentTimeWindow.FaultTime, "需要从data目录找回 ", gap, " 个 bag 包")
 	for _, bag := range dataBags {
 		bagTime := util.GetBagTime(bag)
+		// 必须在区间内
 		if util.TimeCustom1GreaterEqualThanTimeCustom2(bagTime, currentTimeWindow.FaultTime) {
 			MoveFromDataToCopy(currentTimeWindow.FaultTime, bagDataDir, bag, bagCopyDir)
 			gap = gap - 1