This commit is contained in:
ywb
2026-05-20 21:20:34 +08:00
parent 084faad1b2
commit a5be69bfaa
3 changed files with 42 additions and 5 deletions
+18
View File
@@ -45,6 +45,9 @@ createApp({
agvMoveInterval: null, agvMoveInterval: null,
agvCameraUrl: API + '/api/camera/refresh', agvCameraUrl: API + '/api/camera/refresh',
agvCameraTimer: null, agvCameraTimer: null,
// 机型展开
expandedModelId: null,
showAddModelModal: false,
// QR // QR
qrScanning: false, qrScanning: false,
qrConfigs: [], qrConfigs: [],
@@ -810,6 +813,21 @@ createApp({
} catch (e) { alert('扫描失败: ' + e.message) } } catch (e) { alert('扫描失败: ' + e.message) }
this.qrScanningId = null this.qrScanningId = null
}, },
async applyQrAngles(qrId) {
if (!this.armConnected) { alert('机械臂未连接'); return }
const q = this.qrConfigs.find(x => x.id === qrId)
if (!q || !q.joint_angles || !Array.isArray(q.joint_angles)) { alert('无效的姿态数据'); return }
try {
const res = await fetch(API + '/api/arm/set_angles', {
method: 'POST',
headers: {'Content-Type':'application/json'},
body: JSON.stringify({ angles: q.joint_angles, speed: 50 })
})
const data = await res.json()
if (data.ok) { alert('姿态已应用到机械臂')
} else { alert('应用失败: ' + (data.error || '未知错误')) }
} catch (e) { alert('应用姿态失败: ' + e.message) }
},
onArmPreviewError() { onArmPreviewError() {
// 机械臂摄像头预览失败,静默处理 // 机械臂摄像头预览失败,静默处理
}, },
+18
View File
@@ -45,6 +45,9 @@ createApp({
agvMoveInterval: null, agvMoveInterval: null,
agvCameraUrl: API + '/api/camera/refresh', agvCameraUrl: API + '/api/camera/refresh',
agvCameraTimer: null, agvCameraTimer: null,
// 机型展开
expandedModelId: null,
showAddModelModal: false,
// QR // QR
qrScanning: false, qrScanning: false,
qrConfigs: [], qrConfigs: [],
@@ -810,6 +813,21 @@ createApp({
} catch (e) { alert('扫描失败: ' + e.message) } } catch (e) { alert('扫描失败: ' + e.message) }
this.qrScanningId = null this.qrScanningId = null
}, },
async applyQrAngles(qrId) {
if (!this.armConnected) { alert('机械臂未连接'); return }
const q = this.qrConfigs.find(x => x.id === qrId)
if (!q || !q.joint_angles || !Array.isArray(q.joint_angles)) { alert('无效的姿态数据'); return }
try {
const res = await fetch(API + '/api/arm/set_angles', {
method: 'POST',
headers: {'Content-Type':'application/json'},
body: JSON.stringify({ angles: q.joint_angles, speed: 50 })
})
const data = await res.json()
if (data.ok) { alert('姿态已应用到机械臂')
} else { alert('应用失败: ' + (data.error || '未知错误')) }
} catch (e) { alert('应用姿态失败: ' + e.message) }
},
onArmPreviewError() { onArmPreviewError() {
// 机械臂摄像头预览失败,静默处理 // 机械臂摄像头预览失败,静默处理
}, },
+6 -5
View File
@@ -4,7 +4,7 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>设置 - AGV 拍摄系统</title> <title>设置 - AGV 拍摄系统</title>
<link rel="stylesheet" href="/static/css/style.css?v=20260520g"> <link rel="stylesheet" href="/static/css/style.css?v=20260520h">
</head> </head>
<body> <body>
<div id="app"> <div id="app">
@@ -566,7 +566,8 @@
<td style="padding:10px 8px;color:#4fc3f7;font-size:12px;max-width:120px;overflow:hidden;text-overflow:ellipsis">{% raw %}{{ q.qr_value || '—' }}{% endraw %}</td> <td style="padding:10px 8px;color:#4fc3f7;font-size:12px;max-width:120px;overflow:hidden;text-overflow:ellipsis">{% raw %}{{ q.qr_value || '—' }}{% endraw %}</td>
<td style="padding:10px 8px;color:#9aa0a6;font-size:12px">{% raw %}{{ getQrModelName(q.model_id) }}{% endraw %}</td> <td style="padding:10px 8px;color:#9aa0a6;font-size:12px">{% raw %}{{ getQrModelName(q.model_id) }}{% endraw %}</td>
<td style="padding:10px 8px;text-align:center;white-space:nowrap"> <td style="padding:10px 8px;text-align:center;white-space:nowrap">
<button class="btn btn-secondary btn-small" @click="readQrAngles(q.id)" :disabled="!armConnected" title="读取当前机械臂角度">📐</button> <button class="btn btn-secondary btn-small" @click="readQrAngles(q.id)" :disabled="!armConnected" title="读取当前机械臂关节角度">📋 加载姿态</button>
<button class="btn btn-primary btn-small" @click="applyQrAngles(q.id)" :disabled="!armConnected" style="margin-left:3px" title="将姿态应用到机械臂">🤖 应用姿态</button>
<button class="btn btn-success btn-small" @click="scanQrEntry(q.id)" :disabled="qrScanningId === q.id" style="margin-left:3px" title="扫描二维码">📷</button> <button class="btn btn-success btn-small" @click="scanQrEntry(q.id)" :disabled="qrScanningId === q.id" style="margin-left:3px" title="扫描二维码">📷</button>
<button class="btn btn-danger btn-small" @click="deleteQrConfig(q.id)" style="margin-left:3px" title="删除">🗑️</button> <button class="btn btn-danger btn-small" @click="deleteQrConfig(q.id)" style="margin-left:3px" title="删除">🗑️</button>
</td> </td>
@@ -585,7 +586,7 @@
</div> </div>
<div v-else> <div v-else>
<div class="camera-preview"> <div class="camera-preview">
<img :src="previewUrl" @error="onPreviewError"> <img :src="armCameraUrl" @error="onArmPreviewError">
</div> </div>
<div class="joints-panel"> <div class="joints-panel">
<h3>关节角度控制</h3> <h3>关节角度控制</h3>
@@ -675,7 +676,7 @@
</main> </main>
</div> </div>
<script src="/static/js/vue3.global.prod.js?v=20260520g"></script> <script src="/static/js/vue3.global.prod.js?v=20260520h"></script>
<script src="/static/js/setting.js?v=20260520g"></script> <script src="/static/js/setting.js?v=20260520h"></script>
</body> </body>
</html> </html>