소스 검색

生成视频

root 2 년 전
부모
커밋
3a74af6d47

+ 9 - 5
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/feign/VideoService.java

@@ -3,17 +3,21 @@ package com.css.simulation.resource.scheduler.feign;
 import api.common.pojo.common.ResponseBodyVO;
 import com.css.simulation.resource.scheduler.feign.fallback.VideoServiceFallBack;
 import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 
 @FeignClient(
-        contextId = "algoPlatform",
+        contextId = "video",
         value = "simulation-resource-video",
         path = "/simulation/resource/video",
         fallback = VideoServiceFallBack.class
 )
 public interface VideoService {
 
-    @PostMapping(value = "/generate")
-    ResponseBodyVO<String> generateVideo(@RequestBody String param);
+    @GetMapping(value = "/generate")
+    ResponseBodyVO<String> generateVideo(
+           @RequestParam("projectId") String projectId,
+           @RequestParam("projectType") String projectType,
+           @RequestParam("taskId") String taskId
+    );
 }

+ 1 - 1
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/feign/fallback/VideoServiceFallBack.java

@@ -6,7 +6,7 @@ import com.css.simulation.resource.scheduler.feign.VideoService;
 
 public class VideoServiceFallBack implements VideoService {
     @Override
-    public ResponseBodyVO<String> generateVideo(String param) {
+    public ResponseBodyVO<String> generateVideo(String projectId, String projectType, String taskId) {
         return new ResponseBodyVO<>(ResponseBodyVO.Response.SERVER_FAILURE);
     }
 }

+ 4 - 4
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/manager/TaskManager.java

@@ -3,6 +3,7 @@ package com.css.simulation.resource.scheduler.manager;
 import api.common.pojo.constants.DictConstants;
 import api.common.pojo.dto.ProjectMessageDTO;
 import api.common.util.*;
+import com.css.simulation.resource.scheduler.feign.VideoService;
 import com.css.simulation.resource.scheduler.mapper.AutoSubProjectMapper;
 import com.css.simulation.resource.scheduler.mapper.IndexMapper;
 import com.css.simulation.resource.scheduler.mapper.ManualProjectMapper;
@@ -13,7 +14,6 @@ import com.css.simulation.resource.scheduler.pojo.po.ProjectPO;
 import com.css.simulation.resource.scheduler.pojo.po.TaskPO;
 import com.css.simulation.resource.scheduler.pojo.to.PrefixTO;
 import com.css.simulation.resource.scheduler.pojo.to.ScoreTO;
-import com.css.simulation.resource.scheduler.service.VideoService;
 import com.css.simulation.resource.scheduler.util.MinioUtil;
 import com.css.simulation.resource.scheduler.util.ProjectUtil;
 import com.css.simulation.resource.scheduler.util.RedisUtil;
@@ -132,8 +132,8 @@ public class TaskManager {
                     taskMapper.updateFailStateWithStopTime(taskId, state, TimeUtil.getNowForMysql(), DictConstants.TASK_ERROR_REASON_3);
                 } else if ("PendingAnalysis".equals(state)) {
                     taskMapper.updateSuccessStateWithStopTime(taskId, state, TimeUtil.getNowForMysql());
-//                    // 创建视频和生成
-//                    videoService.generateVideo(projectId,projectType,taskId);
+                    // 创建视频和生成
+                    videoService.generateVideo(projectId, projectType, taskId);
                 }
                 // -------------------------------- 判断项目是否结束 --------------------------------
                 ProjectMessageDTO projectMessageDTO = JsonUtil.jsonToBean(stringRedisTemplate.opsForValue().get(redisPrefix.getProjectRunningKey()), ProjectMessageDTO.class);
@@ -156,7 +156,7 @@ public class TaskManager {
                     return false;
                 }
             } catch (Exception exception) {
-                log.info("TaskManager--isCompleted pod " + podName + " 已经被手动删除,该项目可能已被终止。", exception);
+                log.info("TaskManager--isCompleted 报错。", exception);
                 return false;
             }
         }

+ 4 - 2
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/service/ProjectService.java

