HeWang 2 сар өмнө
parent
commit
66788005af

+ 54 - 33
aarch64/jili/Gart-cloud-config.yaml

@@ -33,7 +33,8 @@ ros:
     - /camera_output
     - /ins
     - /lidar_pretreatment
-    - /sensorfusion
+#    - /sensorfusion
+    - /sensors_fusion_node
     - /control
 
 # /camera_image,/cicv_amr_trajectory,/pj_control_pub,/data_read,/tftrafficlight,/cicv_amr_trajectory,/trajectory_display,/reference_display,/reference_trajectory,/tprouteplan,/map_polygon,/vehicle_info,/target_line,/parking_line,/station_status,/pj_control_pub,/pj_control_debug_pub,/tar_traj_pub,/park_task,/parking_line,/map_display,/v2x_planner,/end_point_message,/heartbeat_info,/fault_info,/planning_fault_info,/nodefault_info,/points_concat,/tpperception,/cicv_location,/tpperception,/pull_over,/pj_vehicle_fdb_pub,/pre_line,/target_line,/amr_pose,/destination_pose,/lidar_roi,/obstacle_display,/target_point_pub,/fusion/traffic_light,/roi/polygon,/tpperception/vis
@@ -41,25 +42,35 @@ hosts:
   - name: node1
     ip: 192.168.1.104
     rosbag:
-      path: "/opt/ros/melodic/bin/rosbag"
+      path: "/opt/ros/noetic/bin/rosbag"
       envs:
-        - "LD_LIBRARY_PATH=/opt/ros/melodic/lib:/usr/lib::/usr/lib:/userdata/third_lib/libaicc"
-        - "ROS_ETC_DIR=/opt/ros/melodic/etc/ros"
-        - "USER=root"
-        - "ROS_OS_OVERRIDE=openembedded"
-        - "PWD=/mnt/media/sda1/cicv-data-closedloop"
-        - "HOME=/home/root"
-        - "CMAKE_PREFIX_PATH=/opt/ros/melodic:/usr"
-        - "ROS_ROOT=/opt/ros/melodic/share/ros"
-        - "ROS_MASTER_URI=http://192.168.1.104:11311"
+        - "SHELL=/bin/bash"
         - "ROS_VERSION=1"
-        - "ROS_PYTHON_VERSION=2"
+        - "SUDO_GID=1000"
+        - "PKG_CONFIG_PATH=/opt/ros/noetic/lib/pkgconfig"
+        - "ROS_PYTHON_VERSION=3"
+        - "SUDO_COMMAND=/usr/bin/su"
+        - "SUDO_USER=pji"
+        - "ROS_PACKAGE_PATH=/opt/ros/noetic/share"
+        - "ROSLISP_PACKAGE_DIRECTORIES="
+        - "PWD=/mnt/media/sda1/cicv-data-closedloop/data"
+        - "LOGNAME=root"
         - "ROS_IP=192.168.1.104"
-        - "PYTHONPATH=/opt/ros/melodic/lib/python2.7/site-packages:/usr/lib/python2.7/site-packages"
-        - "ROS_PACKAGE_PATH=/opt/ros/melodic/share"
-        - "PATH=/opt/ros/melodic/bin:/usr/bin/cyber/tools/cyber_service:/usr/bin/cyber/tools/cyber_node:/usr/bin/cyber/tools/cyber_channel:/usr/bin/cyber/tools/cyber_launch:/usr/bin/cyber/tools/cyber_monitor:/usr/bin/cyber/tools/cyber_recorder:/apollo/bazel-bin/cyber:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin"
-        - "PKG_CONFIG_PATH=/usr/lib/pkgconfig"
-        - "ROS_DISTRO=melodic"
+        - "HOME=/root"
+        - "LANG=en_US.UTF-8"
+        - "ROS_ETC_DIR=/opt/ros/noetic/etc/ros"
+        - "CMAKE_PREFIX_PATH=/opt/ros/noetic"
+        - "LESSCLOSE=/usr/bin/lesspipe %s %s"
+        - "PYTHONPATH=/opt/ros/noetic/lib/python3/dist-packages"
+        - "USER=root"
+        - "LD_LIBARAY_PATH=/usr/local/lib:"
+        - "ROS_MASTER_URI=http://192.168.1.104:11311"
+        - "ROS_HOSTNAME=192.168.1.104"
+        - "LD_LIBRARY_PATH=/opt/ros/noetic/lib:/opt/ros/noetic/lib/aarch64-linux-gnu"
+        - "PATH=/opt/ros/noetic/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin"
+        - "ROS_ROOT=/opt/ros/noetic/share/ros"
+        - "ROS_DISTRO=noetic"
+        - "_=/usr/bin/env"
     topics:
       - /camera_image # /camera_output
       - /cicv_amr_trajectory
