LingxinMeng 5 月之前
父节点
当前提交
e87886b62b

+ 2 - 2
src/main/main.go

@@ -74,8 +74,8 @@ func init() {
 func main() {
 
 	// 启动任务处理进程
-	go application.RunWaitingUser()
-	go application.RunWaitingCluster()
+	go application.RunWaitingUser()    // 先判断用户
+	go application.RunWaitingCluster() // 再判断集群,集群判断完可以运行
 
 	// 启动 web 服务器
 	{

+ 22 - 12
src/package/application/run_task.go

@@ -8,6 +8,7 @@ import (
 	"dcl_dispatch_server/src/package/infra/redis"
 	"dcl_dispatch_server/src/package/util"
 	"fmt"
+	"github.com/aliyun/aliyun-oss-go-sdk/oss"
 	"path/filepath"
 	"strconv"
 	"strings"
@@ -88,7 +89,8 @@ func RunWaitingCluster() {
 		algorithmImageName := ""
 		algorithmImageNameWithVersion := ""
 		algorithmExist := false
-
+		// 确定用哪个oss
+		var tempOss *oss.Bucket
 		if can {
 			// 判断是否有待运行的任务
 			waitingClusterNumber, _ := infra.GlobalRedisClient.LLen(global.KeyTaskQueueWaitingCluster).Result()
@@ -119,6 +121,11 @@ func RunWaitingCluster() {
 					continue
 				}
 			}
+			if firstTaskCache.Env == global.EnvPji {
+				tempOss = infra.GlobalOssBucketPji
+			} else {
+				tempOss = infra.GlobalOssBucketCicv
+			}
 			// --------------- 下载算法 ---------------
 			{
 				infra.GlobalLogger.Infof("开始下载算法 %v。", firstTaskCache.AlgorithmObjectKey)
@@ -129,11 +136,7 @@ func RunWaitingCluster() {
 				algorithmImageNameWithVersion = algorithmImageName + ":latest"
 				algorithmExist = util.ImageExists(infra.GlobalDockerClient, algorithmImageName)
 				if !algorithmExist {
-					if firstTaskCache.Env == "cicv" {
-						err = infra.GlobalOssBucketCicv.GetObjectToFile(firstTaskCache.AlgorithmObjectKey, algorithmTarPath)
-					} else {
-						err = infra.GlobalOssBucketPji.GetObjectToFile(firstTaskCache.AlgorithmObjectKey, algorithmTarPath)
-					}
+					err = tempOss.GetObjectToFile(firstTaskCache.AlgorithmObjectKey, algorithmTarPath)
 					if err != nil {
 						infra.GlobalLogger.Error("下载oss上的算法镜像 "+firstTaskCache.AlgorithmObjectKey+" 失败,错误信息为:", err)
 						time.Sleep(time.Duration(2) * time.Second)
@@ -183,14 +186,10 @@ func RunWaitingCluster() {
 
 		// ------- 解析 xosc ,从xosc中解析起终点位置&修改 xodr 和 osgb ---------------
 		xoscOssPath := firstTaskCache.Task.Scenario.ScenarioOsc
-		tempDir := "/mnt/disk001/dcl_dispatch_server/temp/"
+		tempDir := infra.ApplicationYaml.TempDir
 		util.CreateDir(tempDir)
 		xoscLocalPath := tempDir + util.NewShortUUID() + ".xosc"
-		if firstTaskCache.Env == "cicv" { // cicv 或 pji
-			err = infra.GlobalOssBucketCicv.GetObjectToFile(firstTaskCache.Task.Scenario.ScenarioOsc, xoscLocalPath)
-		} else {
-			err = infra.GlobalOssBucketPji.GetObjectToFile(firstTaskCache.Task.Scenario.ScenarioOsc, xoscLocalPath)
-		}
+		err = tempOss.GetObjectToFile(firstTaskCache.Task.Scenario.ScenarioOsc, xoscLocalPath)
 
 		if err != nil {
 			infra.GlobalLogger.Errorf("下载xosc文件【%v】失败,错误信息为:%v", xoscOssPath, err)
@@ -199,6 +198,17 @@ func RunWaitingCluster() {
 		startPositionX, startPositionY, startPositionZ, startPositionH, endPositionX, endPositionY, endPositionZ, endPositionH, xodrPath, osgbPath := util.ParseXosc(xoscLocalPath)
 		firstTaskCache.Task.Scenario.ScenarioOdr = xodrPath
 		firstTaskCache.Task.Scenario.ScenarioOsgb = osgbPath
+		lastIndex := strings.LastIndex(xoscLocalPath, "/")
+		dirPath := xoscLocalPath[:lastIndex+1] // 包括最后一个 /
+		destinationCsvOssKey := dirPath + global.DestinationCsvName
+		if exist, _ := tempOss.IsObjectExist(destinationCsvOssKey); exist {
+			destinationCsvLocalPath := tempDir + util.NewShortUUID() + ".xosc"
+			err = tempOss.GetObjectToFile(destinationCsvOssKey, destinationCsvLocalPath)
+			_, endPositionX, endPositionY, endPositionZ, endPositionH = util.ParseCsv(destinationCsvLocalPath)
+		} else {
+
+		}
+
 		// ------- 修改OGT传感器显示目标物框 -------
 		for i := range firstTaskCache.Task.Vehicle.Sensors.OGT {
 			firstTaskCache.Task.Vehicle.Sensors.OGT[i].SensorDisplay = global.DefaultOgtSensorDisplay

+ 1 - 0
src/package/infra/application.yaml

@@ -1,4 +1,5 @@
 application-name: dispatch_server
+temp-dir: "/mnt/disk001/dcl_dispatch_server/temp/"
 web:
   ip-private: 10.14.85.237
   port: 12342

+ 16 - 0
src/package/infra/global/default.go

@@ -0,0 +1,16 @@
+package global
+
+var (
+	DestinationCsvName = "targetposition.csv" //  默认 xosc 同目录下有一个 targetposition.csv 用来解析终点
+	/*
+		position
+		  x -9.01
+		  y -6.83
+		  z 0
+		orientation
+		  x 0
+		  y 0
+		  z 0.3002931752092615
+		  w 0.9538469525677271
+	*/
+)

+ 6 - 0
src/package/infra/global/env.go

@@ -0,0 +1,6 @@
+package global
+
+var (
+	EnvCicv = "cicv"
+	EnvPji  = "pji"
+)

+ 1 - 0
src/package/infra/i_application.go

@@ -11,6 +11,7 @@ import (
 
 type ApplicationYamlStruct struct {
 	ApplicationName string       `yaml:"application-name"`
+	TempDir         string       `yaml:"temp-dir"`
 	Web             WebStruct    `yaml:"web"`
 	Log             LogStruct    `yaml:"log"`
 	Redis           RedisStruct  `yaml:"redis"`

+ 66 - 0
src/package/util/u_csv.go

@@ -0,0 +1,66 @@
+package util
+
+import (
+	"encoding/csv"
+	"fmt"
+	"log"
+	"os"
+	"strconv"
+)
+
+func ParseCsv(csvPath string) (timestampString string, xString string, yString string, zString string, hString string) {
+	var err error
+	// 假设你的 CSV 文件名为 "data.csv"
+	csvFile, err := os.Open(csvPath)
+	if err != nil {
+		log.Fatalf("无法打开文件: %v", err)
+	}
+	defer csvFile.Close()
+
+	reader := csv.NewReader(csvFile)
+
+	// 读取文件的头部(列名)
+	headers, err := reader.Read()
+	if err != nil {
+		log.Fatalf("无法读取头部: %v", err)
+	}
+	fmt.Println("Headers:", headers)
+
+	// 读取文件的内容
+	records, err := reader.ReadAll()
+	if err != nil {
+		log.Fatalf("无法读取所有记录: %v", err)
+	}
+	var timestamp int64
+	var x, y, z, h float64
+	// 处理每一行记录
+	for _, record := range records {
+		// 将时间戳和其他字段转换为适当的类型
+		timestamp, err = strconv.ParseInt(record[0], 10, 64)
+		if err != nil {
+			log.Fatalf("无法解析时间戳: %v", err)
+		}
+
+		x, err = strconv.ParseFloat(record[1], 64)
+		if err != nil {
+			log.Fatalf("无法解析 x: %v", err)
+		}
+
+		y, err = strconv.ParseFloat(record[2], 64)
+		if err != nil {
+			log.Fatalf("无法解析 y: %v", err)
+		}
+
+		z, err = strconv.ParseFloat(record[3], 64)
+		if err != nil {
+			log.Fatalf("无法解析 z: %v", err)
+		}
+
+		h, err = strconv.ParseFloat(record[4], 64)
+		if err != nil {
+			log.Fatalf("无法解析 h: %v", err)
+		}
+		// 打印解析后的数据
+	}
+	return fmt.Sprintf("%v", timestamp), fmt.Sprintf("%v", x), fmt.Sprintf("%v", y), fmt.Sprintf("%v", z), fmt.Sprintf("%v", h)
+}

+ 2 - 2
src/package/util/u_xosc.go

@@ -30,7 +30,7 @@ var (
 )
 
 // - filepath  文件路径 "D:\\test.xosc"
-func ParseXosc(filepath string) (string, string, string, string, string, string, string, string, string, string) {
+func ParseXosc(xoscPath string) (string, string, string, string, string, string, string, string, string, string) {
 	startPositionX := ""
 	startPositionY := ""
 	startPositionZ := ""
@@ -42,7 +42,7 @@ func ParseXosc(filepath string) (string, string, string, string, string, string,
 	xodrPath := ""
 	osgbPath := ""
 	doc := etree.NewDocument()
-	if err := doc.ReadFromFile(filepath); err != nil {
+	if err := doc.ReadFromFile(xoscPath); err != nil {
 		panic(err)
 	}
 	storys := doc.SelectElement("OpenSCENARIO").SelectElement("Storyboard").SelectElements("Story")

+ 12 - 52
src/test/xml_test.go

@@ -1,61 +1,21 @@
 package main
 
 import (
+	"dcl_dispatch_server/src/package/util"
 	"fmt"
-	"github.com/beevik/etree"
 	"testing"
 )
 
 func TestParseXosc(t *testing.T) {
-	startPositionX := ""
-	startPositionY := ""
-	endPositionX := ""
-	endPositionY := ""
-	doc := etree.NewDocument()
-	if err := doc.ReadFromFile("D:\\test.xosc"); err != nil {
-		panic(err)
-	}
-	storys := doc.SelectElement("OpenSCENARIO").SelectElement("Storyboard").SelectElements("Story")
-	for _, story := range storys {
-		for _, attr := range story.Attr {
-			if attr.Key == "name" && attr.Value == "mystory_ego" {
-				events := story.SelectElement("Act").SelectElement("ManeuverGroup").SelectElement("Maneuver").SelectElements("Event")
-				for _, event := range events {
-					for _, attr2 := range event.Attr {
-						if attr2.Key == "name" && attr2.Value == "Event1" {
-							vertexs := event.SelectElement("Action").SelectElement("PrivateAction").SelectElement("RoutingAction").SelectElement("FollowTrajectoryAction").SelectElement("Trajectory").SelectElement("Shape").SelectElement("Polyline").SelectElements("Vertex")
-							for i, vertex := range vertexs {
-								if i == 0 {
-									worldPosition := vertex.SelectElement("Position").SelectElement("WorldPosition")
-									for _, attr3 := range worldPosition.Attr {
-										if attr3.Key == "x" {
-											startPositionX = attr3.Value
-										}
-										if attr3.Key == "y" {
-											startPositionY = attr3.Value
-										}
-									}
-								}
-								if i == len(vertexs)-1 {
-									worldPosition := vertex.SelectElement("Position").SelectElement("WorldPosition")
-									for _, attr3 := range worldPosition.Attr {
-										if attr3.Key == "x" {
-											endPositionX = attr3.Value
-										}
-										if attr3.Key == "y" {
-											endPositionY = attr3.Value
-										}
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-	}
-	fmt.Println(startPositionX)
-	fmt.Println(startPositionY)
-	fmt.Println(endPositionX)
-	fmt.Println(endPositionY)
+	xosc, s, s2, s3, s4, s5, s6, s7, s8, s9 := util.ParseXosc("C:\\Users\\mlxengingin\\Desktop\\scenario_hmi.xosc")
+	fmt.Println("---", xosc)
+	fmt.Println("---", s)
+	fmt.Println("---", s2)
+	fmt.Println("---", s3)
+	fmt.Println("---", s4)
+	fmt.Println("---", s5)
+	fmt.Println("---", s6)
+	fmt.Println("---", s7)
+	fmt.Println("---", s8)
+	fmt.Println("---", s9)
 }