# mujoco_simulator **Repository Path**: fu0609/mujoco_simulator ## Basic Information - **Project Name**: mujoco_simulator - **Description**: 使用ROS2在mujoco的simulate例程的基础上二次开发的仿真库 - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2025-12-02 - **Last Updated**: 2025-12-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # mujoco_simulator ## 1. 介绍 本仓库基于mujoco3.3.0的simulate示例程序进行二次开发,在原程序的基础上添加了ROS2通信接口与模型信息输出功能。可以在不改动代码的基础上支持各种MJCF模型 ## 2. 安装教程 安装ROS2,推荐使用鱼香ROS一键安装脚本 ```shell wget http://fishros.com/install -O fishros && . fishros ``` 安装依赖 ```shell sudo apt-get install libglfw3-dev gobjc++ ``` 新建ros2工作空间 ```shell cd ~/project # 换成您自己的路径 mkdir -p mujoco_simulator/src cd mujoco_simulator/src ``` 克隆本仓库和相关仓库到ros2工作空间中 ```shell # mujoco仿真库本体 git clone https://gitee.com/coralab/mujoco_simulator.git # 实验室机器人描述文件库 git clone https://gitee.com/coralab/robot_description_coral.git # 实验室ROS2自定义通信接口库 git clone https://gitee.com/coralab/robot_interface_coral.git ``` 开始编译 ```shell cd .. colcon build ``` 如果编译成功就说明安装没有问题 ## 3. 使用说明 ### 3.1 启动mujoco仿真 仓库的主要超参数保存在`config/simulate.yaml`中,首次执行需要确定其中参数是否正确,其中的MJCF文件路径是绝对路径,需要改成正确的路径 ```yaml mujoco_simulator_node: ros__parameters: # mjcf文件的路径 !需要改成您的路径! modelPath: "/home/coral-jyz/project/coral_rl_deploy/src/robot_description_coral/ShenNong/mjcf/scene_ShenNong.xml" # 电机状态与命令topic lowStateTopic: "human_low_state" # 共享内存硬件信息topic jointCommandsTopic: "human_joint_command" # 共享内存电机命令topic # 加载模型后是否暂停 unPauseService: "/unpause_mujoco" # 启动服务名称 initPauseFlag: true # 1是会暂停,0是不会暂停 # 是否输出模型信息表格 modelTableFlag: true # 1是会,0是不会 ``` 每次进行修改都需要再次进行编译 ```shell colcon build ``` 确认参数无误后使用下面的命令启动仿真 ```shell source install/setup.bash ros2 launch mujoco_simulator simulate.launch.py ``` 成功启动后的界面如下图所示 ![](https://picgo-nanhaibei.oss-cn-beijing.aliyuncs.com/20250403180035.png) 默认启动mujoco后仿真处于暂停状态,此时可以按空格键进行仿真,也可以在调用ROS2服务启动仿真 在C++中使用服务启动仿真的示例代码如下 ```C++ // 包含需要的头文件 #include "rclcpp/rclcpp.hpp" #include // 声明服务客户端 rclcpp::Client::SharedPtr mujocoUnpauseClient; .mujocoUnpauseClient = this->create_client(.mujocoUnpauseName); // 调用服务启动mujoco仿真 auto unpause = std::make_shared(); .mujocoUnpauseClient->async_send_request(unpause); ``` ### 3.2 MJCF文件的导出 #### 3.2.1 从URDF导出MJCF 以实验室的神农机器人为例,假设现在已经拿到从solidworks中导出的urdf文件,首先需要在`robot`标签下添加mesh文件路径 ```xml ``` 然后打开mujoco程序,无论是mujoco原始仓库的`simulate`程序还是本仓库的launch都可以,这里以本仓库为例 首先用本仓库的launch文件启动mujoco ```shell ros2 launch mujoco_simulator simulate.launch.py ``` 然后在文件夹中把urdf文件拖到mujoco界面中,成功加载后的界面如下图所示 ![](https://picgo-nanhaibei.oss-cn-beijing.aliyuncs.com/20250404155834.png) 如果加载URDF时出现下面的报错,一般是某个mesh面数超过200000,mujoco的compiler不支持,需要手动减少mesh面数后再尝试导入。减少面数的方法见[这篇博文]((https://blog.csdn.net/qq_37389133/article/details/125050981)) ``` Error: number of faces should be between 1 and 200000 in STL file '/home/coral-jyz/project/robot-urdf/ShenNong/urdf/../meshes/base_link.STL'; perhaps this is an ASCII file? ``` 此时按下空格键启动仿真,可能会发现机器人关节乱动 ![](https://picgo-nanhaibei.oss-cn-beijing.aliyuncs.com/20250404160016.png) 这一般是由于机器人的碰撞体积发生干涉,我们需要简化urdf中的碰撞体积。 下面给出一个修改例子,原始urdf中link标签的内容如下,我们需要用简单几何体替换mesh作为碰撞体积 ```xml ``` 作如下修改 ```xml ``` 碰撞体积的简化方式视任务而定。在行走任务中,可以使用长方体作为base_link和脚掌的碰撞体积,其他所有link的碰撞体积都可以删除 tips:在mujoco中按下数字`0`和`1`分别是打开/隐藏碰撞体积与可视化mesh #### 3.2.2 MJCF文件的完善 **添加base_link** 当机器人物理仿真正常后,可以点击mujoco界面左上角的`Save xml`导出MJCF文件了,文件会生成在打开mujoco的终端所在的路径下。需要注意,mujoco默认将base_link与第二个link合并,为了保持正确的link树,需要手动创建base_link 以神农机器人为例,导出的MJCF的body部分如下,第一个body是`LL1_link`而不是`base_link` ```xml ``` 需要作如下修改 ```xml ``` 其中`base_link`的`pos`指机器人初始生成的位置,可自行给定,`inertial`标签下的`pos`,`quat`,`mass`可直接从URDF中读取,`diaginertia`有三个元素,分别是URDF中惯性矩阵的`ixx`,`iyy`,`izz` **添加actuator与sensor** 在MJCF中添加``与``标签后,才能发送电机命令与读取传感器状态 以神农机器人为例,在``标签下添加下面的内容 ```xml ``` 添加完成后,用mujoco打开该MJCF,在`Option`中开启`Sensor`,在右侧边栏中打开`Control`,如果看到如下图所示的画面,说明标签添加成功 ![](https://picgo-nanhaibei.oss-cn-beijing.aliyuncs.com/20250405104500.png) **给关节添加阻尼摩擦力** 默认的关节阻尼和摩擦都是0,可能会导致控制发散。在``标签下添加摩擦`frictionloss`和阻尼`damping`可以解决该问题 ```xml ``` **添加天空和地板** 上诉的MJCF只包含机器人本身,启动物理仿真后机器人会坠入无尽虚空,为了解决该问题,需要在MJCF中添加地板和天空 具体的添加方式再次不赘述,详见实验室的`robot_description_coral`仓库 完成了上述工作后,我们就得到了完善的MJCF文件,可以开始仿真了