| api/vehicle.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| pages/map/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| pages/map/js/ctx.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| pages/map/scene.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
api/vehicle.js
@@ -871,6 +871,27 @@ } /** * GET 6000/api/get_map_server_phase * 获取构图程序阶段 * @param * @returns * "data": 1, # 1:未启动2:启动中3:启动完成4:构图保存中5:构图保存完成6:构图保存失败 */ export const getMapServerPhase = (ip) => { var header = { "Content-Type": "application/json;charset=UTF-8" }; var url = `http://${ip}:5000/api/get_map_server_phase/`; return http.request({ method: "GET", url, header, }) } /** * POST 5000/api/update_scene_id * 修改场景名称 * @param pages/map/index.vue
@@ -211,17 +211,21 @@ <view class="bottom-content" v-if="mapOperationStatus =='teaching'"> <view class="tip">路径记录中...</view> <view v-if="mapOperationType =='public_teaching'"> <!-- 主路/支路 --> <view>正在记录搬运车行进路径,完成后点按钮以结束示教。在示教过程中可以添加站点。</view> <!-- <view class="switch-type">可随时切换主路/支路示教, <view class="switch-type">可随时切换示教模式 <view class="switch-button-group"> <view class="switch-button" :class="teachingModeCur.main_road ==1?'switch-button-checked':''" @click="onTeachingModeMainRoad(1)">主路示教</view> :class="teachingModeCur.mode_type ==0?'switch-button-checked':''" @click="onTeachingModeType(0)">默认</view> <view class="switch-button " :class="teachingModeCur.main_road ==0?'switch-button-checked':''" @click="onTeachingModeMainRoad(0)">支路示教</view> :class="teachingModeCur.mode_type ==1?'switch-button-checked':''" @click="onTeachingModeType(1)">双向</view> <view class="switch-button " :class="teachingModeCur.mode_type ==2?'switch-button-checked':''" @click="onTeachingModeType(2)">智能</view> </view> </view> --> </view> </view> <view v-else> @@ -258,17 +262,20 @@ <view class="bottom-content" v-else> <view class="tip">即将开始公共示教</view> <view> 请选择要进行主路还是支路示教,点【开始记录】后将记录搬运车的行进路线作为公共示教路线。开始记录后可随时切换主路/支路示教。 请选择要进行主路还是支路示教,点【开始记录】后将记录搬运车的行进路线作为公共示教路线。开始记录后可随时切换示教模式。 </view> <view class="text-button-group"> <view class="switch-type"> <view class="switch-button-group"> <view class="switch-button" :class="teachingModeCur.main_road ==1?'switch-button-checked':''" @click="onTeachingModeMainRoad(1)">主路示教</view> :class="teachingModeCur.mode_type ==0?'switch-button-checked':''" @click="onTeachingModeType(0)">默认</view> <view class="switch-button " :class="teachingModeCur.main_road ==0?'switch-button-checked':''" @click="onTeachingModeMainRoad(0)">支路示教</view> :class="teachingModeCur.mode_type ==1?'switch-button-checked':''" @click="onTeachingModeType(1)">双向</view> <view class="switch-button " :class="teachingModeCur.mode_type ==2?'switch-button-checked':''" @click="onTeachingModeType(2)">智能</view> </view> </view> <a-button type="primary" class="button" :disabled="loading" @@ -383,6 +390,39 @@ </view> </uni-popup> <uni-popup ref="refPopupTeachingUpdate" type="dialog"> <uni-popup-dialog type="info" cancelText="取消" confirmText="确定" title="示教更新" @confirm="dialogTeachingUpdateConfirm" @close="dialogTeachingUpdateClose"> <view> <radio-group @change="radioTeachinMainRoadChange"> <label class="radio"> <radio :value="1" :checked="selectTeachingMode.main_road == 1" />主路 </label> <label class="radio"> <radio :value="0" :checked="selectTeachingMode.main_road != 1" />支路 </label> </radio-group> </view> <view> <radio-group @change="radioTeachinBidirectionChange"> <label class="radio"> <radio :value="1" :checked="selectTeachingMode.bidirection == 1" />双向 </label> <label class="radio"> <radio :value="0" :checked="selectTeachingMode.bidirection != 1" />单向 </label> </radio-group> </view> </uni-popup-dialog> </uni-popup> </view> </view> @@ -423,6 +463,9 @@ delTeachingMode, delTeachingModeData, checkAgvLocationDistanceError, splitTeachingMode, updateSplitTeachingData, deleteSplitTeachingData } from "@/api/vehicle.js" export default { name: "PagesMap", @@ -760,7 +803,10 @@ if (this.mapOperationStatus == 'end' || this.mapOperationStatus == 'save') { try { await delTeachingMode(this.vehicleIp, [this.teachingModeCur]) // await delTeachingMode(this.vehicleIp, [this.teachingModeCur]) await deleteSplitTeachingData(this.vehicleIp, this.teachingModeCur .edge_name, this.teachingModeCur.name) listDataStr.push({ method: "remove_teaching_path", param: { @@ -788,7 +834,7 @@ } } else { const eventChannel = this.getOpenerEventChannel(); eventChannel.emit('check_connect', !this.unlinked); uni.navigateBack({ @@ -1029,7 +1075,7 @@ height: param.view?.height || 0, } const angle = this.getStantardAngle(this.stationEdit.angle * 180 / Math.PI) this.angleSvg = `/static/images/angle${angle}.svg` this.mapOperationType = "" @@ -1143,14 +1189,17 @@ } else if (param.type == "public") { this.selectTeachingMode = { mode: "Public", edge_name: param.data?.edge_name || "", name: param.data?.name || "", point: param.point point: param.point, main_road: param.data?.main_road || 0, bidirection: param.data?.name || 0, } } this.$refs.refPopupOperateTeaching.open("bottom") } else if (param.method == "cancel_positioning_agv") { if (this.mapOperationType == "public_teaching" && this.mapOperationStatus == "teaching") { if (this.mapOperationType == "public_teaching" && this.mapOperationStatus == "teaching") { this.positioningAgv = true } else this.positioningAgv = false @@ -1208,7 +1257,7 @@ this.mapOperationStatus = "" this.teachingModeCur = { mode: "Public", main_road: 1, mode_type: 0, } this.positioningAgv = true this.mapOperationType = "public_teaching" @@ -1230,7 +1279,7 @@ async loadSceneList() { try { const _this = this const res = await getAllScene(this.vehicleIp) || [] const list = res?.sceneList || [] @@ -1263,7 +1312,7 @@ } catch (ex) { showError(ex) } } }, clickDelete() { const _this = this @@ -1928,7 +1977,7 @@ try { const { data } = await getTeachingMode(this.vehicleIp) } = await splitTeachingMode(this.vehicleIp) return data || { Public: [], Stations: [] @@ -2196,7 +2245,9 @@ if (res) { try { this.loading = true await delTeachingMode(_this.vehicleIp, [_this.teachingModeCur]) //await delTeachingMode(_this.vehicleIp, [_this.teachingModeCur]) await deleteSplitTeachingData(_this.vehicleIp, _this.teachingModeCur.edge_name, _this.teachingModeCur.name) _this.mapOperationStatus = "" const listDataStr = [] listDataStr.push({ @@ -2263,15 +2314,15 @@ } } else {*/ const main_road = this const mode_type = this .teachingModeCur .main_road .mode_type this.teachingModeCur = { mode: "Public", src_dst: ``, name: "", teaching_flag: 1, main_road mode_type } const res2 = await teachingModeFlag( @@ -2300,10 +2351,12 @@ // } else { // this.askTeachingBiDirection(this.teachingModeCur) // } this.askTeachingBiDirection( this .teachingModeCur ) // this.askTeachingBiDirection( // this // .teachingModeCur // ) this.teachingModeCur.teaching_flag = 0 await this.finishTeaching(this.teachingModeCur) } catch (ex) { showError(ex) } finally { @@ -2311,22 +2364,28 @@ } }, async onTeachingModeMainRoad(val) { async onTeachingModeType(val) { try { if (this.mapOperationStatus) { if (this.teachingModeCur.main_road == val) { if (this.teachingModeCur.mode_type == val) { return } this.teachingModeCur.teaching_flag = 0 const oldName = this.teachingModeCur.name await teachingModeFlag(this.vehicleIp, this.teachingModeCur) this.teachingModeCur.main_road = val this.teachingModeCur.mode_type = val this.teachingModeCur.teaching_flag = 1 this.teachingModeCur.mode = "Public" this.teachingModeCur.name = "" const res = await teachingModeFlag(this.vehicleIp, this.teachingModeCur) if (val == 0) if (val == 1) showToast("已将示教切换成双向模式") else if (val == 2) showToast("已将示教切换成智能模式") else showToast("已将示教切换成默认模式") /*if (val == 0) showToast( "已将该路段路径保存为主路示教路线" ) @@ -2339,7 +2398,7 @@ const { data } = await getTeachingMode(this.vehicleIp) } = await splitTeachingMode(this.vehicleIp) const publicList = data.Public || [] const curIndex = publicList.findIndex((a) => a.name == oldName) @@ -2354,12 +2413,10 @@ }]) } */ } else { this.teachingModeCur .main_road = val this.teachingModeCur.mode_type = val } } catch (ex) { @@ -2377,16 +2434,48 @@ }, clickTeachingEdit() { this.$refs .refPopupOperateTeaching .close() this.mapOperationType = "edit_teaching" this.ctxDataStr = JSON .stringify([{ method: "edit_teaching", param: this.selectTeachingMode, }]) this.$refs.refPopupOperateTeaching.close() this.$refs.refPopupTeachingUpdate.open("") // this.mapOperationType = // "edit_teaching" // this.ctxDataStr = JSON // .stringify([{ // method: "edit_teaching", // param: this.selectTeachingMode, // }]) }, radioTeachinMainRoadChange(e) { this.selectTeachingMode.main_road = evt.detail.value }, radioTeachinBidirectionChange(evt) { this.selectTeachingMode.bidirection = evt.detail.value }, async dialogTeachingUpdateConfirm() { try { uni.showLoading({ title: "更新示教中" }) const item = this.selectTeachingMode await updateSplitTeachingData(this.vehicleIp, item) this.ctxDataStr = JSON.stringify( [{ method: "update_teaching", param: item, }]) this.selectTeachingMode = {} showToast("更新示教成功") } catch (ex) { showError( ex) } finally { uni.hideLoading() } }, dialogTeachingUpdateClose() { this.$refs.refPopupTeachingUpdate.close() }, async removeTeachingMode(item) { @@ -2394,13 +2483,15 @@ uni.showLoading({ title: "删除示教中" }) await delTeachingMode(this.vehicleIp, [item]) await deleteSplitTeachingData(this.vehicleIp, item.edge_name, item.name) //await delTeachingMode(this.vehicleIp, [item]) this.ctxDataStr = JSON.stringify( [{ method: "remove_teaching_path", param: item, }]) showToast("删除示教成功") } catch (ex) { showError( ex) @@ -2413,7 +2504,9 @@ uni.showLoading({ title: "删除示教数据中" }) await delTeachingModeData(this.vehicleIp, data) await deleteSplitTeachingData(this.vehicleIp, data.edge_name, data.name) //await delTeachingModeData(this.vehicleIp, data) showToast("删除示教成功") this.reloadTeachingMode() } catch (ex) { showError(ex) @@ -2862,7 +2955,8 @@ .switch-button-checked { box-shadow: 0px 2px 8px 0px #0000000C; background-color: #fff; color: #262626; color: #1890FF; } } pages/map/js/ctx.js
@@ -2114,11 +2114,11 @@ fromY = pt2.y } let strokeWidth = 5 let stroke = "#95DE64" let stroke = "#69C0FF" if (main_road == 1) { stroke = "#69C0FF" } // if (main_road == 1) { // stroke = "#69C0FF" // } const objPath = new fabric.Path( path2, { id: "current_teaching", @@ -2154,7 +2154,7 @@ const theta = 20; let headlen = 10; var main_road = 1 var main_road = teachingData.main_road || 0 const len = pos_list.length let fromX = 0, @@ -2238,10 +2238,11 @@ // } path2 += ` L${pt2.x} ${pt2.y}` } else { main_road = pt.main_road if (main_road == 1) { headlen = 15 } if (pt.main_road) main_road = pt.main_road // if (main_road == 1) { // headlen = 15 // } path2 = `M${pt2.x} ${pt2.y}` } fromX = pt2.x @@ -2252,19 +2253,21 @@ // console.log("addTeachingPath",path2) // path2 += " Z" let strokeWidth = 2 let stroke = "#95DE64" let strokeWidth = 1.5 let stroke = "#69C0FF" if (type == "station_teaching") { stroke = "#69C0FF" } else { if (main_road == 1) { stroke = "#69C0FF" if (teachingData.bidirection == 1) { stroke = "#FF00FF" } } else { //stroke = "#69C0FF" if (teachingData.bidirection == 1) { stroke = "#ffaa00" } strokeWidth = 3 } else { if (teachingData.bidirection == 1) { stroke = "#FF00FF" } } } @@ -2302,6 +2305,7 @@ return objPath }, isObjectFullyContained(outerObj, innerObj) { const outer = outerObj.getBoundingRect(true, true); const inner = innerObj.getBoundingRect(true, true); @@ -3649,6 +3653,35 @@ const teachingMode = item.param _this.showEditTeachingPath(teachingMode) } else if (item.method == "update_teaching") { let list = _this.canvas.getObjects() || [] list = list.filter((a) => a.eleType == "public_teaching") const id = `public_teaching_${item.param.name}` const curIndex = list.findIndex((a) => a.id == id) if (curIndex > -1) { const obj = list[curIndex] let strokeWidth = 1.5 let stroke = "#69C0FF" if (item.param.main_road == 1) { //stroke = "#69C0FF" if (item.param.bidirection == 1) { stroke = "#ffaa00" } strokeWidth = 3 } else { if (item.param.bidirection == 1) { stroke = "#FF00FF" } } obj.set({strokeWidth,stroke}) } } else if (item.method == "set_selectable") { if (item.param) _this.setAllObjectSelectable(true) pages/map/scene.vue
@@ -43,7 +43,8 @@ <view class="bottom-content" v-else-if="opSceneType =='scan'"> <view class="tip">场景构建中</view> <view> 请操作搬运车扫描地图覆盖的区域 <!-- 请操作搬运车扫描地图覆盖的区域 --> {{mapServerPhase=== 1 ?"场景构建服务:未启动":mapServerPhase===2 ?"场景构建服务:启动中":mapServerPhase===3 ?"场景构建中":mapServerPhase}} </view> <view class="text-button-group"> @@ -51,13 +52,17 @@ </view> </view> <view class="bottom-content" v-else-if="opSceneType =='finish'"> <view class="tip"> “{{sceneName}}”{{opType == "extend"?"场景扩展完成"+"":"场景构建完成"}}</view> <!-- <view> 已成功构建“{{sceneName}}”</view> --> <view class="loading-view">{{saveMapIsOk?"构图保存完成":"等待构图保存完成..."}} <view v-if="!saveMapIsOk" class="auto-circle"></view> <view class="tip"> “{{sceneName}}”{{opType == "extend"?"场景扩展结束"+"":"场景构建结束"}}</view> <!-- <view> 已成功构建“{{sceneName}}”</view> --> <view class="loading-view"> 构图状态:{{mapServerPhase===5?"保存成功":mapServerPhase===4?"保存中":mapServerPhase===6?"保存失败":mapServerPhase}} <view v-if="mapServerPhase === 4" class="auto-circle"></view> </view> <view class="text-button-group"> <a-button type="primary" class="button" :disabled=" !saveMapIsOk || loading" @click="clickFinish">{{opType == "extend"?"扩展完成":"构建完成"}}</a-button> <a-button type="primary" class="button" v-if="mapServerPhase === 6" @click="clickRecreate">{{opType == "extend"?"重现扩展":"重现构建"}}</a-button> <a-button type="primary" class="button" v-else :disabled=" mapServerPhase !==5 || loading" @click="clickFinish">{{opType == "extend"?"扩展完成":"构建完成"}}</a-button> </view> </view> </view> @@ -81,13 +86,15 @@ createScene, addMap, stopMap, delScene, //getAgvState, getMapLaserData, saveDBData, checkMapServerIsStart, startOrStopMapServer, checkMapServerIsOk, checkSaveMapIsOk, // checkMapServerIsStart, // startOrStopMapServer, // checkMapServerIsOk, // checkSaveMapIsOk, getMapServerPhase, getMapUrl } from "@/api/vehicle.js" @@ -110,7 +117,7 @@ localSceneList: [], positioningAgv: true, robotPos: {}, mapserverIsOk: false, mapServerPhase: 1, extendBase64Img: "", saveMapIsOk: false, destroyFlag: false, @@ -210,7 +217,6 @@ async loadData() { try { // this.loadMapServerState() if (this.opType == "") { this.localSceneList = await this.loadLocalScene() } else { @@ -218,7 +224,9 @@ this.opSceneType = "add_name" } if (this.opType == "extend") { this.mapServerPhase = 1 await addMap(this.ip, this.sceneName, "extend") this.checkMapServerPhase() this.opSceneType = 'scan' } // if (this.opType == "extend") { @@ -234,7 +242,7 @@ // } } this.refreshMapLaserData() @@ -252,58 +260,22 @@ return {} } }, async loadMapServerState() { async checkMapServerPhase() { try { this.mapserverIsOk = false const res = await checkMapServerIsStart(this.ip) if (res) { this.mapserverIsOk = true } else { this.mapserverIsOk = false const res = await startOrStopMapServer(this.ip, 1) if (res) { this.checkMapServerState() } const res = await getMapServerPhase(this.ip) this.mapServerPhase = res || 1 if (this.mapServerPhase === 3) { return } } catch (ex) { showError(ex) } }, async checkMapServerState() { try { const res = await checkMapServerIsOk(this.ip) if (res) { this.mapserverIsOk = true } else { this.mapserverIsOk = false setTimeout(this.checkMapServerState, 1000); } } catch (ex) { showError(ex).then((res) => { setTimeout(this.checkMapServerState, 1000); }) } }, async checkSaveMapState() { try { const res = await checkSaveMapIsOk(this.ip) if (res) { if (this.mapServerPhase === 5 || this.mapServerPhase === 6) { this.saveMapIsOk = true } else { this.saveMapIsOk = false setTimeout(this.checkSaveMapState, 1000); return } setTimeout(this.checkMapServerPhase, 1000); } catch (ex) { showError(ex).then((res) => { setTimeout(this.checkSaveMapState, 1000); }) showToast(ex) setTimeout(this.checkMapServerPhase, 1000); } }, @@ -383,7 +355,9 @@ try { this.mapId = "" if (this.opType == "extend") { this.mapServerPhase = 1 await addMap(this.ip, this.sceneName, "extend") this.checkMapServerPhase() this.opSceneType = 'scan' } else { this.opSceneType = "add_name" @@ -437,6 +411,7 @@ this.sceneName = name await createScene(this.ip, name, 1) await addMap(this.ip, name) this.checkMapServerPhase() uni.showLoading({ title: "开始扫描地图" }) @@ -476,8 +451,8 @@ }) this.saveMapIsOk = false await stopMap(this.ip, this.sceneName) // await startOrStopMapServer(this.ip, 2) // this.checkSaveMapState(); this.mapServerPhase = 4 this.checkMapServerPhase(); // if (this.opType == "extend") { // this.opSceneType = "" // const eventChannel = this.getOpenerEventChannel(); @@ -486,13 +461,12 @@ // delta: 1, //返回层数,2则上上页 // }) // } setTimeout(() => {this.saveMapIsOk = true}, 5000); } catch (ex) { console.log(ex) showModal("请检查车辆连接,并重新开始构建场景", "场景构建失败", false, "确定").then((res) => { this.opSceneType = '' // this.loadMapServerState() }) } finally { this.loading = false @@ -519,9 +493,28 @@ this.loading = false uni.hideLoading() } }, async clickRecreate() { try { if (this.opType == "extend") { this.mapServerPhase = 1 await addMap(this.ip, this.sceneName, "extend") this.checkMapServerPhase() this.opSceneType = 'scan' } else { this.mapServerPhase = 1 await delScene(this.ip, this.sceneName) await createScene(this.ip, this.sceneName, 1) await addMap(this.ip, this.sceneName) this.checkMapServerPhase() this.opSceneType = 'scan' } } catch (ex) { console.log(ex) } }, async loadMapLaserData() { try { const info = await getMapLaserData(this.ip, this.mapId) @@ -603,7 +596,7 @@ } } } setTimeout(this.refreshMapLaserData, 1000); } catch (ex) { showToast(ex)