|
@@ -4,6 +4,7 @@ import (
|
|
commonConfig "cicv-data-closedloop/aarch64/pjisuv/common/config"
|
|
commonConfig "cicv-data-closedloop/aarch64/pjisuv/common/config"
|
|
"cicv-data-closedloop/common/config/c_log"
|
|
"cicv-data-closedloop/common/config/c_log"
|
|
"cicv-data-closedloop/common/util"
|
|
"cicv-data-closedloop/common/util"
|
|
|
|
+ "cicv-data-closedloop/pjisuv_msgs"
|
|
"github.com/bluenviron/goroslib/v2"
|
|
"github.com/bluenviron/goroslib/v2"
|
|
"github.com/bluenviron/goroslib/v2/pkg/msgs/std_msgs"
|
|
"github.com/bluenviron/goroslib/v2/pkg/msgs/std_msgs"
|
|
"os"
|
|
"os"
|
|
@@ -14,21 +15,27 @@ import (
|
|
|
|
|
|
var (
|
|
var (
|
|
dir = "/userdata/competition/"
|
|
dir = "/userdata/competition/"
|
|
|
|
+ dirBak = "/userdata/competition-bak/"
|
|
commandArgs = []string{"record", "--split", "--duration=1", "/pji_gps", "/data_read"}
|
|
commandArgs = []string{"record", "--split", "--duration=1", "/pji_gps", "/data_read"}
|
|
topic = "/cicv_competition"
|
|
topic = "/cicv_competition"
|
|
|
|
+ urlExamTick = "http://36.110.106.142:12341/web_server/exam/tick"
|
|
urlExamBegin = "http://36.110.106.142:12341/web_server/exam/begin"
|
|
urlExamBegin = "http://36.110.106.142:12341/web_server/exam/begin"
|
|
urlExamEnd = "http://36.110.106.142:12341/web_server/exam/end"
|
|
urlExamEnd = "http://36.110.106.142:12341/web_server/exam/end"
|
|
cacheMutex sync.Mutex
|
|
cacheMutex sync.Mutex
|
|
cacheTeamName = make(map[string]time.Time)
|
|
cacheTeamName = make(map[string]time.Time)
|
|
heartBeatTimeThreshold = 5 * time.Second // 心跳时间
|
|
heartBeatTimeThreshold = 5 * time.Second // 心跳时间
|
|
|
|
+ bakSecondNumber = 3600
|
|
|
|
+ cachePositionX = -999.00
|
|
|
|
+ cachePositionY = -999.00
|
|
)
|
|
)
|
|
|
|
|
|
// todo 实车比赛临时使用
|
|
// todo 实车比赛临时使用
|
|
// history record命令无法录制()
|
|
// history record命令无法录制()
|
|
func ForCompetition() {
|
|
func ForCompetition() {
|
|
go dataCollection()
|
|
go dataCollection()
|
|
- go examBegin()
|
|
|
|
- go examEnd()
|
|
|
|
|
|
+ go dataCollectionBak(bakSecondNumber) // 需要再车上备份的数据,防止网络差传不回来
|
|
|
|
+ go location() // 记录经纬度和速度
|
|
|
|
+ go tick()
|
|
}
|
|
}
|
|
|
|
|
|
// 全量数据采集
|
|
// 全量数据采集
|
|
@@ -47,7 +54,7 @@ func dataCollection() {
|
|
time.Sleep(time.Duration(2) * time.Second)
|
|
time.Sleep(time.Duration(2) * time.Second)
|
|
files, _ := util.ListAbsolutePathAndSort(dir)
|
|
files, _ := util.ListAbsolutePathAndSort(dir)
|
|
if len(files) >= 2 {
|
|
if len(files) >= 2 {
|
|
- c_log.GlobalLogger.Info("扫描试车比赛数据采集目录,", files)
|
|
|
|
|
|
+ c_log.GlobalLogger.Info("扫描实车比赛数据采集目录,", files)
|
|
for i := range files {
|
|
for i := range files {
|
|
if i == len(files)-1 { // 最后一个包在录制中,不上传
|
|
if i == len(files)-1 { // 最后一个包在录制中,不上传
|
|
break
|
|
break
|
|
@@ -63,9 +70,67 @@ func dataCollection() {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+// 全量数据采集
|
|
|
|
+func dataCollectionBak(bakSecondNumber int) {
|
|
|
|
+ c_log.GlobalLogger.Info("开始备份实车算法比赛全量数据。")
|
|
|
|
+ util.CreateDir(dirBak)
|
|
|
|
+ // 1 打包
|
|
|
|
+ command, err := util.ExecuteWithEnvAndDirAsync(commonConfig.RosbagEnvs, dirBak, commonConfig.RosbagPath, commandArgs...)
|
|
|
|
+ if err != nil {
|
|
|
|
+ c_log.GlobalLogger.Error("程序崩溃。备份目录执行record命令", command, "出错:", err)
|
|
|
|
+ os.Exit(-1)
|
|
|
|
+ }
|
|
|
|
+ // 2 扫描目录文件
|
|
|
|
+ for {
|
|
|
|
+ time.Sleep(time.Duration(2) * time.Second)
|
|
|
|
+ files, _ := util.ListAbsolutePathAndSort(dirBak)
|
|
|
|
+ if len(files) >= bakSecondNumber {
|
|
|
|
+ // 超出阈值就删除心跳+1个文件
|
|
|
|
+ _ = util.DeleteFile(files[0])
|
|
|
|
+ _ = util.DeleteFile(files[1])
|
|
|
|
+ _ = util.DeleteFile(files[2])
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// data格式为队伍编号
|
|
|
|
+// 保存单次考试时间区间
|
|
|
|
+func location() {
|
|
|
|
+ _, _ = goroslib.NewSubscriber(goroslib.SubscriberConf{
|
|
|
|
+ Node: commonConfig.RosNode,
|
|
|
|
+ Topic: "/cicv_location",
|
|
|
|
+ Callback: func(data *pjisuv_msgs.PerceptionLocalization) {
|
|
|
|
+ cachePositionX = data.PositionX
|
|
|
|
+ cachePositionY = data.PositionY
|
|
|
|
+ },
|
|
|
|
+ })
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// data格式为队伍编号
|
|
|
|
+// 保存单次考试时间区间
|
|
|
|
+func tick() {
|
|
|
|
+ _, _ = goroslib.NewSubscriber(goroslib.SubscriberConf{
|
|
|
|
+ Node: commonConfig.RosNode,
|
|
|
|
+ Topic: topic,
|
|
|
|
+ Callback: func(data *std_msgs.String) {
|
|
|
|
+ teamName := data.Data
|
|
|
|
+ _, _ = util.HttpPostJsonWithHeaders(
|
|
|
|
+ urlExamTick,
|
|
|
|
+ map[string]string{"Authorization": "U9yKpD6kZZDDe4LFKK6myAxBUT1XRrDM"},
|
|
|
|
+ map[string]string{
|
|
|
|
+ "teamName": teamName,
|
|
|
|
+ "positionX": util.ToString(cachePositionX),
|
|
|
|
+ "positionY": util.ToString(cachePositionY),
|
|
|
|
+ },
|
|
|
|
+ )
|
|
|
|
+ c_log.GlobalLogger.Infof("队伍 %v 的心跳发送到云端成功。", teamName)
|
|
|
|
+ },
|
|
|
|
+ })
|
|
|
|
+}
|
|
|
|
+
|
|
// data格式为队伍编号
|
|
// data格式为队伍编号
|
|
// 保存单次考试时间区间
|
|
// 保存单次考试时间区间
|
|
-func examBegin() {
|
|
|
|
|
|
+func examBeginBak() {
|
|
_, _ = goroslib.NewSubscriber(goroslib.SubscriberConf{
|
|
_, _ = goroslib.NewSubscriber(goroslib.SubscriberConf{
|
|
Node: commonConfig.RosNode,
|
|
Node: commonConfig.RosNode,
|
|
Topic: topic,
|
|
Topic: topic,
|
|
@@ -91,7 +156,7 @@ func examBegin() {
|
|
})
|
|
})
|
|
}
|
|
}
|
|
|
|
|
|
-func examEnd() {
|
|
|
|
|
|
+func examEndBak() {
|
|
for {
|
|
for {
|
|
time.Sleep(time.Duration(1) * time.Second)
|
|
time.Sleep(time.Duration(1) * time.Second)
|
|
cacheMutex.Lock()
|
|
cacheMutex.Lock()
|