@@ -90,25 +101,35 @@ hosts:
   - name: node2
     ip: 192.168.1.105
     rosbag:
-      path: "/opt/ros/melodic/bin/rosbag"
+      path: "/opt/ros/noetic/bin/rosbag"
       envs:
-        - "LD_LIBRARY_PATH=/opt/ros/melodic/lib:/usr/lib::/usr/lib:/userdata/third_lib"
-        - "ROS_ETC_DIR=/opt/ros/melodic/etc/ros"
-        - "USER=root"
-        - "ROS_OS_OVERRIDE=openembedded"
-        - "PWD=/mnt/media/sda1/cicv-data-closedloop"
-        - "HOME=/home/root"
-        - "CMAKE_PREFIX_PATH=/opt/ros/melodic:/usr"
-        - "ROS_ROOT=/opt/ros/melodic/share/ros"
-        - "ROS_MASTER_URI=http://192.168.1.104:11311"
+        - "SHELL=/bin/bash"
         - "ROS_VERSION=1"
-        - "ROS_PYTHON_VERSION=2"
+        - "SUDO_GID=1000"
+        - "PKG_CONFIG_PATH=/opt/ros/noetic/lib/pkgconfig"
+        - "ROS_PYTHON_VERSION=3"
+        - "SUDO_COMMAND=/usr/bin/su"
+        - "SUDO_USER=pji"
+        - "ROS_PACKAGE_PATH=/opt/ros/noetic/share"
+        - "ROSLISP_PACKAGE_DIRECTORIES="
+        - "PWD=/mnt/media/sda1/cicv-data-closedloop/data"
+        - "LOGNAME=root"
         - "ROS_IP=192.168.1.105"
-        - "PYTHONPATH=/opt/ros/melodic/lib/python2.7/site-packages:/usr/lib/python2.7/site-packages"
-        - "ROS_PACKAGE_PATH=/opt/ros/melodic/share"
-        - "PATH=/opt/ros/melodic/bin:/usr/bin/cyber/tools/cyber_service:/usr/bin/cyber/tools/cyber_node:/usr/bin/cyber/tools/cyber_channel:/usr/bin/cyber/tools/cyber_launch:/usr/bin/cyber/tools/cyber_monitor:/usr/bin/cyber/tools/cyber_recorder:/apollo/bazel-bin/cyber:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin "
-        - "PKG_CONFIG_PATH=/usr/lib/pkgconfig"
-        - "ROS_DISTRO=melodic"
+        - "HOME=/root"
+        - "LANG=en_US.UTF-8"
+        - "ROS_ETC_DIR=/opt/ros/noetic/etc/ros"
+        - "CMAKE_PREFIX_PATH=/opt/ros/noetic"
+        - "LESSCLOSE=/usr/bin/lesspipe %s %s"
+        - "PYTHONPATH=/opt/ros/noetic/lib/python3/dist-packages"
+        - "USER=root"
+        - "LD_LIBARAY_PATH=/usr/local/lib:"
+        - "ROS_MASTER_URI=http://192.168.1.104:11311"
+        - "ROS_HOSTNAME=192.168.1.104"
+        - "LD_LIBRARY_PATH=/opt/ros/noetic/lib::/usr/local/cuda-11.4/lib64"
+        - "PATH=/home/pji/.local/bin:/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/cuda-11.4/bin:/home/pji/.local/bin"
+        - "ROS_ROOT=/opt/ros/noetic/share/ros"
+        - "ROS_DISTRO=noetic"
+        - "_=/usr/bin/env"
     topics:
       - /points_concat  # /lidar_pretreatment
       - /tpperception # /sensorfusion

