[English Version/英文版](README_EN.md) # 1. 项目描述 本项目为宇树机器狗系列第一章ROS2-Gazebo仿真的基础项目仓库,该仓库会随着系列项目的推进不定时进行更新,当前计划可查看本人飞书查看项目情况[项目飞书](https://ai.feishu.cn/wiki/CVpbwLIiMiwGnekKjhMcLXTRnag?from=from_copylink),这个项目预计将会是一个超长期项目。 # 2. 项目使用 ## 2.1 直接编译使用 进入到工作空间 ```bash cd go2_sim_ws colcon build source install/setup.bash ``` `gazebo_sim` 会在 `source` 后自动设置 **Gazebo 模型搜索路径**(`GZ_SIM_RESOURCE_PATH` / `IGN_GAZEBO_RESOURCE_PATH`)以及 **CycloneDDS** 配置文件路径(`CYCLONEDDS_URI` 指向包内 `dds/cyclonedds.xml`,避免使用 `file://~/...` 导致 `~` 无法展开)。若需使用自己的 DDS 配置,可在 `source` 之后执行 `unset CYCLONEDDS_URI` 或重新 `export` 为绝对路径(`file:///home/...`)。 ![alt text](images/image-17.png) 启动,第一次启动会比较久,因为需要下载相应的场景资源。 ```bash ros2 launch gazebo_sim launch.py ``` 成功启动后会如下图所示。 ![alt text](images/image-18.png) 本项目配备了一个狗的前置普通单目摄像头用以模拟GO2本身的前置摄像头,同时配备了两个激光雷达,一个为模拟GO2的前置L1激光雷达,一个为模拟外界的VLP16激光雷达,两个激光雷达都可同时发布LaserScan类型数据和PointCloud2类型数据,为后续的建图和导航工作提供了便利,而后续也会更新加入D435i摄像头(已经加入D435i摄像头)。 ```bash cd go2_sim_ws source install/local_setup.bash ros2 run teleop_twist_keyboard teleop_twist_keyboard --ros-args -r /cmd_vel:=/robot1/cmd_vel ``` 在终端中执行上述命令后就可以使用键盘对其进行简单的控制了,同时可以使用下面的服务完成对机器狗的控制,支持的服务有walk、up、sit,分别对应走、站、趴。 ```bash ros2 service call /robot1/robot_behavior_command quadropted_msgs/srv/RobotBehaviorCommand "{command: 'walk'}" ``` ## 2.2 docker使用 在使用docker前请简单的阅读docker搭建流程指南,因为每个人的情况还是会有些许差别,而为我使用的是外挂卷的形式完成的任务。 使用下面的命令可以很快的帮您完成想要的操作。 ```bash cd go2_sim_ws/src/docker docker compose up -d --build --remove-orphans #容器构建 docker compose up -d go2_sim #启动容器,-d 为后台运行;go2_sim 为 compose 中的服务名 docker compose ps #容器查看 docker compose exec go2_sim bash #进入容器 docker compose down #容器删除 ``` 进入到docker后,可以按照前面直接安装的操作来 ```bash colcon build source install/setup.bash ``` ![alt text](images/image-19.png) 启动,第一次启动会比较久,因为需要下载相应的场景资源。 ```bash ros2 launch gazebo_sim launch.py # 启动无扩展传感器go2 ros2 launch gazebo_sim launch.py sensors:=true world:=warehouse.sdf # 启动带扩展传感器go2,并选定地图 ``` 成功启动后会如下图所示。 ![alt text](images/image-20.png) 本项目配备了一个狗的前置普通单目摄像头用以模拟GO2本身的前置摄像头,同时配备了两个激光雷达,一个为模拟GO2的前置L1激光雷达,一个为模拟外界的VLP16激光雷达,两个激光雷达都可同时发布LaserScan类型数据和PointCloud2类型数据,为后续的建图和导航工作提供了便利,而后续也会更新加入D435i摄像头。 ```bash cd go2_sim_ws source install/local_setup.bash ros2 run teleop_twist_keyboard teleop_twist_keyboard --ros-args -r /cmd_vel:=/robot1/cmd_vel ``` 在终端中执行上述命令后就可以使用键盘对其进行简单的控制了,同时可以使用下面的服务完成对机器狗的控制,支持的服务有walk、up、sit,分别对应走、站、趴。 ```bash ros2 service call /robot1/robot_behavior_command quadropted_msgs/srv/RobotBehaviorCommand "{command: 'walk'}" ``` ## 2.3 建图和导航 **是否需要多个终端**:需要。`ros2 launch ...` 会持续占用当前终端直到你 Ctrl+C 结束;建图时要让 **Gazebo、Cartographer、键盘遥控** 同时运行,因此必须在 **不同终端**(或 tmux/screen 分屏)中分别启动。**不要**把下面多条 `launch`/`run` 无修饰地粘进同一个终端顺序执行,否则第一条会一直阻塞,后面的命令不会执行。 **每个新终端的公共前提**(在仓库根目录进入工作空间并加载环境): ```bash cd go2_sim_ws source install/setup.bash ``` ### 建图(Cartographer SLAM) 1. **终端 1 — Gazebo 仿真**(带扩展传感器与仓库世界): ```bash ros2 launch gazebo_sim launch.py sensors:=true world:=warehouse.sdf ``` 2. **终端 2 — Cartographer 与 RViz**: ```bash ros2 launch cartographer go2_cartographer.launch.py ``` 3. **终端 3 — 键盘遥控(强烈建议)**:控制机器狗在环境中移动,激光才能扫到足够区域,地图质量才有保障。 ```bash ros2 run teleop_twist_keyboard teleop_twist_keyboard --ros-args -r /cmd_vel:=/robot1/cmd_vel ``` 4. **终端 4 — 保存占据栅格地图**(建图效果满意后再执行;会在**当前工作目录**生成 `warehouse_map.yaml` 和 `warehouse_map.pgm`): ```bash cd go2_sim_ws source install/setup.bash mkdir -p maps_out && cd maps_out ros2 run nav2_map_server map_saver_cli -t map -f warehouse_map ``` 若你在其他目录新开终端,请先 `cd` 到 `go2_sim_ws` 并 `source install/setup.bash`,再 `cd` 到保存目录后执行 `map_saver_cli`。导航时把 `map:=` 设为该 `warehouse_map.yaml` 的**绝对路径**(在 `maps_out` 下可执行 `realpath warehouse_map.yaml` 查看)。 ![alt text](images/image-21.png) ### 导航(Nav2) 使用功能包自带的 `warehouse` 地图时,仿真世界需与建图时一致(仍为 `warehouse.sdf`)。 1. **终端 1 — Gazebo**: ```bash ros2 launch gazebo_sim launch.py sensors:=true world:=warehouse.sdf ``` 2. **终端 2 — Nav2**(默认加载已安装的 `navigation2/maps/warehouse_map.yaml`): ```bash ros2 launch navigation2 go2_navigation2.launch.py ``` 若使用你在建图步骤中自行保存的地图,请传入 **绝对路径**(指向 `.yaml`): ```bash ros2 launch navigation2 go2_navigation2.launch.py map:=/绝对路径/go2_sim_ws/maps_out/warehouse_map.yaml ``` 启动后在 RViz 中使用 Nav2 插件设置初始位姿与目标点即可;导航栈会自动规划路径,**不必**再开键盘遥控作为主控方式。 ![alt text](images/image-22.png)