HeWang 9 місяців тому
батько
коміт
49af4ac8ba
4 змінених файлів з 58 додано та 23 видалено
  1. 6 1
      README.md
  2. 2 2
      electron/main.js
  3. 5 5
      src/views/AboutView.vue
  4. 45 15
      src/views/ReportView.vue

+ 6 - 1
README.md

@@ -14,4 +14,9 @@ node 21.6.2
 ## sudo 权限配置
 - sudo visudo -f /etc/sudoers.d/username
   - username ALL=(ALL) NOPASSWD:ALL
-
+## docker 开启http访问
+> 测试:http://localhost:2375/version
+- sudo vi /lib/systemd/system/docker.service
+  -  ExecStart=/usr/bin/dockerd 后面添加 -H unix://var/run/docker.sock -H tcp://0.0.0.0:2375 --api-cors-header='*'
+- sudo systemctl daemon-reload
+- sudo service docker restart

+ 2 - 2
electron/main.js

@@ -120,7 +120,7 @@ ipcMain.on('docker-import', (event, filePath, tag) => {
 ipcMain.on('generate-world', (event, {rosbag_path}) => {
 
     // 使用 spawn 启动脚本
-    const serviceProcess = spawn('bash', ["/home/cicv/work/pji_desktop/world_generation/run_map2gazebo.sh"], { detached: true });
+    const serviceProcess = spawn('bash', ["/home/cicv/work/pji_desktop/simulation/run_map2gazebo.sh"], { detached: true });
 
     // 设置为后台进程
     serviceProcess.unref();
@@ -146,7 +146,7 @@ ipcMain.on('generate-world', (event, {rosbag_path}) => {
 
     function startSecondScript() {
         // 启动第二个脚本
-        const script2 = exec('bash /home/cicv/work/pji_desktop/world_generation/play_rosbag.sh ' + rosbag_path, (error, stdout, stderr) => {
+        const script2 = exec('bash /home/cicv/work/pji_desktop/simulation/play_rosbag.sh ' + rosbag_path, (error, stdout, stderr) => {
             if (error) {
                 console.error(`执行第二个脚本时出错: ${error}`);
                 event.sender.send('generate-world-result', { success: false, output: error });

+ 5 - 5
src/views/AboutView.vue

@@ -30,8 +30,8 @@
     </el-form-item>
     <el-form-item label="加载默认障碍物:">
       <el-radio-group v-model="form.resource">
-        <el-radio value="1">是</el-radio>
-        <el-radio value="0">否</el-radio>
+        <el-radio :value="true">是</el-radio>
+        <el-radio :value="false">否</el-radio>
       </el-radio-group>
     </el-form-item>
     <el-form-item label="            ">
@@ -109,11 +109,11 @@ const form = reactive({
   date2: '',
   delivery: false,
   type: [],
-  resource: '',
+  resource: true,
   desc: '',
   isRandom: false,
-  origin: '',
-  destination: '',
+  origin: '0',
+  destination: '0',
   randomCount: ref(1),
 })
 

+ 45 - 15
src/views/ReportView.vue

@@ -84,12 +84,27 @@
             </template>
           </el-dialog>
           <div style="float: right">
-            <el-switch
-                style="margin-left: 10px;"
-                v-model="value"
-                size="large"
-                inactive-text="算法容器"
-            />
+<!--            <el-switch-->
+<!--                style="margin-left: 10px;"-->
+<!--                v-model="value"-->
+<!--                size="large"-->
+<!--                inactive-text="算法容器"-->
+<!--            />-->
+            <span class="el-form-item__label" style="font-size: 14px;">算法镜像选择:</span>
+            <el-select
+                v-model="selectImageName"
+                placeholder="Select image"
+                size="default"
+                @click.native="getDockerImages('pji_nav')"
+                style="width: 180px; "
+            >
+              <el-option
+                  v-for="item in imageNames"
+                  :key="item"
+                  :label="item"
+                  :value="item"
+              />
+            </el-select>
             <el-button type="primary"  @click="algorithmDialogVisible = true" style="margin-left: 10px;">算法镜像导入</el-button>
             <el-dialog
                 v-model="algorithmDialogVisible"
@@ -101,17 +116,18 @@
               <template #footer>
                 <div class="dialog-footer">
                   <el-form :model="algorithmForm" label-width="auto">
-                    <el-form-item style="margin-bottom: 10px" label="算法版本:">
+                    <el-form-item style="margin-bottom: 10px" label="算法版本:" required>
                       <el-input v-model="algorithmForm.tag"/>
                     </el-form-item>
                   </el-form>
                   <!--            -->
                   <!--            <el-button @click="algorithmDialogVisible = false">取消</el-button>-->
-                  <el-button type="primary" @click="algorithmImport">选择镜像文件</el-button>
+                  <el-button type="primary" @click="algorithmImport" :disabled="algorithmForm.tag == ''">选择镜像文件</el-button>
                 </div>
               </template>
             </el-dialog>
-            <el-button style="margin-left: 10px;"  type="primary" @click="algorithmImport">算法镜像选择</el-button>
+<!--            <el-button style="margin-left: 10px;"  type="primary" @click="getDockerImages('pji_nav')">算法镜像选择</el-button>-->
+
 
             <!--        <el-switch-->
             <!--            v-model="algorithmContainerState"-->
@@ -225,7 +241,6 @@ import {useRouter} from 'vue-router'; // 导入 Vue Router 的 useRouter 钩子
 import { genFileId } from 'element-plus'
 import type { UploadInstance, UploadProps, UploadRawFile } from 'element-plus'
 
-
 const value
     = ref(true)
 const update_active = ref(0)
@@ -244,6 +259,8 @@ const worldDialogVisible = ref(false)
 const upload = ref<UploadInstance>()
 const uploadUrl = ref<string>()
 
+const selectImageName = ref("")
+const imageNames = ref([])
 
 const handleClose = (done: () => void) => {
   done()
@@ -295,6 +312,19 @@ const uploadSuccess = (response, file, fileList) => {
   })
 }
 
+const getDockerImages = (filter_prefix) => {
+  axios.get('http://localhost:2375/v1.43/images/json').then(function (response) {
+    // console.log(response.data);
+    var images = response.data
+        .filter(d => d["RepoTags"].length > 0)
+        .map(d => d["RepoTags"][0])
+        .filter(d => d.startsWith(filter_prefix))
+    // console.log("images", images)
+    imageNames.value = images
+  }).catch(function (error) {
+    console.log(error);
+  });
+}
 const multipleSelection = ref<[]>([])
 
 // do not use same name with ref
@@ -407,7 +437,7 @@ const updateMap = async () => {
 
   // 根据id下载地图更新需要的数据(压缩包)
   const id = ids[0]
-  const url = "http://127.0.0.1:8888/map/downloadmapzipfile?id=" + id
+  const url = "http://127.0.0.1:8888/map/download/zipfile?id=" + id
   const fileName = "data-" + id + ".zip"
   const savePath = "/home/cicv/work/pji_desktop/tmp_download/map_zip"
 
@@ -428,7 +458,7 @@ const updateMap = async () => {
 
 const checkMapbufConsistency = async (ids) => {
  try {
-   const response =  await axios.post('http://127.0.0.1:8888/map/checkmapbufconsistency', ids)
+   const response =  await axios.post('http://127.0.0.1:8888/map/check/mapbufconsistency', ids)
    console.log(response.data)
    return response.data.status
  } catch (error) {
@@ -484,14 +514,14 @@ const rviz = () => {
 const generateWorld = async (row) => {
   const id = row.id
   const equipmentNo = row.equipmentNo
-  const sceneNo = "scene-" + id
-  const url = "http://127.0.0.1:8888/map/downloadmapbagfile?id=" + id
+  const sceneNo = id
+  const url = "http://127.0.0.1:8888/map/download/mapbagfile?id=" + id
   const fileName = "map-" + id + ".bag"
   const savePath = "/home/cicv/work/pji_desktop/tmp_download/map_bag"
   console.log("id", id)
 
   // 拼接world文件上传url
-  uploadUrl.value = "http://127.0.0.1:8888/world/uploadworldfile?equipmentNo=" + equipmentNo + "&sceneNo=" + sceneNo
+  uploadUrl.value = "http://127.0.0.1:8888/world/upload/worldfile?equipmentNo=" + equipmentNo + "&sceneNo=" + sceneNo
   console.log("uploadUrl.value=" + uploadUrl.value)
 
   console.log("Starting download: map.bag...")