@@ -227,13 +227,15 @@ public class ProjectService {
                 String osgbName = splitOsgb[splitOsgb.length - 1];
                 try {
                     String xodrPathOfLinux = linuxTempPath + "video/" + projectId + "/" + taskId + "/" + xodrName;
-                    String xodrPathOfMinio = projectResultPathOfMinio + projectId + "/" + taskId + "/" + xodrName;
+                    String xodrPathOfMinio = projectResultPathOfMinio + projectId + "/" + taskId + "/" + taskId+".xodr";
                     String osgbPathOfLinux = linuxTempPath + "video/" + projectId + "/" + taskId + "/" + osgbName;
-                    String osgbPathOfMinio = projectResultPathOfMinio + projectId + "/" + taskId + "/" + osgbName;
+                    String osgbPathOfMinio = projectResultPathOfMinio + projectId + "/" + taskId + "/" + taskId+".osgb";
                     MinioUtil.downloadToFile(minioClient, bucketName, scenarioOdr, xodrPathOfLinux);
                     MinioUtil.downloadToFile(minioClient, bucketName, scenarioOdr, osgbPathOfLinux);
                     MinioUtil.uploadFromFile(minioClient, xodrPathOfLinux, bucketName, xodrPathOfMinio);
                     MinioUtil.uploadFromFile(minioClient, osgbPathOfLinux, bucketName, osgbPathOfMinio);
+                    log.info("ProjectService--sendTaskMessage 已经将 xodr 上传到 minio 的结果文件目录:" + xodrPathOfMinio);
+                    log.info("ProjectService--sendTaskMessage 已经将 osgb 上传到 minio 的结果文件目录:" + osgbPathOfMinio);
                 } catch (IOException | ServerException | InsufficientDataException | ErrorResponseException |
                          NoSuchAlgorithmException | InvalidKeyException | InvalidResponseException |
                          XmlParserException | InternalException e) {

+ 334 - 334
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/service/VideoService.java

@@ -1,334 +1,334 @@
-package com.css.simulation.resource.scheduler.service;
-
-import api.common.pojo.po.scene.VehicleTypePO;
-import api.common.pojo.vo.model.VehicleVO;
-import api.common.util.FileUtil;
-import api.common.util.LinuxUtil;
-import com.css.simulation.resource.scheduler.mapper.ConfigMapper;
-import com.css.simulation.resource.scheduler.mapper.SimulationAutomaticProjectMapper;
-import com.css.simulation.resource.scheduler.mapper.VehicleMapper;
-import com.css.simulation.resource.scheduler.util.MinioUtil;
-import io.minio.MinioClient;
-import lombok.SneakyThrows;
-import org.dom4j.Attribute;
-import org.dom4j.Document;
-import org.dom4j.Element;
-import org.dom4j.io.OutputFormat;
-import org.dom4j.io.SAXReader;
-import org.dom4j.io.XMLWriter;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
-import java.io.File;
-import java.io.OutputStreamWriter;
-import java.io.Writer;
-import java.math.BigDecimal;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.Iterator;
-
-@Service
-public class VideoService {
-    @Resource
-    VehicleMapper vehicleMapper;
-    @Resource
-    ConfigMapper configMapper;
-    @Resource
-    SimulationAutomaticProjectMapper simulationAutomaticProjectMapper;
-    @Resource
-    MinioClient minioClient;
-
-
-    //* -------------------------------- Comment --------------------------------
-
-    public static final String oldXoscName = "simulation_my0.xosc";
-    public static final String newXoscName = "simulation_my05.xosc";
-    public static final String oldXoscRelativePath = "xosc/simulation_my0.xosc";
-    public static final String[] csvNameArray = {"Ego.csv", "evaluation.csv"};
-
-    //* -------------------------------- Comment --------------------------------
-    @Value("${scheduler.linux-path.temp}")
-    String linuxTempPath;
-    @Value("${scheduler.minio-path.project-result}")
-    String projectResultPathOfMinio;
-    @Value("${minio.bucket-name}")
-    String bucketName;
-
-
-    /**
-     * 生成视频
-     */
-    @SneakyThrows
-    public void generateVideo(String projectId, String projectType, String taskId) {
-        //1 获取两个 csv 的目录,和 xodr 和 osgb 三个路径
-        String csvDirectoryPath = linuxTempPath + "video/" + projectId + "/" + taskId + "/";
-        String xodrPath = FileUtil.listAbsolutePathByFiletype(csvDirectoryPath, ".xodr").get(0);    // xodr 文件在创建项目时已经下载好了
-        String osgbPath = FileUtil.listAbsolutePathByFiletype(csvDirectoryPath, ".osgb").get(0);    // osgb 文件在创建项目时已经下载好了
-        //2 下载 csv 文件
-        for (String csvName : csvNameArray) {
-            MinioUtil.downloadToFile(minioClient, bucketName, projectResultPathOfMinio + projectId + "/" + taskId + "/" + csvName, csvDirectoryPath + "/" + csvName);
-        }
-        //3 生成 xosc 文件
-        String xoscPath = generateXosc(csvDirectoryPath, xodrPath, osgbPath, projectId, projectType);
-        //4 生成图片
-        String pictureDirectoryPath = csvDirectoryPath + "picture";
-        FileUtil.createDirectory(pictureDirectoryPath);
-        String esminiCommand =  "/root/disk1/simulation-cloud/esmini/build/EnvironmentSimulator/code-examples/image-capture/image-capture "
-                + xoscPath + " " + pictureDirectoryPath + "/screenshot";
-        String esminiResult = LinuxUtil.execute(esminiCommand);
-        //5 生成视频
-        String videoName = "simulation_output.mp4";
-        String videoTargetPathOfLinux = csvDirectoryPath + "video";
-        FileUtil.createDirectory(videoTargetPathOfLinux);
-        String videoTargetPathOfMinio = projectResultPathOfMinio + projectId + "/" + taskId + "/" + videoName;
-
-        String execute = LinuxUtil.execute("ffmpeg"
-                + " -f image2 -framerate 30 "
-                + " -i " + pictureDirectoryPath + "/screenshot_%05d.tga"
-                + " -c:v libx264 -vf format=yuv420p -crf 20 "
-                + videoTargetPathOfLinux + "/" + videoName
-        );
-        //6 将视频上传到 minio
-        MinioUtil.uploadFromFile(minioClient, videoTargetPathOfLinux + videoName, bucketName, videoTargetPathOfMinio);
-    }
-
-    /**
-     * Xosc
-     */
-    @SneakyThrows
-    private String generateXosc(String csvDirectoryPath, String xodrPath, String osgbPath, String projectId, String projectType) {
-        //1 生成 xosc 文件
-        String command = "D:\\Users\\anaconda3\\envs\\flaskProject\\python.exe C:/Users/CSS/Desktop/simulation/gqSw/simulation_my.py " + csvDirectoryPath;
-        String execute = LinuxUtil.execute(command);    // 执行命令后生成 xosc 到目录下
-        String oldXoscPath = csvDirectoryPath + oldXoscRelativePath;  // 生成文件的路径是固定的
-        //2 调用修改xosc
-        return modifyXosc(oldXoscPath, xodrPath, osgbPath, projectId, projectType);  // 返回最新的xosc文件全路径
-    }
-
-
-    /**
-     * 修改 xosc 文件
-     */
-    @SneakyThrows
-    private String modifyXosc(String oldXoscPath, String xodrPath, String osgbPath, String projectId, String projectType) {
-        String newXoscPath = oldXoscPath.replace(oldXoscName, newXoscName);
-        //获取三维自车对象
-        VehicleTypePO po = vehicleById(projectId, projectType);
-
-        //1 创建Reader对象
-        SAXReader reader = new SAXReader();
-        //2 加载xml
-        // Document document = reader.read(new File("D:\\simulation_my0.xosc"));
-        Document document = reader.read(new File(oldXoscPath));
-        //3 获取根节点
-        Element root = document.getRootElement();
-        Iterator<Element> iterator0 = root.elementIterator();
-        while (iterator0.hasNext()) {   // 第一层遍历
-            Element node1 = iterator0.next();
-            if ("Entities".equals(node1.getName())) { // 找到第一层节点后进入第二层遍历
-                Iterator<Element> iterator1 = node1.elementIterator();
-                while (iterator1.hasNext()) {
-                    Element node2 = iterator1.next();
-                    // 添加节点
-                    if ("ScenarioObject".equals(node2.getName())) {
-                        String scenarioObjectName = node2.attribute("name").getValue();
-                        if (scenarioObjectName.equals("Ego")) {
-                            Iterator<Element> iterator2 = node2.elementIterator();
-                            while (iterator2.hasNext()) {
-                                Element node3 = iterator2.next();
-                                if ("Vehicle".equals(node3.getName())) {
-                                    Attribute name = node3.attribute("name");
-                                    name.setText("Audi_A3_2009_red");
-                                    Attribute vehicleCategory = node3.attribute("vehicleCategory");
-                                    vehicleCategory.setText(po.getVehicleCategory());
-                                    node3.addAttribute("model3d",po.getModel3d());//自车渲染
-                                    Iterator<Element> iterator4 = node3.elementIterator();
-                                    while (iterator4.hasNext()) {
-                                        Element node4 = iterator4.next();
-                                        if ("Performance".equals(node4.getName())) {
-                                            Attribute maxSpeed = node4.attribute("maxSpeed");
-                                            maxSpeed.setText(po.getPerformanceMaxSpeed() + "");
-                                            Attribute maxDeceleration = node4.attribute("maxDeceleration");
-                                            maxDeceleration.setText(po.getPerformanceMaxDeceleration() + "");
-                                            Attribute maxAcceleration = node4.attribute("maxAcceleration");
-                                            maxAcceleration.setText(po.getPerformanceMaxAcceleration());
-                                        } else if ("BoundingBox".equals(node4.getName())) {
-                                            Iterator<Element> iterator5 = node4.elementIterator();
-                                            while (iterator5.hasNext()) {
-                                                Element node5 = iterator5.next();
-                                                if ("Center".equals(node5.getName())) {
-                                                    Attribute x = node5.attribute("x");
-                                                    x.setText(po.getCenterX() + "");
-                                                    Attribute y = node5.attribute("y");
-                                                    y.setText(po.getCenterY() + "");
-                                                    Attribute z = node5.attribute("z");
-                                                    z.setText(po.getCenterZ() + "");
-                                                }
-                                                if ("Dimensions".equals(node5.getName())) {
-                                                    Attribute width = node5.attribute("width");
-                                                    width.setText(po.getDimensionsWidth() + "");
-                                                    Attribute length = node5.attribute("length");
-                                                    length.setText(po.getDimensionsHeight() + "");
-                                                    Attribute height = node5.attribute("height");
-                                                    height.setText(po.getDimensionsHeight() + "");
-                                                }
-                                            }
-                                        } else if ("Axles".equals(node4.getName())) {
-                                            Iterator<Element> iterator5 = node4.elementIterator();
-                                            while (iterator5.hasNext()) {
-                                                Element node5 = iterator5.next();
-                                                if ("FrontAxle".equals(node5.getName())) {
-                                                    Attribute maxSteering = node5.attribute("maxSteering");
-                                                    maxSteering.setText(po.getFrontAxleMaxSteering() + "");
-                                                    Attribute wheelDiameter = node5.attribute("wheelDiameter");
-                                                    wheelDiameter.setText(po.getFrontAxleWheelDiameter() + "");
-                                                    Attribute trackWidth = node5.attribute("trackWidth");
-                                                    trackWidth.setText(po.getFrontAxleTrackWidth() + "");
-                                                    Attribute positionX = node5.attribute("positionX");
-                                                    positionX.setText(po.getFrontAxlePositionX() + "");
-                                                    Attribute positionZ = node5.attribute("positionZ");
-                                                    positionZ.setText(po.getFrontAxlePositionZ() + "");
-                                                }
-                                                if ("RearAxle".equals(node5.getName())) {
-                                                    Attribute maxSteering = node5.attribute("maxSteering");
-                                                    maxSteering.setText(po.getRearAxleMaxSteering());
-                                                    Attribute wheelDiameter = node5.attribute("wheelDiameter");
-                                                    wheelDiameter.setText(po.getRearAxleWheelDiameter() + "");
-                                                    Attribute trackWidth = node5.attribute("trackWidth");
-                                                    trackWidth.setText(po.getRearAxleTrackWidth() + "");
-                                                    Attribute positionX = node5.attribute("positionX");
-                                                    positionX.setText(po.getRearAxlePositionX() + "");
-                                                    Attribute positionZ = node5.attribute("positionZ");
-                                                    positionZ.setText(po.getRearAxlePositionZ() + "");
-                                                }
-                                            }
-                                        }
-
-                                    }
-                                }
-
-                            }
-
-                            // 保存文件
-                            // Writer osWrite = new OutputStreamWriter(Files.newOutputStream(Paths.get("D:\\simulation_my0000.xosc")));// 创建输出流
-
-                        }
-                    }
-                }
-            }
-
-            if ("RoadNetwork".equals(node1.getName())) { // 找到第一层节点后进入第二层遍历
-                Iterator<Element> iterator1 = node1.elementIterator();
-                while (iterator1.hasNext()) {
-                    Element node2 = iterator1.next();
-                    // 添加节点
-                    if ("LogicFile".equals(node2.getName())) {
-                        Attribute name = node2.attribute("filepath");
-                        name.setText(xodrPath);
-                    }
-                    if ("SceneGraphFile".equals(node2.getName())) {
-                        Attribute name = node2.attribute("filepath");
-                        name.setText(osgbPath);
-                    }
-                }
-            }
-
-            Writer osWrite = new OutputStreamWriter(Files.newOutputStream(Paths.get(newXoscPath)));
-            OutputFormat format = OutputFormat.createPrettyPrint(); // 获取输出的指定格式
-            format.setEncoding("UTF-8");// 设置编码 ,确保解析的xml为UTF-8格式
-            XMLWriter writer = new XMLWriter(osWrite, format);// XMLWriter
-            writer.write(document);// 把document写入xmlFile指定的文件(可以为被解析的文件或者新创建的文件)
-            writer.flush();
-            writer.close();
-        }
-        return newXoscPath;
-    }
-
-
-    //获取三维自车对象
-    @SneakyThrows
-    private VehicleTypePO vehicleById(String projectId, String projectType) {
-        VehicleTypePO po = new VehicleTypePO();
-        //项目类型 1.手动;2.自动
-        String vehicle = "";
-        if (projectType.equals("1")) {
-            vehicle = simulationAutomaticProjectMapper.vehicleBySdId(projectId);
-        } else if (projectType.equals("2")) {
-            vehicle = simulationAutomaticProjectMapper.vehicleByZdId(projectId);
-        }
-        String vehicleId = configMapper.getVehicleId(vehicle);
-
-        VehicleVO vehicleInfo = vehicleMapper.getVehicleInfo(vehicleId);
-
-        //自车模型
-        String car = vehicleInfo.getVehicleTypeStr().substring(0, vehicleInfo.getVehicleTypeStr().indexOf(","));
-        car = car.substring(0, 1).toLowerCase() + car.substring(1);
-        if (car.contains("truck")) {
-            po.setVehicleCategory("truck");
-        } else if (car.contains("trailer")) {
-            po.setVehicleCategory("trailer");
-        } else if (car.contains("van")) {
-            po.setVehicleCategory("van");
-        } else if (car.contains("semitrailer")) {
-            po.setVehicleCategory("semitrailer");
-        } else if (car.contains("bus")) {
-            po.setVehicleCategory("bus");
-        } else if (car.contains("motorbike")) {
-            po.setVehicleCategory("motorbike");
-        } else if (car.contains("bicycle")) {
-            po.setVehicleCategory("bicycle");
-        } else if (car.contains("bicycle")) {
-            po.setVehicleCategory("bicycle");
-        } else if (car.contains("train")) {
-            po.setVehicleCategory("train");
-        } else if (car.contains("tram")) {
-            po.setVehicleCategory("tram");
-        } else {
-            po.setVehicleCategory("car");
-        }
-
-        //车前距
-        BigDecimal frontDistance = vehicleInfo.getFrontDistance();
-        //车后距
-        BigDecimal mo2 = new BigDecimal("2");
-        BigDecimal rearDistance = vehicleInfo.getRearDistance();
-        if (frontDistance.compareTo(rearDistance) > 0) {
-            BigDecimal CenterX = (frontDistance.add(rearDistance)).divide(mo2).subtract(rearDistance);
-            po.setCenterX(CenterX);
-        } else {
-            BigDecimal CenterX = (frontDistance.add(rearDistance)).divide(mo2).subtract(frontDistance);
-            po.setCenterX(CenterX);
-        }
-        //车高
-        BigDecimal mo3 = new BigDecimal("3");
-        po.setCenterZ(vehicleInfo.getHeightDistance().divide(mo3));
-        //车左距  车右距
-        BigDecimal LeftDistance = vehicleInfo.getLeftDistance();
-        BigDecimal RightDistance = vehicleInfo.getRightDistance();
-        po.setDimensionsWidth(LeftDistance.add(RightDistance));
-        po.setDimensionsHeight(vehicleInfo.getHeightDistance());
-        po.setDimensionsLength(frontDistance.add(rearDistance));
-
-        po.setPerformanceMaxSpeed(vehicleInfo.getMaxSpeed());
-        po.setPerformanceMaxDeceleration(vehicleInfo.getMaxDeceleration());
-        BigDecimal moπ = new BigDecimal("3.141516");
-        BigDecimal mo180 = new BigDecimal("180");
-        po.setFrontAxleMaxSteering(vehicleInfo.getMaxSteeringAngle().multiply(moπ).divide(mo180));
-        po.setFrontAxleWheelDiameter(vehicleInfo.getWheelDiameter());
-        BigDecimal mo4 = new BigDecimal("4");
-        BigDecimal mo5 = new BigDecimal("5");
-        po.setFrontAxleTrackWidth(LeftDistance.add(RightDistance).multiply(mo4).divide(mo5));
-        po.setFrontAxlePositionX(po.getCenterX());
-        po.setFrontAxlePositionZ(po.getCenterZ());
-
-        po.setRearAxleWheelDiameter(vehicleInfo.getWheelDiameter());
-        po.setRearAxleTrackWidth(po.getFrontAxleTrackWidth());
-        po.setRearAxlePositionX(po.getFrontAxlePositionX());
-        po.setRearAxlePositionZ(po.getFrontAxlePositionZ());
-        return po;
-
-    }
-
-
-}
+//package com.css.simulation.resource.scheduler.service;
+//
+//import api.common.pojo.po.scene.VehicleTypePO;
+//import api.common.pojo.vo.model.VehicleVO;
+//import api.common.util.FileUtil;
+//import api.common.util.LinuxUtil;
+//import com.css.simulation.resource.scheduler.mapper.ConfigMapper;
+//import com.css.simulation.resource.scheduler.mapper.SimulationAutomaticProjectMapper;
+//import com.css.simulation.resource.scheduler.mapper.VehicleMapper;
+//import com.css.simulation.resource.scheduler.util.MinioUtil;
+//import io.minio.MinioClient;
+//import lombok.SneakyThrows;
+//import org.dom4j.Attribute;
+//import org.dom4j.Document;
+//import org.dom4j.Element;
+//import org.dom4j.io.OutputFormat;
+//import org.dom4j.io.SAXReader;
+//import org.dom4j.io.XMLWriter;
+//import org.springframework.beans.factory.annotation.Value;
+//import org.springframework.stereotype.Service;
+//
+//import javax.annotation.Resource;
+//import java.io.File;
+//import java.io.OutputStreamWriter;
+//import java.io.Writer;
+//import java.math.BigDecimal;
+//import java.nio.file.Files;
+//import java.nio.file.Paths;
+//import java.util.Iterator;
+//
+//@Service
+//public class VideoService {
+//    @Resource
+//    VehicleMapper vehicleMapper;
+//    @Resource
+//    ConfigMapper configMapper;
+//    @Resource
+//    SimulationAutomaticProjectMapper simulationAutomaticProjectMapper;
+//    @Resource
+//    MinioClient minioClient;
+//
+//
+//    //* -------------------------------- Comment --------------------------------
+//
+//    public static final String oldXoscName = "simulation_my0.xosc";
+//    public static final String newXoscName = "simulation_my05.xosc";
+//    public static final String oldXoscRelativePath = "xosc/simulation_my0.xosc";
+//    public static final String[] csvNameArray = {"Ego.csv", "evaluation.csv"};
+//
+//    //* -------------------------------- Comment --------------------------------
+//    @Value("${scheduler.linux-path.temp}")
+//    String linuxTempPath;
+//    @Value("${scheduler.minio-path.project-result}")
+//    String projectResultPathOfMinio;
+//    @Value("${minio.bucket-name}")
+//    String bucketName;
+//
+//
+//    /**
+//     * 生成视频
+//     */
+//    @SneakyThrows
+//    public void generateVideo(String projectId, String projectType, String taskId) {
+//        //1 获取两个 csv 的目录,和 xodr 和 osgb 三个路径
+//        String csvDirectoryPath = linuxTempPath + "video/" + projectId + "/" + taskId + "/";
+//        String xodrPath = FileUtil.listAbsolutePathByFiletype(csvDirectoryPath, ".xodr").get(0);    // xodr 文件在创建项目时已经下载好了
+//        String osgbPath = FileUtil.listAbsolutePathByFiletype(csvDirectoryPath, ".osgb").get(0);    // osgb 文件在创建项目时已经下载好了
+//        //2 下载 csv 文件
+//        for (String csvName : csvNameArray) {
+//            MinioUtil.downloadToFile(minioClient, bucketName, projectResultPathOfMinio + projectId + "/" + taskId + "/" + csvName, csvDirectoryPath + "/" + csvName);
+//        }
+//        //3 生成 xosc 文件
+//        String xoscPath = generateXosc(csvDirectoryPath, xodrPath, osgbPath, projectId, projectType);
+//        //4 生成图片
+//        String pictureDirectoryPath = csvDirectoryPath + "picture";
+//        FileUtil.createDirectory(pictureDirectoryPath);
+//        String esminiCommand =  "/root/disk1/simulation-cloud/esmini/build/EnvironmentSimulator/code-examples/image-capture/image-capture "
+//                + xoscPath + " " + pictureDirectoryPath + "/screenshot";
+//        String esminiResult = LinuxUtil.execute(esminiCommand);
+//        //5 生成视频
+//        String videoName = "simulation_output.mp4";
+//        String videoTargetPathOfLinux = csvDirectoryPath + "video";
+//        FileUtil.createDirectory(videoTargetPathOfLinux);
+//        String videoTargetPathOfMinio = projectResultPathOfMinio + projectId + "/" + taskId + "/" + videoName;
+//
+//        String execute = LinuxUtil.execute("ffmpeg"
+//                + " -f image2 -framerate 30 "
+//                + " -i " + pictureDirectoryPath + "/screenshot_%05d.tga"
+//                + " -c:v libx264 -vf format=yuv420p -crf 20 "
+//                + videoTargetPathOfLinux + "/" + videoName
+//        );
+//        //6 将视频上传到 minio
+//        MinioUtil.uploadFromFile(minioClient, videoTargetPathOfLinux + videoName, bucketName, videoTargetPathOfMinio);
+//    }
+//
+//    /**
+//     * Xosc
+//     */
+//    @SneakyThrows
+//    private String generateXosc(String csvDirectoryPath, String xodrPath, String osgbPath, String projectId, String projectType) {
+//        //1 生成 xosc 文件
+//        String command = "D:\\Users\\anaconda3\\envs\\flaskProject\\python.exe C:/Users/CSS/Desktop/simulation/gqSw/simulation_my.py " + csvDirectoryPath;
+//        String execute = LinuxUtil.execute(command);    // 执行命令后生成 xosc 到目录下
+//        String oldXoscPath = csvDirectoryPath + oldXoscRelativePath;  // 生成文件的路径是固定的
+//        //2 调用修改xosc
+//        return modifyXosc(oldXoscPath, xodrPath, osgbPath, projectId, projectType);  // 返回最新的xosc文件全路径
+//    }
+//
+//
+//    /**
+//     * 修改 xosc 文件
+//     */
+//    @SneakyThrows
+//    private String modifyXosc(String oldXoscPath, String xodrPath, String osgbPath, String projectId, String projectType) {
+//        String newXoscPath = oldXoscPath.replace(oldXoscName, newXoscName);
+//        //获取三维自车对象
+//        VehicleTypePO po = vehicleById(projectId, projectType);
+//
+//        //1 创建Reader对象
+//        SAXReader reader = new SAXReader();
+//        //2 加载xml
+//        // Document document = reader.read(new File("D:\\simulation_my0.xosc"));
+//        Document document = reader.read(new File(oldXoscPath));
+//        //3 获取根节点
+//        Element root = document.getRootElement();
+//        Iterator<Element> iterator0 = root.elementIterator();
+//        while (iterator0.hasNext()) {   // 第一层遍历
+//            Element node1 = iterator0.next();
+//            if ("Entities".equals(node1.getName())) { // 找到第一层节点后进入第二层遍历
+//                Iterator<Element> iterator1 = node1.elementIterator();
+//                while (iterator1.hasNext()) {
+//                    Element node2 = iterator1.next();
+//                    // 添加节点
+//                    if ("ScenarioObject".equals(node2.getName())) {
+//                        String scenarioObjectName = node2.attribute("name").getValue();
+//                        if (scenarioObjectName.equals("Ego")) {
+//                            Iterator<Element> iterator2 = node2.elementIterator();
+//                            while (iterator2.hasNext()) {
+//                                Element node3 = iterator2.next();
+//                                if ("Vehicle".equals(node3.getName())) {
+//                                    Attribute name = node3.attribute("name");
+//                                    name.setText("Audi_A3_2009_red");
+//                                    Attribute vehicleCategory = node3.attribute("vehicleCategory");
+//                                    vehicleCategory.setText(po.getVehicleCategory());
+//                                    node3.addAttribute("model3d",po.getModel3d());//自车渲染
+//                                    Iterator<Element> iterator4 = node3.elementIterator();
+//                                    while (iterator4.hasNext()) {
+//                                        Element node4 = iterator4.next();
+//                                        if ("Performance".equals(node4.getName())) {
+//                                            Attribute maxSpeed = node4.attribute("maxSpeed");
+//                                            maxSpeed.setText(po.getPerformanceMaxSpeed() + "");
+//                                            Attribute maxDeceleration = node4.attribute("maxDeceleration");
+//                                            maxDeceleration.setText(po.getPerformanceMaxDeceleration() + "");
+//                                            Attribute maxAcceleration = node4.attribute("maxAcceleration");
+//                                            maxAcceleration.setText(po.getPerformanceMaxAcceleration());
+//                                        } else if ("BoundingBox".equals(node4.getName())) {
+//                                            Iterator<Element> iterator5 = node4.elementIterator();
+//                                            while (iterator5.hasNext()) {
+//                                                Element node5 = iterator5.next();
+//                                                if ("Center".equals(node5.getName())) {
+//                                                    Attribute x = node5.attribute("x");
+//                                                    x.setText(po.getCenterX() + "");
+//                                                    Attribute y = node5.attribute("y");
+//                                                    y.setText(po.getCenterY() + "");
+//                                                    Attribute z = node5.attribute("z");
+//                                                    z.setText(po.getCenterZ() + "");
+//                                                }
+//                                                if ("Dimensions".equals(node5.getName())) {
+//                                                    Attribute width = node5.attribute("width");
+//                                                    width.setText(po.getDimensionsWidth() + "");
+//                                                    Attribute length = node5.attribute("length");
+//                                                    length.setText(po.getDimensionsHeight() + "");
+//                                                    Attribute height = node5.attribute("height");
+//                                                    height.setText(po.getDimensionsHeight() + "");
+//                                                }
+//                                            }
+//                                        } else if ("Axles".equals(node4.getName())) {
+//                                            Iterator<Element> iterator5 = node4.elementIterator();
+//                                            while (iterator5.hasNext()) {
+//                                                Element node5 = iterator5.next();
+//                                                if ("FrontAxle".equals(node5.getName())) {
+//                                                    Attribute maxSteering = node5.attribute("maxSteering");
+//                                                    maxSteering.setText(po.getFrontAxleMaxSteering() + "");
+//                                                    Attribute wheelDiameter = node5.attribute("wheelDiameter");
+//                                                    wheelDiameter.setText(po.getFrontAxleWheelDiameter() + "");
+//                                                    Attribute trackWidth = node5.attribute("trackWidth");
+//                                                    trackWidth.setText(po.getFrontAxleTrackWidth() + "");
+//                                                    Attribute positionX = node5.attribute("positionX");
+//                                                    positionX.setText(po.getFrontAxlePositionX() + "");
+//                                                    Attribute positionZ = node5.attribute("positionZ");
+//                                                    positionZ.setText(po.getFrontAxlePositionZ() + "");
+//                                                }
+//                                                if ("RearAxle".equals(node5.getName())) {
+//                                                    Attribute maxSteering = node5.attribute("maxSteering");
+//                                                    maxSteering.setText(po.getRearAxleMaxSteering());
+//                                                    Attribute wheelDiameter = node5.attribute("wheelDiameter");
+//                                                    wheelDiameter.setText(po.getRearAxleWheelDiameter() + "");
+//                                                    Attribute trackWidth = node5.attribute("trackWidth");
+//                                                    trackWidth.setText(po.getRearAxleTrackWidth() + "");
+//                                                    Attribute positionX = node5.attribute("positionX");
+//                                                    positionX.setText(po.getRearAxlePositionX() + "");
+//                                                    Attribute positionZ = node5.attribute("positionZ");
+//                                                    positionZ.setText(po.getRearAxlePositionZ() + "");
+//                                                }
+//                                            }
+//                                        }
+//
+//                                    }
+//                                }
+//
+//                            }
+//
+//                            // 保存文件
+//                            // Writer osWrite = new OutputStreamWriter(Files.newOutputStream(Paths.get("D:\\simulation_my0000.xosc")));// 创建输出流
+//
+//                        }
+//                    }
+//                }
+//            }
+//
+//            if ("RoadNetwork".equals(node1.getName())) { // 找到第一层节点后进入第二层遍历
+//                Iterator<Element> iterator1 = node1.elementIterator();
+//                while (iterator1.hasNext()) {
+//                    Element node2 = iterator1.next();
+//                    // 添加节点
+//                    if ("LogicFile".equals(node2.getName())) {
+//                        Attribute name = node2.attribute("filepath");
+//                        name.setText(xodrPath);
+//                    }
+//                    if ("SceneGraphFile".equals(node2.getName())) {
+//                        Attribute name = node2.attribute("filepath");
+//                        name.setText(osgbPath);
+//                    }
+//                }
+//            }
+//
+//            Writer osWrite = new OutputStreamWriter(Files.newOutputStream(Paths.get(newXoscPath)));
+//            OutputFormat format = OutputFormat.createPrettyPrint(); // 获取输出的指定格式
+//            format.setEncoding("UTF-8");// 设置编码 ,确保解析的xml为UTF-8格式
+//            XMLWriter writer = new XMLWriter(osWrite, format);// XMLWriter
+//            writer.write(document);// 把document写入xmlFile指定的文件(可以为被解析的文件或者新创建的文件)
+//            writer.flush();
+//            writer.close();
+//        }
+//        return newXoscPath;
+//    }
+//
+//
+//    //获取三维自车对象
+//    @SneakyThrows
+//    private VehicleTypePO vehicleById(String projectId, String projectType) {
+//        VehicleTypePO po = new VehicleTypePO();
+//        //项目类型 1.手动;2.自动
+//        String vehicle = "";
+//        if (projectType.equals("1")) {
+//            vehicle = simulationAutomaticProjectMapper.vehicleBySdId(projectId);
+//        } else if (projectType.equals("2")) {
+//            vehicle = simulationAutomaticProjectMapper.vehicleByZdId(projectId);
+//        }
+//        String vehicleId = configMapper.getVehicleId(vehicle);
+//
+//        VehicleVO vehicleInfo = vehicleMapper.getVehicleInfo(vehicleId);
+//
+//        //自车模型
+//        String car = vehicleInfo.getVehicleTypeStr().substring(0, vehicleInfo.getVehicleTypeStr().indexOf(","));
+//        car = car.substring(0, 1).toLowerCase() + car.substring(1);
+//        if (car.contains("truck")) {
+//            po.setVehicleCategory("truck");
+//        } else if (car.contains("trailer")) {
+//            po.setVehicleCategory("trailer");
+//        } else if (car.contains("van")) {
+//            po.setVehicleCategory("van");
+//        } else if (car.contains("semitrailer")) {
+//            po.setVehicleCategory("semitrailer");
+//        } else if (car.contains("bus")) {
+//            po.setVehicleCategory("bus");
+//        } else if (car.contains("motorbike")) {
+//            po.setVehicleCategory("motorbike");
+//        } else if (car.contains("bicycle")) {
+//            po.setVehicleCategory("bicycle");
+//        } else if (car.contains("bicycle")) {
+//            po.setVehicleCategory("bicycle");
+//        } else if (car.contains("train")) {
+//            po.setVehicleCategory("train");
+//        } else if (car.contains("tram")) {
+//            po.setVehicleCategory("tram");
+//        } else {
+//            po.setVehicleCategory("car");
+//        }
+//
+//        //车前距
+//        BigDecimal frontDistance = vehicleInfo.getFrontDistance();
+//        //车后距
+//        BigDecimal mo2 = new BigDecimal("2");
+//        BigDecimal rearDistance = vehicleInfo.getRearDistance();
+//        if (frontDistance.compareTo(rearDistance) > 0) {
+//            BigDecimal CenterX = (frontDistance.add(rearDistance)).divide(mo2).subtract(rearDistance);
+//            po.setCenterX(CenterX);
+//        } else {
+//            BigDecimal CenterX = (frontDistance.add(rearDistance)).divide(mo2).subtract(frontDistance);
+//            po.setCenterX(CenterX);
+//        }
+//        //车高
+//        BigDecimal mo3 = new BigDecimal("3");
+//        po.setCenterZ(vehicleInfo.getHeightDistance().divide(mo3));
+//        //车左距  车右距
+//        BigDecimal LeftDistance = vehicleInfo.getLeftDistance();
+//        BigDecimal RightDistance = vehicleInfo.getRightDistance();
+//        po.setDimensionsWidth(LeftDistance.add(RightDistance));
+//        po.setDimensionsHeight(vehicleInfo.getHeightDistance());
+//        po.setDimensionsLength(frontDistance.add(rearDistance));
+//
+//        po.setPerformanceMaxSpeed(vehicleInfo.getMaxSpeed());
+//        po.setPerformanceMaxDeceleration(vehicleInfo.getMaxDeceleration());
+//        BigDecimal moπ = new BigDecimal("3.141516");
+//        BigDecimal mo180 = new BigDecimal("180");
+//        po.setFrontAxleMaxSteering(vehicleInfo.getMaxSteeringAngle().multiply(moπ).divide(mo180));
+//        po.setFrontAxleWheelDiameter(vehicleInfo.getWheelDiameter());
+//        BigDecimal mo4 = new BigDecimal("4");
+//        BigDecimal mo5 = new BigDecimal("5");
+//        po.setFrontAxleTrackWidth(LeftDistance.add(RightDistance).multiply(mo4).divide(mo5));
+//        po.setFrontAxlePositionX(po.getCenterX());
+//        po.setFrontAxlePositionZ(po.getCenterZ());
+//
+//        po.setRearAxleWheelDiameter(vehicleInfo.getWheelDiameter());
+//        po.setRearAxleTrackWidth(po.getFrontAxleTrackWidth());
+//        po.setRearAxlePositionX(po.getFrontAxlePositionX());
+//        po.setRearAxlePositionZ(po.getFrontAxlePositionZ());
+//        return po;
+//
+//    }
+//
+//
+//}

+ 4 - 0
simulation-resource-scheduler/src/main/resources/kubernetes/template/pod/pod-template.yaml

@@ -37,6 +37,10 @@ spec:
           value: 172.17.0.184:9000
         - name: SIMULATION_CLOUD_IP
           value: 172.17.0.192
+        - name: KAFKA_PARTITION
+          value: kafkaPartition
+        - name: KAFKA_OFFSET
+          value: kafkaOffset
       volumeMounts:
         - name: nvidia0
           mountPath: /dev/nvidia0

+ 9 - 3
simulation-resource-video/src/main/java/com/css/simulation/resource/video/controller/VideoController.java

@@ -4,7 +4,9 @@ import api.common.pojo.common.ResponseBodyVO;
 import api.common.util.LinuxUtil;
 import com.css.simulation.resource.video.service.VideoService;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
@@ -15,15 +17,19 @@ public class VideoController {
 
     @Resource
     VideoService videoService;
-    @Value ("${scheduler.video-test-command}")
+    @Value("${scheduler.video-test-command}")
     String testCommand;
 
 
     /**
      * 接受 xosc 文件
      */
-    @RequestMapping(value = "/generate")
-    public ResponseBodyVO<String> generateVideo(String projectId, String projectType, String taskId) {
+    @GetMapping(value = "/generate")
+    ResponseBodyVO<String> generateVideo(
+            @RequestParam("projectId") String projectId,
+            @RequestParam("projectType") String projectType,
+            @RequestParam("taskId") String taskId
+    ) {
         return videoService.generateVideo(projectId, projectType, taskId);
     }
 

+ 8 - 8
simulation-resource-video/src/main/java/com/css/simulation/resource/video/mapper/VehicleMapper.java

@@ -76,14 +76,14 @@ public interface VehicleMapper {
             "       air_drag_coefficient,\n" +
             "       rolling_resistance_coefficient,\n" +
             "       wheel_diameter,\n" +
-            "       wheel_drive\n" +
-            "       overall_efficiency\n" +
-            "       front_distance\n" +
-            "       rear_distance\n" +
-            "       left_distance\n" +
-            "       right_distance\n" +
-            "       height_distance\n" +
-            "       wheelbase\n" +
+            "       wheel_drive,\n" +
+            "       overall_efficiency,\n" +
+            "       front_distance,\n" +
+            "       rear_distance,\n" +
+            "       left_distance,\n" +
+            "       right_distance,\n" +
+            "       height_distance,\n" +
+            "       wheelbase,\n" +
             "       share\n" +
             "from model_vehicle\n" +
             "where  id = #{vehicleId}\n")

+ 7 - 3
simulation-resource-video/src/main/java/com/css/simulation/resource/video/service/VideoService.java

@@ -52,6 +52,10 @@ public class VideoService {
     //* -------------------------------- Comment --------------------------------
     @Value("${scheduler.linux-path.temp}")
     String linuxTempPath;
+    @Value("${scheduler.esmini-command}")
+    String esminiCommand;
+    @Value("${scheduler.python-command}")
+    String pythonCommand;
     @Value("${scheduler.minio-path.project-result}")
     String projectResultPathOfMinio;
     @Value("${minio.bucket-name}")
@@ -85,9 +89,9 @@ public class VideoService {
         //4 生成图片
         String pictureDirectoryPath = rootDirectoryPathOfLinux + "picture";
         FileUtil.createDirectory(pictureDirectoryPath);
-        String esminiCommand = "/root/disk1/simulation-cloud/esmini/code-examples-bin/image-capture "
+        String esminiCommandTemp = esminiCommand + " "
                 + xoscPath + " " + pictureDirectoryPath + "/screenshot";
-        String esminiResult = LinuxUtil.execute(esminiCommand);
+        String esminiResult = LinuxUtil.execute(esminiCommandTemp);
         //5 生成视频
         String videoName = "simulation_output.mp4";
         String videoTargetPathOfLinux = rootDirectoryPathOfLinux + "video";
@@ -111,7 +115,7 @@ public class VideoService {
     @SneakyThrows
     private String generateXosc(String csvDirectoryPath, String xodrPath, String osgbPath, String projectId, String projectType) {
         //1 生成 xosc 文件
-        String command = "D:\\Users\\anaconda3\\envs\\flaskProject\\python.exe C:/Users/CSS/Desktop/simulation/gqSw/simulation_my.py " + csvDirectoryPath;
+        String command = pythonCommand + " " + csvDirectoryPath;
         String execute = LinuxUtil.execute(command);    // 执行命令后生成 xosc 到目录下
         String oldXoscPath = csvDirectoryPath + oldXoscRelativePath;  // 生成文件的路径是固定的
         //2 调用修改xosc