+ 83 - 7
aarch64/jili/common/config/c_platform.go

@@ -55,27 +55,49 @@ var (
 // InitPlatformConfig 初始化数据闭环平台的配置
 func InitPlatformConfig() {
 	if !LocalConfig.Internet {
+		PlatformConfig = PlatformConfigStruct{}
 		return
 	}
-	var err error
 	c_log.GlobalLogger.Info("获取数据闭环平台配置 - 开始")
 	// 1 如果车辆没有配置任务,则阻塞在这里,不启动任务
 	for {
 		time.Sleep(time.Duration(2) * time.Second)
-		PlatformTasks, err = GetConfig()
+		config, err := GetConfig()
 		if err != nil {
-			c_log.GlobalLogger.Error("获取配置status失败:", err)
+			c_log.GlobalLogger.Error("获取今日任务信息失败:", err)
+			PlatformConfig = PlatformConfigStruct{}
 			continue
 		}
-		if checkPlatformTasks() {
-			break
-		}
+		PlatformConfig = config
+		break
 	}
 	c_log.GlobalLogger.Infof("获取数据闭环平台配置 - 成功。")
 	//c_log.GlobalLogger.Infof("获取数据闭环平台配置 - 成功。【触发前】=【%v 秒】,触发后=【%v 秒】,【最大窗口】=【%v 秒】。", PlatformConfig.TaskBeforeTime, PlatformConfig.TaskAfterTime, PlatformConfig.TaskMaxTime)
 }
 
-func GetConfig() ([]PlatformConfigStruct, error) {
+func GetConfig() (PlatformConfigStruct, error) {
+	var err error
+	PlatformTasks, err = GetPlatformTasks()
+	if err != nil {
+		return PlatformConfigStruct{}, fmt.Errorf("请求任务信息失败,", err)
+	}
+	if !checkPlatformTasks() {
+		return PlatformConfigStruct{}, fmt.Errorf("配置未通过校验。")
+	}
+	for _, task := range PlatformTasks {
+		flag := shouldExecuteTask(task.StartTime, task.EndTime)
+		fmt.Println("flag", flag)
+		// 当前时间不执行此任务,跳过
+		if !flag {
+			continue
+		}
+		RecordTopics = getUniqueCollectionTopics(task.TaskTriggers)
+		return task, nil
+	}
+	return PlatformConfigStruct{}, fmt.Errorf("当前时刻不存在待执行的任务。")
+}
+
+func GetPlatformTasks() ([]PlatformConfigStruct, error) {
 	queryParams := map[string]string{
 		"equipmentNo": LocalConfig.SecretKey,
 	}
@@ -146,3 +168,57 @@ func GenerateSign(ak, sk string, params map[string]string) string {
 	hash := md5.Sum([]byte(signStr))
 	return hex.EncodeToString(hash[:])
 }
+
+// shouldExecuteTask 给定任务起止时间,判断当前时刻此任务是否应该执行
+func shouldExecuteTask(startTimeStr, endTimeStr string) bool {
+	// 定义时间格式(根据输入的时间字符串格式)
+	timeFormat := "2006-01-02 15:04:05"
+
+	// 注意: time.Parse 时间没有考虑时区,当做默认的 +0 时区 UTC 时间来解析了,就造成了实际时间比预期的 +8 小时
+	// 解析 startTime 和 endTime
+	startTime, err := time.ParseInLocation(timeFormat, startTimeStr, time.Local)
+	//fmt.Println("startTime", startTime)
+	if err != nil {
+		fmt.Println("Error parsing startTime:", err)
+		return false
+	}
+	endTime, err := time.ParseInLocation(timeFormat, endTimeStr, time.Local)
+	//fmt.Println("endTime", endTime)
+	if err != nil {
+		fmt.Println("Error parsing endTime:", err)
+		return false
+	}
+
+	// 获取当前时间
+	currentTime := time.Now()
+	//fmt.Println("currentTime", currentTime)
+
+	// 判断当前时间是否在 startTime 和 endTime 之间
+	return !currentTime.Before(startTime) && !currentTime.After(endTime)
+}
+
+// getUniqueCollectionTopics 统计需要采集的 topic 并去重
+func getUniqueCollectionTopics(taskTriggers []TaskTrigger) []string {
+	// 使用 map 去重
+	topicMap := make(map[string]struct{})
+
+	// 遍历 taskTriggers
+	for _, trigger := range taskTriggers {
+		// 分割 collectionTopic 字段
+		topics := strings.Split(trigger.CollectionTopic, ",")
+		for _, topic := range topics {
+			trimmedTopic := strings.TrimSpace(topic) // 去除空格
+			if trimmedTopic != "" {                  // 忽略空字符串
+				topicMap[trimmedTopic] = struct{}{}
+			}
+		}
+	}
+
+	// 将 map 中的 key 转换为切片
+	var uniqueTopics []string
+	for topic := range topicMap {
+		uniqueTopics = append(uniqueTopics, topic)
+	}
+
+	return uniqueTopics
+}

+ 37 - 107
aarch64/jili/control/main.go

@@ -5,11 +5,9 @@ import (
 	commonService "cicv-data-closedloop/aarch64/jili/common/service"
 	"cicv-data-closedloop/common/config/c_log"
 	"cicv-data-closedloop/common/util"
-	"fmt"
 	"net/rpc"
 	"os"
 	"runtime"
-	"strings"
 	"time"
 )
 
@@ -23,6 +21,8 @@ func init() {
 	commonConfig.InitOssConfig()
 	// 初始化业务逻辑配置信息,配置文件在oss上(第2处配置,在oss文件)
 	commonConfig.InitCloudConfig()
+	// 初始化平台任务配置
+	commonConfig.InitPlatformConfig()
 }
 
 func main() {
@@ -43,66 +43,50 @@ func RunWithInternet() {
 		wait = true
 
 		// 1. 获取当前设备的任务配置
-		platformTasks, err := commonConfig.GetConfig()
-		fmt.Println("platformTasks", platformTasks)
-		commonConfig.PlatformTasks = platformTasks
+		task, err := commonConfig.GetConfig()
 		if err != nil {
-			c_log.GlobalLogger.Error("获取平台任务失败:", err)
+			c_log.GlobalLogger.Error("获取今日任务信息失败:", err)
 			continue
 		}
 
-		// 2. 判断当前时间是否有需要执行的任务
-		for _, task := range platformTasks {
-			flag := shouldExecuteTask(task.StartTime, task.EndTime)
-			fmt.Println("flag", flag)
-			// 2.1 当前时间不执行此任务,跳过
-			if !flag {
+		// 2 当前时间需要执行此任务
+		// 2.1 判断此任务是否正在执行
+		if commonConfig.CurrTask.TaskConfigId == task.TaskConfigId { // 此任务正在执行,退出循环
+			continue
+		}
+		// 此任务没有在执行,需要启动此任务
+		// 2.2 判断是否有其他任务正在执行
+		if commonConfig.CurrTask.TaskConfigId != "" { // 存在其他任务正在执行,杀死旧的任务
+			c_log.GlobalLogger.Info("需要执行的任务id为", task.TaskConfigId, ", 当前任务id为:", commonConfig.CurrTask.TaskConfigId, ", 需要杀死该任务。")
+			// 杀死旧的任务
+			var killArgs commonService.KillSignal
+			// todo 吉利新平台没有DropUploadData字段(旧平台,已采数据:保留/丢弃)
+			killArgs = commonService.KillSignal{DropUploadData: true, Restart: false}
+			c_log.GlobalLogger.Info("杀死任务,发送rpc结束信号到本地:", killArgs)
+			KillRpcClient, err := rpc.Dial("tcp", commonConfig.LocalConfig.Node.Ip+":"+commonConfig.CloudConfig.RpcPort)
+			if err != nil {
+				// 此处如果连接失败说明采集程序已经停止了
+				commonConfig.CurrTask = commonConfig.PlatformConfigStruct{}
+				c_log.GlobalLogger.Error("采集程序已经停止:", err)
 				continue
 			}
-			// 2.2 当前时间需要执行此任务
-			// 2.2.1 判断此任务是否正在执行
-			if commonConfig.CurrTask.TaskConfigId == task.TaskConfigId { // 此任务正在执行,退出循环
-				break
+			reply := 0
+			if err = KillRpcClient.Call("KillService.Kill", killArgs, &reply); err != nil {
+				c_log.GlobalLogger.Error("发送rpc请求到master失败:", err)
+				// 这里可能会报错 unexpected EOF 但是不影响,先注释 close 和 continue
+				//KillRpcClient.Close()
+				//continue
 			}
-			// 此任务没有在执行,需要启动此任务
-			// 2.2.2 判断是否有其他任务正在执行
-			if commonConfig.CurrTask.TaskConfigId != "" { // 存在其他任务正在执行,杀死旧的任务
-				c_log.GlobalLogger.Info("需要执行的任务id为", task.TaskConfigId, ", 当前任务id为:", commonConfig.CurrTask.TaskConfigId, ", 需要杀死该任务。")
-				// 杀死旧的任务
-				var killArgs commonService.KillSignal
-				// todo 吉利新平台没有DropUploadData字段(旧平台,已采数据:保留/丢弃)
-				killArgs = commonService.KillSignal{DropUploadData: true, Restart: false}
-				c_log.GlobalLogger.Info("杀死任务,发送rpc结束信号到本地:", killArgs)
-				KillRpcClient, err := rpc.Dial("tcp", commonConfig.LocalConfig.Node.Ip+":"+commonConfig.CloudConfig.RpcPort)
-				if err != nil {
-					// 此处如果连接失败说明采集程序已经停止了
-					commonConfig.RecordTopics = []string{}
-					commonConfig.CurrTask = commonConfig.PlatformConfigStruct{}
-					c_log.GlobalLogger.Error("采集程序已经停止:", err)
-					continue
-				}
-				reply := 0
-				if err = KillRpcClient.Call("KillService.Kill", killArgs, &reply); err != nil {
-					c_log.GlobalLogger.Error("发送rpc请求到master失败:", err)
-					// 这里可能会报错 unexpected EOF 但是不影响,先注释 close 和 continue
-					//KillRpcClient.Close()
-					//continue
-				}
-				c_log.GlobalLogger.Info("结束任务后,将数据闭环平台配置置空。")
-				commonConfig.RecordTopics = []string{}
-				commonConfig.CurrTask = commonConfig.PlatformConfigStruct{}
-				if err = KillRpcClient.Close(); err != nil {
-					// 不做处理
-				}
+			c_log.GlobalLogger.Info("结束任务后,将数据闭环平台配置置空。")
+			commonConfig.CurrTask = commonConfig.PlatformConfigStruct{}
+			if err = KillRpcClient.Close(); err != nil {
+				// 不做处理
 			}
-
-			// 开启新的任务
-			startMasterOrSlave()
-			commonConfig.RecordTopics = getUniqueCollectionTopics(task.TaskTriggers)
-			commonConfig.CurrTask = task
-			// 退出循环
-			break
 		}
+
+		// 开启新的任务
+		startMasterOrSlave()
+		commonConfig.CurrTask = task
 	}
 }
 
@@ -117,57 +101,3 @@ func startMasterOrSlave() {
 	}
 	c_log.GlobalLogger.Info("启动任务,本地执行启动命令:【path】=", commonConfig.LocalConfig.RestartCmd.Dir, "【cmd】=", commonConfig.LocalConfig.RestartCmd.Name, commonConfig.LocalConfig.RestartCmd.Args)
 }
-
-// shouldExecuteTask 给定任务起止时间,判断当前时刻此任务是否应该执行
-func shouldExecuteTask(startTimeStr, endTimeStr string) bool {
-	// 定义时间格式(根据输入的时间字符串格式)
-	timeFormat := "2006-01-02 15:04:05"
-
-	// 注意: time.Parse 时间没有考虑时区,当做默认的 +0 时区 UTC 时间来解析了,就造成了实际时间比预期的 +8 小时
-	// 解析 startTime 和 endTime
-	startTime, err := time.ParseInLocation(timeFormat, startTimeStr, time.Local)
-	//fmt.Println("startTime", startTime)
-	if err != nil {
-		fmt.Println("Error parsing startTime:", err)
-		return false
-	}
-	endTime, err := time.ParseInLocation(timeFormat, endTimeStr, time.Local)
-	//fmt.Println("endTime", endTime)
-	if err != nil {
-		fmt.Println("Error parsing endTime:", err)
-		return false
-	}
-
-	// 获取当前时间
-	currentTime := time.Now()
-	//fmt.Println("currentTime", currentTime)
-
-	// 判断当前时间是否在 startTime 和 endTime 之间
-	return !currentTime.Before(startTime) && !currentTime.After(endTime)
-}
-
-// getUniqueCollectionTopics 统计需要采集的 topic 并去重
-func getUniqueCollectionTopics(taskTriggers []commonConfig.TaskTrigger) []string {
-	// 使用 map 去重
-	topicMap := make(map[string]struct{})
-
-	// 遍历 taskTriggers
-	for _, trigger := range taskTriggers {
-		// 分割 collectionTopic 字段
-		topics := strings.Split(trigger.CollectionTopic, ",")
-		for _, topic := range topics {
-			trimmedTopic := strings.TrimSpace(topic) // 去除空格
-			if trimmedTopic != "" {                  // 忽略空字符串
-				topicMap[trimmedTopic] = struct{}{}
-			}
-		}
-	}
-
-	// 将 map 中的 key 转换为切片
-	var uniqueTopics []string
-	for topic := range topicMap {
-		uniqueTopics = append(uniqueTopics, topic)
-	}
-
-	return uniqueTopics
-}

+ 3 - 2
aarch64/jili/多功能车-cloud-config.yaml

@@ -28,12 +28,13 @@ time-window-send-gap: 6
 tcp-port: 12340
 rpc-port: 12341
 ros:
-  master-address: 192.168.1.102:11311
+  master-address: 192.168.1.104:11311
   nodes:
     - /camera_output
     - /ins
     - /lidar_pretreatment
-    - /sensorfusion
+#    - /sensorfusion
+    - /sensors_fusion_node
     - /control
 
 # /camera_image,/cicv_amr_trajectory,/pj_control_pub,/data_read,/tftrafficlight,/cicv_amr_trajectory,/trajectory_display,/reference_display,/reference_trajectory,/tprouteplan,/map_polygon,/vehicle_info,/target_line,/parking_line,/station_status,/pj_control_pub,/pj_control_debug_pub,/tar_traj_pub,/park_task,/parking_line,/map_display,/v2x_planner,/end_point_message,/heartbeat_info,/fault_info,/planning_fault_info,/nodefault_info,/points_concat,/tpperception,/cicv_location,/tpperception,/pull_over,/pj_vehicle_fdb_pub,/pre_line,/target_line,/amr_pose,/destination_pose,/lidar_roi,/obstacle_display,/target_point_pub,/fusion/traffic_light,/roi/polygon,/tpperception/vis

+ 2 - 2
test/platform_api_test.go

@@ -19,7 +19,7 @@ func init() {
 
 func TestGetConfig(t *testing.T) {
 	fmt.Println(commonConfig.LocalConfig.EquipmentNo)
-	PlatformConfig, err := commonConfig.GetConfig()
+	PlatformConfig, err := commonConfig.GetPlatformTasks()
 	fmt.Println("PlatformConfig", PlatformConfig)
 	if err != nil {
 		fmt.Println("获取配置status失败:", err)
@@ -35,7 +35,7 @@ func TestControl(t *testing.T) {
 		}
 		wait = true
 		// 1. 获取当前设备的任务配置
-		platformTasks, err := commonConfig.GetConfig()
+		platformTasks, err := commonConfig.GetPlatformTasks()
 		fmt.Println("platformTasks", platformTasks)
 		commonConfig.PlatformTasks = platformTasks
 		if err != nil {