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