LingxinMeng 11 月之前
父節點
當前提交
82a90c7b3c

+ 108 - 7
aarch64/pji/common/config/c_cloud.go

@@ -3,7 +3,12 @@ package config
 import (
 	"cicv-data-closedloop/common/config/c_log"
 	"cicv-data-closedloop/common/util"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"github.com/gorilla/websocket"
 	"gopkg.in/yaml.v3"
+	"net/url"
 	"os"
 	"strings"
 	"sync"
@@ -66,6 +71,25 @@ type cloudConfig struct {
 	Monitor               MonitorStruct `yaml:"monitor"`
 }
 
+// Request 结构体定义
+type Request struct {
+	Type      string      `json:"type"`
+	UUID      string      `json:"uuid"`
+	CommandID string      `json:"commandId"`
+	Parameter interface{} `json:"parameter"`
+}
+
+// Response 结构体定义
+type Response struct {
+	CommandID string            `json:"commandId"`
+	ErrorCode string            `json:"errorCode"`
+	Results   map[string]string `json:"results"`
+	Status    string            `json:"status"`
+	Time      int64             `json:"time"`
+	Type      string            `json:"type"`
+	UUID      string            `json:"uuid"`
+}
+
 var (
 	CloudConfig      cloudConfig
 	CloudConfigMutex sync.RWMutex
@@ -78,16 +102,11 @@ func InitCloudConfig() {
 
 	for {
 		time.Sleep(time.Duration(2) * time.Second)
-		var command []string
-		command = append(command, "get")
-		command = append(command, "sn")
-		_, snOutput, err := util.ExecuteSync(LocalConfig.RosparamPath, command...)
+		snCode, err := getSnCode()
 		if err != nil {
-			c_log.GlobalLogger.Error("执行获取sn码命令", command, "出错:", err)
+			c_log.GlobalLogger.Error("获取sn码失败:", err.Error())
 			continue
 		}
-		c_log.GlobalLogger.Info("执行获取sn码命令", command, "成功,结果为:", snOutput)
-		snCode = strings.Replace(strings.Replace(snOutput, " ", "", -1), "\n", "", -1)
 		LocalConfig.SecretKey = snCode
 		LocalConfig.EquipmentNo = "pjibot-" + snCode
 		break
@@ -211,3 +230,85 @@ func checkCloudConfig(check cloudConfig) bool {
 	}
 	return true
 }
+
+func getSnCode() (string, error) {
+	if LocalConfig.Type == "1" {
+		var command []string
+		command = append(command, "get")
+		command = append(command, "sn")
+		_, snOutput, err := util.ExecuteSync(LocalConfig.RosparamPath, command...)
+		if err != nil {
+			return "", errors.New("执行获取sn码命令" + util.ToString(command) + "出错:" + util.ToString(err))
+		}
+		c_log.GlobalLogger.Info("执行获取sn码命令", command, "成功,结果为:", snOutput)
+		snCode := strings.Replace(strings.Replace(snOutput, " ", "", -1), "\n", "", -1)
+		return snCode, nil
+	} else if LocalConfig.Type == "2" || LocalConfig.Type == "3" {
+		// 示例使用
+		serverURL := "192.168.1.104:9002"
+		path := "/"
+		request := Request{
+			Type:      "request",
+			UUID:      "",
+			CommandID: "getRobotBaseInfo",
+			Parameter: nil,
+		}
+
+		sn, err := SendWebsocketRequest(serverURL, path, request)
+		if err != nil {
+			return "", errors.New("通过api获取sn码失败:" + util.ToString(err))
+		}
+		return sn, nil
+	} else {
+		return "", errors.New("未知的机器人类型【" + LocalConfig.Type + "】,请修改local-config.yaml文件")
+	}
+}
+
+// SendWebsocketRequest 发送WebSocket请求并返回sn字段的值
+func SendWebsocketRequest(serverURL, path string, request Request) (string, error) {
+	// 构建WebSocket连接URL
+	u := url.URL{Scheme: "ws", Host: serverURL, Path: path}
+
+	// 创建一个Dialer实例,用于建立WebSocket连接
+	dialer := websocket.Dialer{
+		ReadBufferSize:  1024,
+		WriteBufferSize: 1024,
+		// 可选:设置超时等
+		HandshakeTimeout: 5 * time.Second,
+	}
+
+	// 建立WebSocket连接
+	conn, _, err := dialer.Dial(u.String(), nil)
+	if err != nil {
+		return "", fmt.Errorf("dial: %w", err)
+	}
+	defer conn.Close()
+
+	// 将请求JSON编码为字节
+	requestJSON, err := json.Marshal(request)
+	if err != nil {
+		return "", fmt.Errorf("marshal request: %w", err)
+	}
+
+	// 发送WebSocket消息
+	err = conn.WriteMessage(websocket.TextMessage, requestJSON)
+	if err != nil {
+		return "", fmt.Errorf("write: %w", err)
+	}
+
+	// 读取WebSocket响应
+	_, responseBytes, err := conn.ReadMessage()
+	if err != nil {
+		return "", fmt.Errorf("read: %w", err)
+	}
+
+	// 将响应字节解码为JSON
+	var response Response
+	err = json.Unmarshal(responseBytes, &response)
+	if err != nil {
+		return "", fmt.Errorf("unmarshal response: %w", err)
+	}
+
+	// 返回sn字段的值
+	return response.Results["sn"], nil
+}

+ 1 - 0
aarch64/pji/common/config/c_local.go

@@ -18,6 +18,7 @@ type restartCmd struct {
 }
 
 type localConfig struct {
+	Type                 string     `yaml:"type"`                    // 机器人类型(不同机器人获取sn码方式不同)
 	Node                 node       `yaml:"node"`                    // 节点信息
 	RosparamPath         string     `yaml:"rosparam-path"`           // 获取oss配置的url
 	UrlGetOssConfig      string     `yaml:"url-get-oss-config"`      // 获取oss配置的url

+ 0 - 178
aarch64/pji/common/config/yaml/pjibot-P1YNYD1M228000127-cloud-config.yaml

@@ -1,178 +0,0 @@
----
-monitor:
-  url: http://36.110.106.142:12341/web_server/monitor/insert
-platform:
-  url-device-auth: http://1.202.169.139:8081/device/auth
-  url-task-poll: http://1.202.169.139:8081/device/task/poll
-  url-task: http://1.202.169.139:8081/device/task
-
-bag-number: 60
-config-refresh-interval: 60
-disk:
-  name: /dev/mmcblk0p8 # 磁盘名称
-  used: 19000000000 # 磁盘占用阈值,单位bytes
-map-bag-path: /root/cicv-data-closedloop/map.bag
-tfstatic-bag-path: /root/cicv-data-closedloop/tf_static.bag
-costmap-bag-path: /root/cicv-data-closedloop/costmap.bag
-bag-data-dir: /root/cicv-data-closedloop/data/
-bag-copy-dir: /root/cicv-data-closedloop/copy/
-triggers-dir: /root/cicv-data-closedloop/triggers/
-time-window-send-gap: 6
-rpc-port: 12341
-ros:
-  master-address: 192.168.1.104:11311
-  nodes:
-    - /amcl
-    - /ob_camera_01/camera
-    - /ob_camera_02/camera
-    - /node_diagnostics
-    - /localization_monitor_node
-    - /move_base
-    - /sensor_fusion_node
-    - /ltme_node
-    - /scan_map_icp_amcl_node
-    - /monitor
-
-hosts:
-  - name: node1
-    ip: 192.168.1.104
-    rosbag:
-      path: "/opt/ros/melodic/bin/rosbag"
-      envs:
-        - "C_INCLUDE_PATH=/usr/include/drm:"
-        - "USER=root"
-        - "ROS_PACKAGE_PATH=/opt/ros/melodic/share"
-        - "LD_LIBRARY_PATH=/opt/ros/melodic/lib:/opt/ros/melodic/lib/aarch64-linux-gnu"
-        - "ROS_ETC_DIR=/opt/ros/melodic/etc/ros"
-        - "SHLVL=1"
-        - "HOME=/root"
-        - "ROS_PYTHON_VERSION=2"
-        - "PCMANFM_OUTLINE_MODE=on"
-        - "CPLUS_INCLUDE_PATH=/usr/include/drm:"
-        - "ROS_DISTRO=melodic"
-        - "ROS_VERSION=1"
-        - "PKG_CONFIG_PATH=/opt/ros/melodic/lib/pkgconfig"
-        - "PATH=/opt/ros/melodic/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/go/bin:/root/go/bin"
-        - "ROS_ROOT=/opt/ros/melodic/share/ros"
-        - "ROSLISP_PACKAGE_DIRECTORIES="
-        - "ROS_MASTER_URI=http://192.168.1.104:11311"
-        - "PYTHONPATH=/opt/ros/melodic/lib/python2.7/dist-packages"
-        - "ROS_HOSTNAME=192.168.1.104"
-        - "CMAKE_PREFIX_PATH=/opt/ros/melodic"
-    topics:
-      - /amcl_pose # /amcl
-      - /ob_camera_01/color/image_raw # /ob_camera_01/camera
-      #      - /ob_camera_01/depth/points # /ob_camera_01/camera
-      - /ob_camera_02/color/image_raw # /ob_camera_02/camera
-      #      - /ob_camera_02/depth/points # /ob_camera_02/camera
-      - /diagnostics # /amcl /node_diagnostics
-      - /locate_info # /localization_monitor_node
-      - /obstacle_detection # /move_base
-      - /odom # /sensor_fusion_node
-      - /move_base/global_costmap/costmap # /move_base # 只有1帧
-      - /move_base/global_costmap/costmap_updates # /move_base
-      - /move_base/local_costmap/costmap # /move_base
-      - /move_base/local_costmap/costmap_updates # /move_base
-      - /scan # /ltme_node
-      - /scan_map_icp_amcl_node/scan_point_transformed # /scan_map_icp_amcl_node
-      - /sys_info
-      #      - /cmd_vel
-      - /imu
-      # 算法评价新增
-      - /depth_scan_02
-      - /map # 只有1帧
-      - /scan_filtered
-      - /sonar_left
-      - /sonar_right
-      - /sonar_mid
-      - /sonar_rmid
-      - /tf
-      - /tf_static # 只有1帧
-      - /cmd_vel
-      - /move_base/DWAPlannerROS/global_plan
-      - /move_base/DWAPlannerROS/local_plan
-      - /move_base/GlobalPlanner/plan
-      - /move_base/global_costmap/footprint
-      - /move_base/local_costmap/footprint
-      - /robot_pose_tf
-
-
-full-collect: true # 控制是否根据不同的触发器采集不通的topic,一般设置为true,即忽略下面的配置
-triggers:
-  - label: detectfault
-    topics:
-      - /camera/color/image_raw
-      - /camera/depth/points
-      - /diagnostics
-      - /locate_info
-      - /obstacle_detection
-      - /odom
-      - /move_base/global_costmap/costmap
-      - /move_base/global_costmap/costmap_updates
-      - /scan_map_icp_amcl_node/scan_point_transformed
-  - label: unstabledriving
-    topics:
-      - /camera/color/image_raw
-      - /camera/depth/points
-      - /diagnostics
-      - /locate_info
-      - /obstacle_detection
-      - /odom
-      - /move_base/global_costmap/costmap
-      - /move_base/global_costmap/costmap_updates
-      - /scan_map_icp_amcl_node/scan_point_transformed
-  - label: locationfailed
-    topics:
-      - /camera/color/image_raw
-      - /camera/depth/points
-      - /diagnostics
-      - /locate_info
-      - /obstacle_detection
-      - /odom
-      - /move_base/global_costmap/costmap
-      - /move_base/global_costmap/costmap_updates
-      - /scan_map_icp_amcl_node/scan_point_transformed
-  - label: obstacledetection
-    topics:
-      - /camera/color/image_raw
-      - /camera/depth/points
-      - /diagnostics
-      - /locate_info
-      - /obstacle_detection
-      - /odom
-      - /move_base/global_costmap/costmap
-      - /move_base/global_costmap/costmap_updates
-      - /scan_map_icp_amcl_node/scan_point_transformed
-  - label: overspeed
-    topics:
-      - /camera/color/image_raw
-      - /camera/depth/points
-      - /diagnostics
-      - /locate_info
-      - /obstacle_detection
-      - /odom
-      - /move_base/global_costmap/costmap
-      - /move_base/global_costmap/costmap_updates
-      - /scan_map_icp_amcl_node/scan_point_transformed
-  - label: cpuoveroccupied
-    topics:
-      - /camera/color/image_raw
-      - /camera/depth/points
-      - /diagnostics
-      - /locate_info
-      - /obstacle_detection
-      - /odom
-      - /move_base/global_costmap/costmap
-      - /move_base/global_costmap/costmap_updates
-      - /scan_map_icp_amcl_node/scan_point_transformed
-  - label: memoveroccupied
-    topics:
-      - /camera/color/image_raw
-      - /camera/depth/points
-      - /diagnostics
-      - /locate_info
-      - /obstacle_detection
-      - /odom
-      - /move_base/global_costmap/costmap
-      - /move_base/global_costmap/costmap_updates
-      - /scan_map_icp_amcl_node/scan_point_transformed

+ 0 - 17
aarch64/pji/common/config/yaml/pjibot-P1YNYD1M228000127-local-config.yaml

@@ -1,17 +0,0 @@
-node:
-  name: node1
-  ip: 192.168.1.104
-rosparam-path: /opt/ros/melodic/bin/rosparam
-# 获取oss连接信息的接口url
-url-get-oss-config: http://36.110.106.156:18379/oss/config?token=nXonLUcMtGcrQqqKiyygIwyVbvizE0wD
-# 朴津机器人数据前缀
-oss-base-prefix: pjibot/
-# oss上的配置文件的名称
-cloud-config-filename: cloud-config.yaml
-# 将oss上的配置文件下载到本地的路径
-cloud-config-local-path: /root/cicv-data-closedloop/config/cloud-config.yaml
-restart-cmd:
-  dir: "/root/cicv-data-closedloop/"
-  name: "sh"
-  args:
-    - "start-master.sh"

+ 1 - 1
aarch64/pji/common/config/yaml/巡检机器人默认配置文件-local-config.yaml

@@ -1,8 +1,8 @@
+type: 3 # 机器人类型 1 引导机器人 2 配送机器人 3 巡检机器人
 node:
   name: node1
   ip: 192.168.1.104
 rosparam-path: /opt/ros/melodic/bin/rosparam
-type: 1 # 机器人类型 1 引导机器人 2 配送机器人 3 巡检机器人
 # 获取oss连接信息的接口url
 #url-get-oss-config: http://36.110.106.156:18379/oss/config?token=nXonLUcMtGcrQqqKiyygIwyVbvizE0wD # 国汽数据闭环
 url-get-oss-config: http://36.110.106.156:18379/oss/pji?token=nXonLUcMtGcrQqqKiyygIwyVbvizE0wD # 朴津数据闭环

+ 0 - 0
aarch64/pji/common/config/yaml/单摄像头-cloud-config.yaml → aarch64/pji/common/config/yaml/引导机器人默认配置文件单摄像头-cloud-config.yaml


+ 1 - 0
aarch64/pji/common/config/yaml/单摄像头-local-config.yaml → aarch64/pji/common/config/yaml/引导机器人默认配置文件单摄像头-local-config.yaml

@@ -1,3 +1,4 @@
+type: 1 # 机器人类型 1 引导机器人 2 配送机器人 3 巡检机器人
 node:
   name: node1
   ip: 192.168.1.104

+ 0 - 0
aarch64/pji/common/config/yaml/双摄像头-cloud-config.yaml → aarch64/pji/common/config/yaml/引导机器人默认配置文件双摄像头-cloud-config.yaml


+ 1 - 0
aarch64/pji/common/config/yaml/双摄像头-local-config.yaml → aarch64/pji/common/config/yaml/引导机器人默认配置文件双摄像头-local-config.yaml

@@ -1,3 +1,4 @@
+type: 1 # 机器人类型 1 引导机器人 2 配送机器人 3 巡检机器人
 node:
   name: node1
   ip: 192.168.1.104

+ 1 - 0
aarch64/pji/common/config/yaml/配送机器人默认配置文件-local-config.yaml

@@ -1,3 +1,4 @@
+type: 2 # 机器人类型 1 引导机器人 2 配送机器人 3 巡检机器人
 node:
   name: node1
   ip: 192.168.1.104

+ 2 - 2
amd64/score_server/handler/h_exam.go

@@ -62,7 +62,7 @@ func Tick(c *gin.Context) {
 				// 添加队伍名到缓存中
 				cacheTeamName.Store(teamName, time.Now())
 				// 更新记录结束时间为默认时间
-				sqlTemplate, _ := util.ReadFile(c_db.SqlFilesMap["exam-update-end_time-by-id.sql"])
+				sqlTemplate, _ := util.ReadFile(c_db.SqlFilesMap["exam-reset-by-id.sql"])
 				if err := c_db.DoTx(sqlTemplate, []any{
 					defaultTime,
 					result[0].Id,
@@ -114,7 +114,7 @@ func Tick(c *gin.Context) {
 				cacheTeamName.Store(teamName, time.Now())
 				//cacheTeamName[teamName] = time.Now()
 				// 更新记录结束时间为默认时间
-				sqlTemplate, _ := util.ReadFile(c_db.SqlFilesMap["exam-update-end_time-by-id.sql"])
+				sqlTemplate, _ := util.ReadFile(c_db.SqlFilesMap["exam-reset-by-id.sql"])
 				if err := c_db.DoTx(sqlTemplate, []any{
 					defaultTime,
 					result[0].Id,

+ 6 - 0
amd64/score_server/sql/exam-reset-by-id.sql

@@ -0,0 +1,6 @@
+update exam
+set end_time     = ?,
+    score_online = 0,
+    details      = null
+where id = ?
+