Forráskód Böngészése

Merge remote-tracking branch 'origin/master'

zwh 9 hónapja
szülő
commit
a46d98cd07

+ 4 - 1
README.md

@@ -36,4 +36,7 @@ oss-browser预设oss路径:oss://open-bucket
 oss-browser区域:华北2(北京)
 keyid:n8glvFGS25MrLY7j
 secret:xZ2Fozoarpfw0z28FUhtg8cu0yDc5d
-```
+```
+
+
+# 室外机器人

+ 17 - 27
aarch64/pjibot_delivery/common/service/rosbag_record.go

@@ -15,6 +15,7 @@ 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 {
@@ -78,37 +79,26 @@ func BagRecord(nodeName string) {
 		}
 		// 等待自杀信号
 		c_log.GlobalLogger.Info("启动record命令成功。等待自杀信号。")
-		select {
-		case signal := <-ChannelKillRosRecord:
-			if signal == 1 {
-				if err := util.KillProcessByPid(recordSubProcessPid); err != nil {
-					c_log.GlobalLogger.Errorf("程序阻塞,杀死record命令子进程出错,【pid】=%v,【err】=%v。", recordSubProcessPid, err)
-					select {} // 此处阻塞防止record命令一直录包占满存储
+		for {
+			select {
+			case signal := <-ChannelKillRosRecord:
+				if signal == 1 {
+					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命令一直录包占满存储
+					}
+					AddKillTimes("1")
+					continue
 				}
-				if err = cmd.Process.Kill(); err != nil {
-					c_log.GlobalLogger.Error("程序阻塞,杀死record命令进程", recordProcessPid, "出错:", err)
-					select {} // 此处阻塞防止record命令一直录包占满存储
+				if signal == 2 {
+					goto startRecord // 收到信号 2 重新 record 命令
 				}
-				AddKillTimes("1")
-				return
 			}
 		}
-
-		// TODO 暂时不放开该逻辑。如果监控rosnode来判断是否杀死record,太麻烦,生成窗口的线程也需要关闭
-		//{
-		//	commonCfg.GlobalLogger.Info("正在监控rosnode是否全部关闭。")
-		//	for canRecord {
-		//		time.Sleep(time.Duration(1) * time.Second)
-		//		canRecord = isCanRecord(commonCfg.RosNode)
-		//	}
-		//	commonCfg.GlobalLogger.Info("rosnode已全部关闭,正在结束record进程。")
-		//
-		//	err = cmd.Process.Kill()
-		//	if err != nil {
-		//		commonCfg.GlobalLogger.Error("杀死record进程错误:", err)
-		//		continue
-		//	}
-		//}
 	}
 }
 

+ 5 - 2
aarch64/pjibot_delivery/common/service/rosbag_upload.go

@@ -77,7 +77,7 @@ outLoop:
 					continue
 				}
 				// 删除旧文件
-				util.DeleteFile(oldName)
+				_ = util.DeleteFile(oldName)
 				// 将新文件改回旧文件名
 				if err = os.Rename(newName, oldName); err != nil {
 					c_log.GlobalLogger.Info("修改文件名", oldName, "失败,放弃当前时间窗口", currentTimeWindow.FaultTime, ",错误为:", err)
@@ -154,6 +154,9 @@ outLoop:
 		if err = util.RemoveDir(dir); err != nil {
 			continue outLoop
 		}
-
+		if len(entity.TimeWindowConsumerQueue) == 0 {
+			c_log.GlobalLogger.Infof("已处理所有窗口,重启 record 命令。")
+			ChannelKillRosRecord <- 2
+		}
 	}
 }

+ 3 - 0
aarch64/pjibot_delivery/master/package/service/move_bag_and_send_window.go

