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);