From aaf2c0cc41d5bec3261d0f6aa311a4d4b0f88b88 Mon Sep 17 00:00:00 2001 From: zhangshun <453905631@qq.com> Date: Tue, 16 Jun 2026 12:20:15 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0URDF=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E6=B3=A8=E5=86=8C=E6=B5=8B=E8=AF=95=E5=85=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/urdf.xml | 309 ++++++++++++++++++++++++ public/robot_kinematics_three_test.html | 72 ++++++ 2 files changed, 381 insertions(+) create mode 100644 docs/urdf.xml diff --git a/docs/urdf.xml b/docs/urdf.xml new file mode 100644 index 0000000..88bf427 --- /dev/null +++ b/docs/urdf.xml @@ -0,0 +1,309 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + transmission_interface/SimpleTransmission + + hardware_interface/EffortJointInterface + + + 1 + + + + + transmission_interface/SimpleTransmission + + hardware_interface/EffortJointInterface + + + 1 + + + + + transmission_interface/SimpleTransmission + + hardware_interface/EffortJointInterface + + + 1 + + + + + transmission_interface/SimpleTransmission + + hardware_interface/EffortJointInterface + + + 1 + + + + + transmission_interface/SimpleTransmission + + hardware_interface/EffortJointInterface + + + 1 + + + + + transmission_interface/SimpleTransmission + + hardware_interface/EffortJointInterface + + + 1 + + + + + + / + + + \ No newline at end of file diff --git a/public/robot_kinematics_three_test.html b/public/robot_kinematics_three_test.html index be32103..8c29ce8 100644 --- a/public/robot_kinematics_three_test.html +++ b/public/robot_kinematics_three_test.html @@ -382,9 +382,16 @@ +
+ + +
+
@@ -507,6 +514,7 @@ wasmStatus: document.getElementById("wasm-status"), solverStatus: document.getElementById("solver-status"), robotUuid: document.getElementById("robot-uuid"), + urdfFile: document.getElementById("urdf-file"), jointControls: document.getElementById("joint-controls"), requestJson: document.getElementById("request-json"), responseJson: document.getElementById("response-json"), @@ -521,6 +529,7 @@ jointCountValue: document.getElementById("joint-count-value"), toast: document.getElementById("toast"), initBtn: document.getElementById("init-btn"), + registerUrdfBtn: document.getElementById("register-urdf-btn"), resetBtn: document.getElementById("reset-btn"), fkBtn: document.getElementById("fk-btn"), ikBtn: document.getElementById("ik-btn"), @@ -756,6 +765,67 @@ } } + // 读取本地 URDF 文件并注册为当前 robot_uuid。 + async function registerUrdfFromFile() { + await ensureInitialized(); + const file = elements.urdfFile.files?.[0]; + const robotUuid = elements.robotUuid.value.trim(); + + if (!file) { + showToast("请选择 URDF 文件"); + return; + } + + if (!robotUuid) { + showToast("请先填写 robot_uuid"); + return; + } + + setBusy(true, "正在注册 URDF"); + try { + const urdfText = await file.text(); + const request = { + msg: "threejs init robot from urdf", + req_code: `THREE_INIT_URDF_${Date.now()}`, + req_from: "threejs_test", + req_cmd: "Cmd_InitRobot", + req_param: { + robot_uuid: robotUuid, + force_update: true, + urdf_base64: encodeUtf8Base64(urdfText), + }, + }; + + renderJson(request, null); + const response = await api.processBusinessRequest(request); + renderJson(request, response); + + if (response.success && response.res_data?.success) { + state.latestIkJoints = null; + elements.applyIkBtn.disabled = true; + setStatus("URDF 注册完成", true); + await runForwardKinematics(); + } else { + setStatus("URDF 注册失败", false); + showToast(response.res_data?.message || response.msg || "URDF 注册失败"); + } + } catch (error) { + showError(error); + } finally { + setBusy(false); + } + } + + // 将 URDF 文本编码成接口需要的 UTF-8 Base64 字符串。 + function encodeUtf8Base64(value) { + const bytes = new TextEncoder().encode(value); + let binary = ""; + bytes.forEach((byte) => { + binary += String.fromCharCode(byte); + }); + return btoa(binary); + } + // 确保调用算法前已经完成初始化。 async function ensureInitialized() { if (!state.initialized) { @@ -1029,6 +1099,7 @@ function setBusy(isBusy, label) { [ elements.initBtn, + elements.registerUrdfBtn, elements.resetBtn, elements.fkBtn, elements.ikBtn, @@ -1095,6 +1166,7 @@ } elements.initBtn.addEventListener("click", initializeWasm); + elements.registerUrdfBtn.addEventListener("click", registerUrdfFromFile); elements.resetBtn.addEventListener("click", resetJoints); elements.fkBtn.addEventListener("click", runForwardKinematics); elements.ikBtn.addEventListener("click", runInverseKinematics);