@@ -33,6 +33,9 @@ func RunTimeWindowProducerQueue() {
 		// 处理
 		time.Sleep(time.Duration(1) * time.Second)
 		if len(entity.TimeWindowProducerQueue) > 0 {
+			// 如果有可处理的,先把record命令杀掉
+			commonService.ChannelKillRosRecord <- 1
+			// 处理
 			bags, _ := util.ListAbsolutePathWithSuffixAndSort(commonConfig.CloudConfig.BagDataDir, ".bag")
 			currentTimeWindow := entity.TimeWindowProducerQueue[0]
 			move := false

+ 20 - 18
aarch64/pjibot_delivery/master/package/service/produce_window.go

@@ -20,6 +20,8 @@ import (
 	"time"
 )
 
+var triggerInterval = 3.0 // 每个触发器3秒触发一次
+
 // PrepareTimeWindowProducerQueue 负责监听所有主题并修改时间窗口
 func PrepareTimeWindowProducerQueue() {
 
@@ -38,7 +40,7 @@ func PrepareTimeWindowProducerQueue() {
 					Topic: topic,
 					Callback: func(data *diagnostic_msgs.DiagnosticArray) {
 						subscribersTimeMutexes[i].Lock()
-						if time.Since(subscribersTimes[i]).Seconds() > 1 {
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
 							subscribersMutexes[i].Lock()
 							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
 							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
@@ -46,10 +48,10 @@ func PrepareTimeWindowProducerQueue() {
 							for _, f := range masterConfig.RuleOfDiagnostics {
 								faultLabel = f(data)
 								if faultLabel != "" {
+									subscribersTimes[i] = time.Now()
 									if canCollect() {
 										c_log.GlobalLogger.Errorf("触发事件【%v】,开始采集。", faultLabel)
 										saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
-										subscribersTimes[i] = time.Now()
 										break
 									} else {
 										c_log.GlobalLogger.Errorf("触发事件【%v】,但当前周期内采集数量已超限额,不再采集。", faultLabel)
@@ -72,7 +74,7 @@ func PrepareTimeWindowProducerQueue() {
 					Topic: topic,
 					Callback: func(data *sensor_msgs.Imu) {
 						subscribersTimeMutexes[i].Lock()
-						if time.Since(subscribersTimes[i]).Seconds() > 1 {
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
 							subscribersMutexes[i].Lock()
 							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
 							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
@@ -80,10 +82,10 @@ func PrepareTimeWindowProducerQueue() {
 							for _, f := range masterConfig.RuleOfImu {
 								faultLabel = f(data)
 								if faultLabel != "" {
+									subscribersTimes[i] = time.Now()
 									if canCollect() {
 										c_log.GlobalLogger.Errorf("触发事件【%v】,开始采集。", faultLabel)
 										saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
-										subscribersTimes[i] = time.Now()
 										break
 									} else {
 										c_log.GlobalLogger.Errorf("触发事件【%v】,但当前周期内采集数量已超限额,不再采集。", faultLabel)
@@ -106,7 +108,7 @@ func PrepareTimeWindowProducerQueue() {
 					Topic: topic,
 					Callback: func(data *pjibot_delivery_msgs.LocateInfo) {
 						subscribersTimeMutexes[i].Lock()
-						if time.Since(subscribersTimes[i]).Seconds() > 1 {
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
 							subscribersMutexes[i].Lock()
 							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
 							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
@@ -114,10 +116,10 @@ func PrepareTimeWindowProducerQueue() {
 							for _, f := range masterConfig.RuleOfLocateInfo {
 								faultLabel = f(data)
 								if faultLabel != "" {
+									subscribersTimes[i] = time.Now()
 									if canCollect() {
 										c_log.GlobalLogger.Errorf("触发事件【%v】,开始采集。", faultLabel)
 										saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
-										subscribersTimes[i] = time.Now()
 										break
 									} else {
 										c_log.GlobalLogger.Errorf("触发事件【%v】,但当前周期内采集数量已超限额,不再采集。", faultLabel)
@@ -140,7 +142,7 @@ func PrepareTimeWindowProducerQueue() {
 					Topic: topic,
 					Callback: func(data *std_msgs.UInt8) {
 						subscribersTimeMutexes[i].Lock()
-						if time.Since(subscribersTimes[i]).Seconds() > 1 {
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
 							subscribersMutexes[i].Lock()
 							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
 							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
@@ -148,10 +150,10 @@ func PrepareTimeWindowProducerQueue() {
 							for _, f := range masterConfig.RuleOfObstacleDetection {
 								faultLabel = f(data)
 								if faultLabel != "" {
+									subscribersTimes[i] = time.Now()
 									if canCollect() {
 										c_log.GlobalLogger.Errorf("触发事件【%v】,开始采集。", faultLabel)
 										saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
-										subscribersTimes[i] = time.Now()
 										break
 									} else {
 										c_log.GlobalLogger.Errorf("触发事件【%v】,但当前周期内采集数量已超限额,不再采集。", faultLabel)
@@ -174,7 +176,7 @@ func PrepareTimeWindowProducerQueue() {
 					Topic: topic,
 					Callback: func(data *nav_msgs.Odometry) {
 						subscribersTimeMutexes[i].Lock()
-						if time.Since(subscribersTimes[i]).Seconds() > 1 {
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
 							subscribersMutexes[i].Lock()
 							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
 							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
@@ -182,10 +184,10 @@ func PrepareTimeWindowProducerQueue() {
 							for _, f := range masterConfig.RuleOfOdom {
 								faultLabel = f(data)
 								if faultLabel != "" {
+									subscribersTimes[i] = time.Now()
 									if canCollect() {
 										c_log.GlobalLogger.Errorf("触发事件【%v】,开始采集。", faultLabel)
 										saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
-										subscribersTimes[i] = time.Now()
 										break
 									} else {
 										c_log.GlobalLogger.Errorf("触发事件【%v】,但当前周期内采集数量已超限额,不再采集。", faultLabel)
@@ -208,7 +210,7 @@ func PrepareTimeWindowProducerQueue() {
 					Topic: topic,
 					Callback: func(data *pjibot_delivery_msgs.SysInfo) {
 						subscribersTimeMutexes[i].Lock()
-						if time.Since(subscribersTimes[i]).Seconds() > 1 {
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
 							subscribersMutexes[i].Lock()
 							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
 							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
@@ -216,10 +218,10 @@ func PrepareTimeWindowProducerQueue() {
 							for _, f := range masterConfig.RuleOfSysInfo {
 								faultLabel = f(data)
 								if faultLabel != "" {
+									subscribersTimes[i] = time.Now()
 									if canCollect() {
 										c_log.GlobalLogger.Errorf("触发事件【%v】,开始采集。", faultLabel)
 										saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
-										subscribersTimes[i] = time.Now()
 										break
 									} else {
 										c_log.GlobalLogger.Errorf("触发事件【%v】,但当前周期内采集数量已超限额,不再采集。", faultLabel)
@@ -242,7 +244,7 @@ func PrepareTimeWindowProducerQueue() {
 					Topic: topic,
 					Callback: func(data *geometry_msgs.PoseStamped) {
 						subscribersTimeMutexes[i].Lock()
-						if time.Since(subscribersTimes[i]).Seconds() > 1 {
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
 							subscribersMutexes[i].Lock()
 							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
 							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
@@ -250,10 +252,10 @@ func PrepareTimeWindowProducerQueue() {
 							for _, f := range masterConfig.RuleOfRobotPose {
 								faultLabel = f(data)
 								if faultLabel != "" {
+									subscribersTimes[i] = time.Now()
 									if canCollect() {
 										c_log.GlobalLogger.Errorf("触发事件【%v】,开始采集。", faultLabel)
 										saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
-										subscribersTimes[i] = time.Now()
 										break
 									} else {
 										c_log.GlobalLogger.Errorf("触发事件【%v】,但当前周期内采集数量已超限额,不再采集。", faultLabel)
@@ -276,7 +278,7 @@ func PrepareTimeWindowProducerQueue() {
 					Topic: topic,
 					Callback: func(data *pjibot_delivery_msgs.TaskFeedbackInfo) {
 						subscribersTimeMutexes[i].Lock()
-						if time.Since(subscribersTimes[i]).Seconds() > 1 {
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
 							subscribersMutexes[i].Lock()
 							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
 							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
@@ -284,10 +286,10 @@ func PrepareTimeWindowProducerQueue() {
 							for _, f := range masterConfig.RuleOfTaskFeedbackInfo {
 								faultLabel = f(data)
 								if faultLabel != "" {
+									subscribersTimes[i] = time.Now()
 									if canCollect() {
 										c_log.GlobalLogger.Errorf("触发事件【%v】,开始采集。", faultLabel)
 										saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
-										subscribersTimes[i] = time.Now()
 										break
 									} else {
 										c_log.GlobalLogger.Errorf("触发事件【%v】,但当前周期内采集数量已超限额,不再采集。", faultLabel)
@@ -310,7 +312,7 @@ func PrepareTimeWindowProducerQueue() {
 					Topic: topic,
 					Callback: func(data *nav_msgs.Odometry) {
 						subscribersTimeMutexes[i].Lock()
-						if time.Since(subscribersTimes[i]).Seconds() > 1 {
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
 							subscribersMutexes[i].Lock()
 							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
 							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
@@ -318,10 +320,10 @@ func PrepareTimeWindowProducerQueue() {
 							for _, f := range masterConfig.RuleOfWheelOdom {
 								faultLabel = f(data)
 								if faultLabel != "" {
+									subscribersTimes[i] = time.Now()
 									if canCollect() {
 										c_log.GlobalLogger.Errorf("触发事件【%v】,开始采集。", faultLabel)
 										saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
-										subscribersTimes[i] = time.Now()
 										break
 									} else {
 										c_log.GlobalLogger.Errorf("触发事件【%v】,但当前周期内采集数量已超限额,不再采集。", faultLabel)

+ 19 - 29
aarch64/pjibot_guide/common/service/rosbag_record.go

@@ -15,6 +15,7 @@ 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 {
@@ -76,39 +77,28 @@ func BagRecord(nodeName string) {
 				}
 			}
 		}
-		// 等待自杀信号
-		c_log.GlobalLogger.Info("启动record命令成功。等待自杀信号。")
-		select {
-		case signal := <-ChannelKillRosRecord:
-			if signal == 1 {
-				if err := util.KillProcessByPid(recordSubProcessPid); err != nil {
-					c_log.GlobalLogger.Errorf("程序阻塞,杀死record命令子进程出错,【pid】=%v,【err】=%v。", recordSubProcessPid, err)
-					select {} // 此处阻塞防止record命令一直录包占满存储
+		// 等待进程关闭信号
+		c_log.GlobalLogger.Info("启动record命令成功。等待进程关闭信号。")
+		for {
+			select {
+			case signal := <-ChannelKillRosRecord:
+				if signal == 1 {
+					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命令一直录包占满存储
+					}
+					AddKillTimes("1")
+					continue // continue 是为了等待重启信号
 				}
-				if err = cmd.Process.Kill(); err != nil {
-					c_log.GlobalLogger.Error("程序阻塞,杀死record命令进程", recordProcessPid, "出错:", err)
-					select {} // 此处阻塞防止record命令一直录包占满存储
+				if signal == 2 {
+					goto startRecord // 收到信号 2 重新 record 命令
 				}
-				AddKillTimes("1")
-				return
 			}
 		}
-
-		// TODO 暂时不放开该逻辑。如果监控rosnode来判断是否杀死record,太麻烦,生成窗口的线程也需要关闭
-		//{
-		//	commonCfg.GlobalLogger.Info("正在监控rosnode是否全部关闭。")
-		//	for canRecord {
-		//		time.Sleep(time.Duration(1) * time.Second)
-		//		canRecord = isCanRecord(commonCfg.RosNode)
-		//	}
-		//	commonCfg.GlobalLogger.Info("rosnode已全部关闭,正在结束record进程。")
-		//
-		//	err = cmd.Process.Kill()
-		//	if err != nil {
-		//		commonCfg.GlobalLogger.Error("杀死record进程错误:", err)
-		//		continue
-		//	}
-		//}
 	}
 }
 

+ 4 - 0
aarch64/pjibot_guide/common/service/rosbag_upload.go

@@ -173,5 +173,9 @@ outLoop:
 		if err = util.RemoveDir(dir); err != nil {
 			continue outLoop
 		}
+		if len(entity.TimeWindowConsumerQueue) == 0 {
+			c_log.GlobalLogger.Infof("已处理所有窗口,重启 record 命令。")
+			ChannelKillRosRecord <- 2
+		}
 	}
 }

+ 3 - 0
aarch64/pjibot_guide/master/package/service/move_bag_and_send_window.go

@@ -33,6 +33,9 @@ func RunTimeWindowProducerQueue() {
 		// 处理
 		time.Sleep(time.Duration(1) * time.Second)
 		if len(entity.TimeWindowProducerQueue) > 0 {
+			// 如果有可处理的,先把record命令杀掉
+			commonService.ChannelKillRosRecord <- 1
+			// 处理
 			bags, _ := util.ListAbsolutePathWithSuffixAndSort(commonConfig.CloudConfig.BagDataDir, ".bag")
 			currentTimeWindow := entity.TimeWindowProducerQueue[0]
 			move := false

+ 7 - 3
aarch64/pjibot_guide/master/package/service/produce_window.go

@@ -15,7 +15,8 @@ import (
 	"time"
 )
 
-// PrepareTimeWindowProducerQueue 负责监听所有主题并修改时间窗口
+var triggerInterval = 3.0 // 每个触发器3秒触发一次
+// 负责监听所有主题并修改时间窗口
 func PrepareTimeWindowProducerQueue() {
 
 	var err error
@@ -32,7 +33,7 @@ func PrepareTimeWindowProducerQueue() {
 					Topic: topic,
 					Callback: func(data *std_msgs.UInt8) {
 						subscribersTimeMutexes[i].Lock()
-						if time.Since(subscribersTimes[i]).Seconds() > 1 {
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
 							subscribersMutexes[i].Lock()
 							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
 							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
@@ -40,10 +41,13 @@ func PrepareTimeWindowProducerQueue() {
 							for _, f := range masterConfig.RuleOfObstacleDetection {
 								faultLabel = f(data)
 								if faultLabel != "" {
+									subscribersTimes[i] = time.Now()
 									if canCollect() {
+										c_log.GlobalLogger.Errorf("触发事件【%v】,开始采集。", faultLabel)
 										saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
-										subscribersTimes[i] = time.Now()
 										break
+									} else {
+										c_log.GlobalLogger.Errorf("触发事件【%v】,但当前周期内采集数量已超限额,不再采集。", faultLabel)
 									}
 								}
 							}

+ 17 - 27
aarch64/pjibot_patrol/common/service/rosbag_record.go

@@ -15,6 +15,7 @@ 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 {
@@ -78,37 +79,26 @@ func BagRecord(nodeName string) {
 		}
 		// 等待自杀信号
 		c_log.GlobalLogger.Info("启动record命令成功。等待自杀信号。")
-		select {
-		case signal := <-ChannelKillRosRecord:
-			if signal == 1 {
-				if err := util.KillProcessByPid(recordSubProcessPid); err != nil {
-					c_log.GlobalLogger.Errorf("程序阻塞,杀死record命令子进程出错,【pid】=%v,【err】=%v。", recordSubProcessPid, err)
-					select {} // 此处阻塞防止record命令一直录包占满存储
+		for {
+			select {
+			case signal := <-ChannelKillRosRecord:
+				if signal == 1 {
+					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命令一直录包占满存储
+					}
+					AddKillTimes("1")
+					continue
 				}
-				if err = cmd.Process.Kill(); err != nil {
-					c_log.GlobalLogger.Error("程序阻塞,杀死record命令进程", recordProcessPid, "出错:", err)
-					select {} // 此处阻塞防止record命令一直录包占满存储
+				if signal == 2 {
+					goto startRecord // 收到信号 2 重新 record 命令
 				}
-				AddKillTimes("1")
-				return
 			}
 		}
-
-		// TODO 暂时不放开该逻辑。如果监控rosnode来判断是否杀死record,太麻烦,生成窗口的线程也需要关闭
-		//{
-		//	commonCfg.GlobalLogger.Info("正在监控rosnode是否全部关闭。")
-		//	for canRecord {
-		//		time.Sleep(time.Duration(1) * time.Second)
-		//		canRecord = isCanRecord(commonCfg.RosNode)
-		//	}
-		//	commonCfg.GlobalLogger.Info("rosnode已全部关闭,正在结束record进程。")
-		//
-		//	err = cmd.Process.Kill()
-		//	if err != nil {
-		//		commonCfg.GlobalLogger.Error("杀死record进程错误:", err)
-		//		continue
-		//	}
-		//}
 	}
 }
 

+ 4 - 0
aarch64/pjibot_patrol/common/service/rosbag_upload.go

@@ -154,6 +154,10 @@ outLoop:
 		if err = util.RemoveDir(dir); err != nil {
 			continue outLoop
 		}
+		if len(entity.TimeWindowConsumerQueue) == 0 {
+			c_log.GlobalLogger.Infof("已处理所有窗口,重启 record 命令。")
+			ChannelKillRosRecord <- 2
+		}
 
 	}
 }

+ 3 - 0
aarch64/pjibot_patrol/master/package/service/move_bag_and_send_window.go

@@ -33,6 +33,9 @@ func RunTimeWindowProducerQueue() {
 		// 处理
 		time.Sleep(time.Duration(1) * time.Second)
 		if len(entity.TimeWindowProducerQueue) > 0 {
+			// 如果有可处理的,先把record命令杀掉
+			commonService.ChannelKillRosRecord <- 1
+			// 处理
 			bags, _ := util.ListAbsolutePathWithSuffixAndSort(commonConfig.CloudConfig.BagDataDir, ".bag")
 			currentTimeWindow := entity.TimeWindowProducerQueue[0]
 			move := false

+ 20 - 19
aarch64/pjibot_patrol/master/package/service/produce_window.go

@@ -20,7 +20,8 @@ import (
 	"time"
 )
 
-// PrepareTimeWindowProducerQueue 负责监听所有主题并修改时间窗口
+var triggerInterval = 3.0 // 每个触发器3秒触发一次
+// 负责监听所有主题并修改时间窗口
 func PrepareTimeWindowProducerQueue() {
 
 	var err error
@@ -38,7 +39,7 @@ func PrepareTimeWindowProducerQueue() {
 					Topic: topic,
 					Callback: func(data *diagnostic_msgs.DiagnosticArray) {
 						subscribersTimeMutexes[i].Lock()
-						if time.Since(subscribersTimes[i]).Seconds() > 1 {
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
 							subscribersMutexes[i].Lock()
 							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
 							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
@@ -46,10 +47,10 @@ func PrepareTimeWindowProducerQueue() {
 							for _, f := range masterConfig.RuleOfDiagnostics {
 								faultLabel = f(data)
 								if faultLabel != "" {
+									subscribersTimes[i] = time.Now()
 									if canCollect() {
 										c_log.GlobalLogger.Errorf("触发事件【%v】,开始采集。", faultLabel)
 										saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
-										subscribersTimes[i] = time.Now()
 										break
 									} else {
 										c_log.GlobalLogger.Errorf("触发事件【%v】,但当前周期内采集数量已超限额,不再采集。", faultLabel)
@@ -72,7 +73,7 @@ func PrepareTimeWindowProducerQueue() {
 					Topic: topic,
 					Callback: func(data *sensor_msgs.Imu) {
 						subscribersTimeMutexes[i].Lock()
-						if time.Since(subscribersTimes[i]).Seconds() > 1 {
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
 							subscribersMutexes[i].Lock()
 							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
 							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
@@ -80,10 +81,10 @@ func PrepareTimeWindowProducerQueue() {
 							for _, f := range masterConfig.RuleOfImu {
 								faultLabel = f(data)
 								if faultLabel != "" {
+									subscribersTimes[i] = time.Now()
 									if canCollect() {
 										c_log.GlobalLogger.Errorf("触发事件【%v】,开始采集。", faultLabel)
 										saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
-										subscribersTimes[i] = time.Now()
 										break
 									} else {
 										c_log.GlobalLogger.Errorf("触发事件【%v】,但当前周期内采集数量已超限额,不再采集。", faultLabel)
@@ -106,7 +107,7 @@ func PrepareTimeWindowProducerQueue() {
 					Topic: topic,
 					Callback: func(data *pjibot_patrol_msgs.LocateInfo) {
 						subscribersTimeMutexes[i].Lock()
-						if time.Since(subscribersTimes[i]).Seconds() > 1 {
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
 							subscribersMutexes[i].Lock()
 							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
 							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
@@ -114,10 +115,10 @@ func PrepareTimeWindowProducerQueue() {
 							for _, f := range masterConfig.RuleOfLocateInfo {
 								faultLabel = f(data)
 								if faultLabel != "" {
+									subscribersTimes[i] = time.Now()
 									if canCollect() {
 										c_log.GlobalLogger.Errorf("触发事件【%v】,开始采集。", faultLabel)
 										saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
-										subscribersTimes[i] = time.Now()
 										break
 									} else {
 										c_log.GlobalLogger.Errorf("触发事件【%v】,但当前周期内采集数量已超限额,不再采集。", faultLabel)
@@ -140,7 +141,7 @@ func PrepareTimeWindowProducerQueue() {
 					Topic: topic,
 					Callback: func(data *std_msgs.UInt8) {
 						subscribersTimeMutexes[i].Lock()
-						if time.Since(subscribersTimes[i]).Seconds() > 1 {
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
 							subscribersMutexes[i].Lock()
 							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
 							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
@@ -148,10 +149,10 @@ func PrepareTimeWindowProducerQueue() {
 							for _, f := range masterConfig.RuleOfObstacleDetection {
 								faultLabel = f(data)
 								if faultLabel != "" {
+									subscribersTimes[i] = time.Now()
 									if canCollect() {
 										c_log.GlobalLogger.Errorf("触发事件【%v】,开始采集。", faultLabel)
 										saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
-										subscribersTimes[i] = time.Now()
 										break
 									} else {
 										c_log.GlobalLogger.Errorf("触发事件【%v】,但当前周期内采集数量已超限额,不再采集。", faultLabel)
@@ -174,7 +175,7 @@ func PrepareTimeWindowProducerQueue() {
 					Topic: topic,
 					Callback: func(data *nav_msgs.Odometry) {
 						subscribersTimeMutexes[i].Lock()
-						if time.Since(subscribersTimes[i]).Seconds() > 1 {
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
 							subscribersMutexes[i].Lock()
 							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
 							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
@@ -182,10 +183,10 @@ func PrepareTimeWindowProducerQueue() {
 							for _, f := range masterConfig.RuleOfOdom {
 								faultLabel = f(data)
 								if faultLabel != "" {
+									subscribersTimes[i] = time.Now()
 									if canCollect() {
 										c_log.GlobalLogger.Errorf("触发事件【%v】,开始采集。", faultLabel)
 										saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
-										subscribersTimes[i] = time.Now()
 										break
 									} else {
 										c_log.GlobalLogger.Errorf("触发事件【%v】,但当前周期内采集数量已超限额,不再采集。", faultLabel)
@@ -208,7 +209,7 @@ func PrepareTimeWindowProducerQueue() {
 					Topic: topic,
 					Callback: func(data *pjibot_patrol_msgs.SysInfo) {
 						subscribersTimeMutexes[i].Lock()
-						if time.Since(subscribersTimes[i]).Seconds() > 1 {
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
 							subscribersMutexes[i].Lock()
 							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
 							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
@@ -216,10 +217,10 @@ func PrepareTimeWindowProducerQueue() {
 							for _, f := range masterConfig.RuleOfSysInfo {
 								faultLabel = f(data)
 								if faultLabel != "" {
+									subscribersTimes[i] = time.Now()
 									if canCollect() {
 										c_log.GlobalLogger.Errorf("触发事件【%v】,开始采集。", faultLabel)
 										saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
-										subscribersTimes[i] = time.Now()
 										break
 									} else {
 										c_log.GlobalLogger.Errorf("触发事件【%v】,但当前周期内采集数量已超限额,不再采集。", faultLabel)
@@ -242,7 +243,7 @@ func PrepareTimeWindowProducerQueue() {
 					Topic: topic,
 					Callback: func(data *geometry_msgs.PoseStamped) {
 						subscribersTimeMutexes[i].Lock()
-						if time.Since(subscribersTimes[i]).Seconds() > 1 {
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
 							subscribersMutexes[i].Lock()
 							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
 							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
@@ -250,10 +251,10 @@ func PrepareTimeWindowProducerQueue() {
 							for _, f := range masterConfig.RuleOfRobotPose {
 								faultLabel = f(data)
 								if faultLabel != "" {
+									subscribersTimes[i] = time.Now()
 									if canCollect() {
 										c_log.GlobalLogger.Errorf("触发事件【%v】,开始采集。", faultLabel)
 										saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
-										subscribersTimes[i] = time.Now()
 										break
 									} else {
 										c_log.GlobalLogger.Errorf("触发事件【%v】,但当前周期内采集数量已超限额,不再采集。", faultLabel)
@@ -276,7 +277,7 @@ func PrepareTimeWindowProducerQueue() {
 					Topic: topic,
 					Callback: func(data *pjibot_patrol_msgs.TaskFeedbackInfo) {
 						subscribersTimeMutexes[i].Lock()
-						if time.Since(subscribersTimes[i]).Seconds() > 1 {
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
 							subscribersMutexes[i].Lock()
 							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
 							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
@@ -284,10 +285,10 @@ func PrepareTimeWindowProducerQueue() {
 							for _, f := range masterConfig.RuleOfTaskFeedbackInfo {
 								faultLabel = f(data)
 								if faultLabel != "" {
+									subscribersTimes[i] = time.Now()
 									if canCollect() {
 										c_log.GlobalLogger.Errorf("触发事件【%v】,开始采集。", faultLabel)
 										saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
-										subscribersTimes[i] = time.Now()
 										break
 									} else {
 										c_log.GlobalLogger.Errorf("触发事件【%v】,但当前周期内采集数量已超限额,不再采集。", faultLabel)
@@ -310,7 +311,7 @@ func PrepareTimeWindowProducerQueue() {
 					Topic: topic,
 					Callback: func(data *nav_msgs.Odometry) {
 						subscribersTimeMutexes[i].Lock()
-						if time.Since(subscribersTimes[i]).Seconds() > 1 {
+						if time.Since(subscribersTimes[i]).Seconds() > triggerInterval {
 							subscribersMutexes[i].Lock()
 							faultHappenTime := commonUtil.GetNowTimeCustom() // 获取当前故障发生时间
 							lastTimeWindow := entity.GetLastTimeWindow()     // 获取最后一个时间窗口
@@ -318,10 +319,10 @@ func PrepareTimeWindowProducerQueue() {
 							for _, f := range masterConfig.RuleOfWheelOdom {
 								faultLabel = f(data)
 								if faultLabel != "" {
+									subscribersTimes[i] = time.Now()
 									if canCollect() {
 										c_log.GlobalLogger.Errorf("触发事件【%v】,开始采集。", faultLabel)
 										saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
-										subscribersTimes[i] = time.Now()
 										break
 									} else {
 										c_log.GlobalLogger.Errorf("触发事件【%v】,但当前周期内采集数量已超限额,不再采集。", faultLabel)

+ 2 - 2
trigger/pjibot_delivery/robot_pose/EnterTjunction/main/EnterTjunction.go

@@ -40,7 +40,7 @@ func Rule(data *geometry_msgs.PoseStamped) string {
 			fmt.Println("Recovered from panic:", r)
 		}
 	}()
-	fmt.Println("判断是否进入T字路口")
+	//fmt.Println("判断是否进入T字路口")
 	enterflag := IfEnter(pointlist, 15, data.Pose.Position.X, data.Pose.Position.Y)
 	if enterflag {
 		return "EnterTjunction"
@@ -58,7 +58,7 @@ func IfEnter(pointlist []Point, radius float64, x, y float64) bool {
 			return true
 		}
 	}
-	fmt.Printf("mindistance=%f", mindistance)
+	//fmt.Printf("mindistance=%f", mindistance)
 	mindistance = 999.0
 	return false
 }

+ 7 - 7
trigger/pjibot_delivery/robot_pose/PassManholeCover/main/PassManholeCover.go

@@ -10,7 +10,7 @@ func Topic() string {
 	return "/robot_pose"
 }
 
-// Label todo 禁止存在下划线_
+// 禁止存在下划线_
 func Label() string {
 	return "PassManholeCover"
 }
@@ -38,23 +38,23 @@ func Rule(data *geometry_msgs.PoseStamped) string {
 			fmt.Println("Recovered from panic:", r)
 		}
 	}()
-	enterflag := IfEnter(pointlist, 1.5, data.Pose.Position.X, data.Pose.Position.Y)
-	if enterflag {
-		return "PassManholeCover"
+	//fmt.Println("判断是否覆盖井盖")
+	enterFlag := IfEnter(pointlist, 1.5, data.Pose.Position.X, data.Pose.Position.Y)
+	if enterFlag {
+		return Label()
 	}
 
 	return ""
 }
-func IfEnter(pointlist []Point, radius float64, x, y float64) bool {
+func IfEnter(pointList []Point, radius float64, x, y float64) bool {
 	// 判断是否进入点列表中的区域
 	point1 := Point{X: x, Y: y}
-	for _, point := range pointlist {
+	for _, point := range pointList {
 		d := distance(point1, point)
 		if d <= radius {
 			return true
 		}
 	}
-
 	return false
 }