# guguji_simulation

guguji 的 ROS 2 Humble 仿真环境。

## 当前结构

当前工作空间位于 `guguji_ros2_ws/`，其中 `src/guguji_ros2` 是机器人描述与仿真包。

`guguji_ros2` 软件包包含：

- `urdf/`：机器人模型
- `meshes/`：网格模型
- `launch/`：ROS 2 启动文件
- `worlds/`：Gazebo world 文件
- `config/`：关节配置

## 依赖安装

在 Ubuntu 22.04 + ROS 2 Humble 环境中，至少需要安装：

```bash
sudo apt update
sudo apt install \
  ros-humble-joint-state-publisher \
  ros-humble-joint-state-publisher-gui \
  ros-humble-robot-state-publisher \
  ros-humble-ros-gz \
  ros-humble-ros-gz-bridge \
  ros-humble-ros-gz-sim \
  ros-humble-rviz2 \
  ros-humble-sdformat-urdf \
  ros-humble-xacro \
  ros-humble-tf2-msgs
```

## 构建

在仓库根目录执行：

```bash
source /opt/ros/humble/setup.bash
cd guguji_ros2_ws
colcon build --packages-select guguji_ros2
source install/setup.bash
```

## 启动方式

仅查看模型与 TF：

```bash
ros2 launch guguji_ros2 display.launch.py
```

启动 Gazebo Fortress 仿真：

```bash
ros2 launch guguji_ros2 gazebo.launch.py
```

如果你在无图形界面的环境中调试，可以关闭 Gazebo GUI：

```bash
ros2 launch guguji_ros2 gazebo.launch.py gui:=false
```

如果你准备做强化学习训练，建议让 Gazebo 以暂停模式启动：

```bash
ros2 launch guguji_ros2 gazebo.launch.py gui:=false pause:=true
```

## Fortress 调试接口

`gazebo.launch.py` 现在已经接通了下面几类接口：

- `/clock`：Gazebo 仿真时钟
- `/joint_states`：Gazebo 真实关节状态
- `/tf`：Gazebo 真实模型/连杆位姿
- `/guguji/command/<joint_name>`：每个关节的位置控制命令，消息类型为 `std_msgs/msg/Float64`
- `/world/default/control`：Gazebo 世界控制服务，可用于 reset / pause / step

## 强化学习工程

仓库根目录下新增了 `guguji_rl/`，用于放置强化学习训练和策略运行代码。这样做是为了把：

- ROS 2 / Gazebo 仿真代码
- Python 强化学习依赖与训练输出

分开管理，后续会更容易调试。

## 真实机器人部署工程

仓库根目录下新增了 `guguji_real_robot/`，用于把训练后的策略部署到真实双足机器人：

- `host/`：本机加载训练模型，通过 WiFi UDP 输出 8 个关节目标。
- `firmware/esp32s3_espidf/`：ESP32S3 固件，接收 UDP 命令并通过 TWAI/CAN 控制 RS00。
- `docs/`：接线、刷机、部署、RS00 MIT 协议和安全调试说明。

建议从 `guguji_real_robot/docs/real_robot_deployment_guide.md` 开始阅读。

## 控制示例

例如把左膝关节目标角度设置为 `0.8 rad`：

```bash
ros2 topic pub --once /guguji/command/left_knee_pitch_joint std_msgs/msg/Float64 "{data: 0.8}"
```

查看关节状态：

```bash
ros2 topic echo /joint_states
```

查看 TF：

```bash
ros2 topic echo /tf
```
