start_project.go 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. package handler
  2. import (
  3. "cicv-data-closedloop/amd64/dispatch_server/package/domain"
  4. entity2 "cicv-data-closedloop/amd64/dispatch_server/package/entity"
  5. "cicv-data-closedloop/amd64/dispatch_server/package/global"
  6. "cicv-data-closedloop/amd64/dispatch_server/package/infra"
  7. "cicv-data-closedloop/common/config/c_log"
  8. "cicv-data-closedloop/common/entity"
  9. "github.com/gin-gonic/gin"
  10. "net/http"
  11. )
  12. /*
  13. {
  14. "projectId": "项目ID",
  15. "algorithmObjectKey": "算法在阿里云的存储路径",
  16. "userId": "用户ID",
  17. "parallelism": 10,
  18. "tasks": [
  19. {
  20. "info": {
  21. "project_id": "项目ID",
  22. "task_id": "任务ID",
  23. "task_path": "任务结果路径",
  24. "default_time": "最大仿真时间"
  25. },
  26. "scenario": {
  27. "scenario_osc": "xosc或xml路径",
  28. "scenario_odr": "xodr路径",
  29. "scenario_osgb": "osgb路径"
  30. },
  31. "vehicle": {
  32. "model": {
  33. "model_label": "模型标签"
  34. },
  35. "dynamics": {
  36. "dynamics_maxspeed": 0.0, //最大速度(千米/小时)
  37. "dynamics_enginepower": 0.0, // 发动机功率(千瓦)
  38. "dynamics_maxdecel": 0.0, // 最大减速度(米/秒2)
  39. "dynamics_maxsteering": 0.0, // 最大减速度(米/秒2)
  40. "dynamics_mass": 0.0, // 质量(千克)
  41. "dynamics_frontsurfaceeffective": 0.0, // 前表面有效面积(平方米)
  42. "dynamics_airdragcoefficient": 0.0, // 空气阻力系数
  43. "dynamics_rollingresistance": 0.0, // 滚动阻力系数
  44. "dynamics_wheeldiameter": 0.0, // 车轮直径(米)
  45. "dynamics_wheeldrive": "wheel_drive_front", // 驱动方式
  46. "dynamics_overallefficiency": 0.0, // 总效率
  47. "dynamics_distfront": 0.0, // 车前距(米)
  48. "dynamics_distrear": 0.0, // 车后距(米)
  49. "dynamics_distleft": 0.0, // 车左距(米)
  50. "dynamics_distright": 0.0, // 车右距(米)
  51. "dynamics_distheight": 0.0, // 车高(米)
  52. "dynamics_wheelbase": 0.0 // 轴距(米)
  53. },
  54. "sensors": {
  55. "camera": [
  56. {
  57. "sensor_name": "",
  58. "sensor_near": 0,
  59. "sensor_far": 0,
  60. "sensor_x": 0,
  61. "sensor_y": 0,
  62. "sensor_z": 0,
  63. "sensor_h": 0,
  64. "sensor_p": 0,
  65. "sensor_r": 0,
  66. "sensor_fovH": 0, // 水平视场角
  67. "sensor_fovV": 0, // 垂直视场角
  68. "sensor_resolution": 0, // 水平视场角偏移量
  69. "sensor_frameRate": 0 // 垂直视场角偏移量
  70. }
  71. ],
  72. "OGT": [
  73. {
  74. "sensor_name": "", // 传感器名称
  75. "sensor_near": 0, // 盲区距离
  76. "sensor_far": 0, // 探测距离
  77. "sensor_x": 0, // 传感器横向偏移量(x轴)
  78. "sensor_y": 0, // 传感器纵向偏移量(y轴)
  79. "sensor_z": 0, // 传感器安装高度(z轴)
  80. "sensor_h": 0, // 传感器横摆角
  81. "sensor_p": 0, // 传感器俯仰角
  82. "sensor_r": 0, // 传感器横滚角
  83. "sensor_fovHLeft": 0, // 水平现场角左
  84. "sensor_fovHRight": 0, // 水平现场角右
  85. "sensor_fovVTop": 0, // 垂直现场角顶
  86. "sensor_fovVBottom": 0, // 垂直现场角底
  87. "sensor_filter": "0,5,6", // 目标物筛选序列(0,1,2)
  88. "sensor_display": false, // 显示目标物
  89. "sensor_maxObjects": 0, // 最大目标物个数
  90. "sensor_port": 0 // 端口
  91. },
  92. {
  93. "sensor_name": "",
  94. "sensor_near": 0,
  95. "sensor_far": 0,
  96. "sensor_x": 0,
  97. "sensor_y": 0,
  98. "sensor_z": 0,
  99. "sensor_h": 0,
  100. "sensor_p": 0,
  101. "sensor_r": 0,
  102. "sensor_fovHLeft": 0,
  103. "sensor_fovHRight": 0,
  104. "sensor_fovVTop": 0,
  105. "sensor_fovVBottom": 0,
  106. "sensor_filter": "1,2,3,4",
  107. "sensor_display": false,
  108. "sensor_maxObjects": 0,
  109. "sensor_port": 0
  110. }
  111. ]
  112. }
  113. }
  114. }
  115. ]
  116. }
  117. */
  118. func StartProject(c *gin.Context) {
  119. projectStartParam := new(entity2.Project)
  120. if err := c.ShouldBindJSON(&projectStartParam); err != nil {
  121. c_log.GlobalLogger.Error("项目启动接收请求参数报错:", err)
  122. c.JSON(http.StatusBadRequest, entity.HttpResult{Status: false, Code: "1003", Message: "请求参数格式错误。"})
  123. return
  124. }
  125. // ------------ 维护一个运行任务队列,绑定用户id和节点名称,供下面两个判断同时使用(使用redis的队列)
  126. userId := projectStartParam.UserId // 用户ID
  127. taskReceived := projectStartParam.Tasks // 接收到的所有任务
  128. userParallelism := projectStartParam.Parallelism // 用户的并行度上限
  129. // 1 判断用户并行度
  130. for _, task := range taskReceived {
  131. global.RunTaskMutex.Lock()
  132. // 1 判断用户并行度是否有剩余,有剩余则加入集群等待队列,并从用户等待队列中拿出,没有剩余则不需要改动
  133. if domain.CanRun(userId, userParallelism) { // 可以运行
  134. err := domain.AddWaitingCluster(userId, userParallelism, task)
  135. if err != nil {
  136. infra.GlobalLogger.Errorf("将任务 %v 添加到集群等待队列失败,错误信息为:%v", task, err)
  137. continue
  138. }
  139. } else { // 不能运行
  140. err := domain.AddWaitingUser(userId, userParallelism, task)
  141. if err != nil {
  142. infra.GlobalLogger.Errorf("将任务 %v 添加到集群等待队列失败,错误信息为:%v", task, err)
  143. continue
  144. }
  145. }
  146. global.RunTaskMutex.Unlock()
  147. }
  148. // 4 返回
  149. c.JSON(http.StatusOK, entity.HttpResult{Status: true, Code: "2000", Message: "项目启动请求已被成功接收,等待调度处理。"})
  150. }