diff --git a/.gitignore b/.gitignore
index 252fa1e7d..55a4e97c0 100644
Binary files a/.gitignore and b/.gitignore differ
diff --git a/src/embodied_robot/README.md b/src/embodied_robot/README.md
index 577d1d280..2d82baa85 100644
--- a/src/embodied_robot/README.md
+++ b/src/embodied_robot/README.md
@@ -1,33 +1,16 @@
-具身机器人
+具身机器人:
-环境配置:
-absl-py 2.3.1
-cloudpickle 3.1.1
-contourpy 1.3.3
-cycler 0.12.1
-etils 1.13.0
-Farama-Notifications 0.0.4
-fonttools 4.59.2
-fsspec 2025.9.0
-glfw 2.10.0
-gymnasium 1.2.0
-imageio 2.37.0
-importlib_resources 6.5.2
-kiwisolver 1.4.9
-Markdown 3.9
-matplotlib 3.10.6
-mujoco 3.3.6
-numpy 2.3.3
-packaging 25.0
-pillow 11.3.0
-pip 25.2
-PyOpenGL 3.1.10
-pyparsing 3.2.4
-python-dateutil 2.9.0.post0
-python-markdown-math 0.9
-six 1.17.0
-typing_extensions 4.15.0
-zipp 3.23.0
-torch 2.8.0+cpu
-torchaudio 2.8.0+cpu
-torchvision 0.23.0+cpu
+1. 行走:
+ # 核心库(必须安装)
+ mujoco==3.3.6
+ numpy==2.2.6
+
+# 间接依赖(通常自动安装,若缺失则补充)
+ absl-py==2.3.1
+ glfw==2.10.0
+ PyOpenGL==3.1.10
+ etils==1.13.0
+ importlib_resources==6.5.2
+ typing_extensions==4.15.0
+ zipp==3.23.0
+ fsspec==2025.9.0
diff --git a/src/embodied_robot/main.py b/src/embodied_robot/main.py
index 8b1378917..63dc98ba0 100644
--- a/src/embodied_robot/main.py
+++ b/src/embodied_robot/main.py
@@ -1 +1,82 @@
+import mujoco
+import time
+from mujoco import viewer
+
+
+def main():
+ # 定义简单的双轮机器人模型
+ robot_xml = """
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ """
+
+ # 加载模型
+ model = mujoco.MjModel.from_xml_string(robot_xml)
+ data = mujoco.MjData(model)
+
+ # 初始化可视化器
+ viewer_instance = viewer.launch_passive(model, data)
+
+ # 设置直行速度(左右轮相同速度)
+ forward_speed = 1.0
+ data.ctrl[0] = forward_speed # 左轮速度
+ data.ctrl[1] = forward_speed # 右轮速度
+
+ # 运行仿真10秒
+ total_time = 10.0
+ steps = int(total_time / model.opt.timestep)
+
+ start_time = time.time()
+ for _ in range(steps):
+ # 执行仿真步
+ mujoco.mj_step(model, data)
+
+ # 更新可视化
+ viewer_instance.sync()
+
+ # 维持实时速率
+ elapsed = time.time() - start_time
+ expected = _ * model.opt.timestep
+ if elapsed < expected:
+ time.sleep(expected - elapsed)
+
+ print(f"仿真完成,机器人最终位置: {data.body('base').xpos}")
+ viewer_instance.close()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/src/embodied_robot/robot_walk/Robot_move_straight.xml b/src/embodied_robot/robot_walk/Robot_move_straight.xml
index cfc8a7b5c..b7f275f39 100644
--- a/src/embodied_robot/robot_walk/Robot_move_straight.xml
+++ b/src/embodied_robot/robot_walk/Robot_move_straight.xml
@@ -23,10 +23,10 @@
-
-
+
+
-
+
@@ -35,6 +35,6 @@
-
+
\ No newline at end of file
diff --git a/src/embodied_robot/robot_walk/move_straight.py b/src/embodied_robot/robot_walk/move_straight.py
index cc409e14b..2f05ccd26 100644
--- a/src/embodied_robot/robot_walk/move_straight.py
+++ b/src/embodied_robot/robot_walk/move_straight.py
@@ -21,7 +21,7 @@ def control_robot(model_path):
# 计算控制信号
elapsed_time = time.time() - start_time
- data.ctrl[0] = 5.0 if (elapsed_time % 4 < 2) else -5.0
+ data.ctrl[0] = 0.5 if (elapsed_time % 20 < 10) else -0.5
# 运行仿真步
mujoco.mj_step(model, data)
@@ -32,6 +32,7 @@ def control_robot(model_path):
# 控制仿真速度
time.sleep(model.opt.timestep)
+
except KeyboardInterrupt:
print("\n仿真被用户中断")
diff --git a/src/humanoid_motion_control/main.py b/src/humanoid_motion_control/main.py
index de42eac3b..1f8ea1930 100644
--- a/src/humanoid_motion_control/main.py
+++ b/src/humanoid_motion_control/main.py
@@ -1,3 +1,55 @@
+"""
+[路径优化] 自动切换工作目录并加载模型
+
+为了增强代码的可移植性,我们在程序启动时自动将工作目录切换到项目根目录。
+这样可以确保脚本中使用的相对路径(如 "src/humanoid_motion_control/humanoid.xml")
+无论从哪个位置运行,都能正确地指向预期的文件。
+
+修改原因:
+- 原版代码使用的是基于运行时目录的相对路径,这在不同环境或不同运行方式下容易出错。
+- 通过自动切换到项目根目录,可以统一所有相对路径的基准,避免 "No such file or directory" 错误。
+
+使用方法:
+- 保持 main.py 中原有相对路径写法不变即可。
+- 此脚本会在加载模型等操作前自动完成路径切换。
+
+注意事项:
+- 此代码段必须放置在所有依赖相对路径的导入或文件操作之前。
+- 如果项目目录结构发生重大改变,可能需要调整计算 project_root 的层级。
+"""
+
+import os
+import mujoco
+
+# --- 你之前的切换目录代码 ---
+import sys
+file_path = os.path.abspath(__file__)
+project_root = os.path.dirname(os.path.dirname(file_path))
+os.chdir(project_root)
+print(f"当前工作目录已切换到: {os.getcwd()}")
+# ----------------------------
+
+# 1. 定义模型文件的相对路径
+# 注意:这里使用了推荐的正斜杠
+relative_model_path = "src/humanoid_motion_control/humanoid.xml"
+print(f"尝试查找的模型路径: {relative_model_path}")
+
+# 2. 检查文件是否存在
+if os.path.exists(relative_model_path):
+ print("✅ 模型文件找到了!")
+ try:
+ # 3. 如果文件存在,再尝试加载
+ model = mujoco.MjModel.from_xml_path(relative_model_path)
+ data = mujoco.MjData(model)
+ print("🎉 模型加载成功!")
+ # ... 你的其他代码 ...
+ except Exception as e:
+ print(f"模型加载失败: {e}")
+else:
+ print(f"❌ 错误:在当前工作目录下找不到模型文件。")
+ print(f"请确认文件 '{relative_model_path}' 确实存在。")
+
+
# 标准库
import time
# 第三方库
@@ -6,7 +58,7 @@
def main():
try:
- model = mujoco.MjModel.from_xml_path("src\humanoid_motion_control\humanoid.xml")
+ model = mujoco.MjModel.from_xml_path(r"humanoid_motion_control\humanoid.xml")
except Exception as e:
print(f"模型加载失败: {e}")
return
diff --git a/src/humanoid_mujoco_py/main.py b/src/humanoid_mujoco_py/main.py
index d0578f1db..ba2ee357b 100644
--- a/src/humanoid_mujoco_py/main.py
+++ b/src/humanoid_mujoco_py/main.py
@@ -22,7 +22,7 @@ def main():
# 加载MJCF模型文件
# 模型定义了物理场景:包含平面、光源和一个自由下落的盒子
# from_xml_path方法支持从XML文件加载模型,替代C++中的mj_loadXML
- model = mujoco.MjModel.from_xml_path("src\humanoid_control\hello.xml")
+ model = mujoco.MjModel.from_xml_path("src/humanoid_control/hello.xml")
# 创建与模型对应的动态数据结构
# 存储模拟过程中的状态变量(位置、速度等),类似C++中的mjData