Navigation2(Nav2)是ROS2中用于机器人导航的核心框架,支持路径规划、避障、SLAM等功能。本教程将详细介绍Nav2的安装与构建方法,涵盖二进制安装、源码编译及Docker部署等多种方式,适用于不同开发需求。
一、通过APT安装Nav2(推荐新手)
适用于直接使用官方预编译的二进制包,快速部署Nav2环境。
步骤1:安装Nav2及相关依赖
根据ROS2发行版(如Foxy、Humble)替换命令中的<distro>
:
sudo apt install ros-<distro>-navigation2 ros-<distro>-nav2-bringup ros-<distro>-turtlebot3*
步骤2:验证安装
安装完成后,运行TurtleBot3仿真示例:
ros2 launch nav2_bringup tb3_simulation_launch.py
二、从源码构建Nav2(开发者适用)
适用于需自定义功能或使用最新主分支代码的场景。
方式1:为特定ROS2发行版构建
以ROS2 humble为例:
创建工作空间并克隆代码:
mkdir -p ~/nav2_ws/src
cd ~/nav2_ws/src
git clone https://github.com/ros-planning/navigation2.git --branch humble
安装依赖并编译:
cd ~/nav2_ws
rosdep install -y -r -q --from-paths src --ignore-src --rosdistro humble
colcon build --symlink-install
激活环境:
source install/setup.bash
方式2:主分支快速构建(使用脚本)
获取最新未发布代码:
下载初始化脚本:
mkdir nav2_workspaces && cd nav2_workspaces
wget https://raw.githubusercontent.com/ros-planning/navigation2/main/tools/initial_ros_setup.sh
chmod +x initial_ros_setup.sh
./initial_ros_setup.sh
脚本自动完成以下操作:
下载ROS2主分支、依赖包及Nav2源码。
执行build_all.sh
自动编译所有组件。
小结:
-
脚本initial_ros_setup.sh会下载三个ROS 工作空间,然后按照正确的顺序构建它们。
-
这三个工作空间分别是:
- ROS 2发行版:为最新的ROS 2发行版,由此处的存储库文件定义;
- ROS 2依赖包:为一组未包含在ROS 2发行版中的ROS 2软件包。但是需要这些软件包才能构建Nav2。还包括组成ROS 2发行版的一些软件包,因为Nav2要使用这些软件包的不同版本;
- Nav2:即本存储库。
-
下载所有工作空间后,运行navigation2/tools/build_all.sh脚本。
-
脚本build_all.sh使用colcon build --symlink-install命令按照上面列出的顺序构建每个存储库。
-
脚本initial_ros_setup.sh可以接受以下选项:
-
--no-ros2:这会跳过下载和构建ROS 2发行版。相反,它会使用安装在/opt/ros/<ros2-distro>目录中的二进制软件包和setup.sh脚本;
-
--download-only:这会跳过构建步骤。
-
三、使用Docker部署Nav2
适用于隔离环境开发或CI/CD流程。
3.1 构建自定义Docker镜像
克隆仓库并构建镜像:
git clone https://github.com/ros-planning/navigation2.git
cd navigation2
sudo docker build -t nav2/latest .
使用代理(如需):
sudo docker build -t nav2/latest --build-arg http_proxy=http://proxy.my.com:8080 --build-arg https_proxy=http://proxy.my.com:8080 .
加速构建(利用DockerHub缓存)
sudo docker pull rosplanning/navigation2:main # 拉取官方缓存
sudo docker build -t nav2/latest --cache-from rosplanning/navigation2:main .
3.2 拉取官方镜像
sudo docker pull rosplanning/navigation2:main
注意:镜像不包含预构建的覆盖层,需在容器内手动构建Nav2工作空间。
3.3 运行Nav2容器
基本启动
sudo docker pull rosplanning/navigation2:main
启用图形界面(如Rviz):Linux系统需允许容器访问X11服务:
xhost +local:root # 临时开放X11权限
sudo docker run -it --rm \
--env="DISPLAY" \
--env="QT_X11_NO_MITSHM=1" \
--volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
--name nav2_container \
rosplanning/navigation2:main
挂载宿主机目录(共享数据):将本地ROS工作空间挂载到容器中:
sudo docker run -it --rm \
--volume="/path/on/host:/path/in/container" \
rosplanning/navigation2:main
使用主机网络模式(简化通信)
sudo docker run -it --rm \
--net=host \ # 直接使用主机网络
rosplanning/navigation2:main
3.4 在容器内使用Nav2
启动Gazebo仿真
# 进入容器后执行
ros2 launch nav2_bringup tb3_simulation_launch.py
运行SLAM节点
ros2 launch nav2_bringup slam_launch.py
调用导航服务
ros2 action send_goal /navigate_to_pose nav2_msgs/action/NavigateToPose "{pose: {header: {frame_id: 'map'}, pose: {position: {x: 1.0, y: 0.5}, orientation: {z: 0.707, w: 0.707}}}}"