Navigation2 / Nav2
기존 ROS1에서 Move base라 불리던 package가 ROS2로 넘어 오면서 Nav2라는 이름으로 변경 되었다.
참고 링크
포스팅 환경
- ubuntu 20.04
- ros2 foxy
https://coding-robot.tistory.com/44
그리고 저처럼 Mac에 미쳐서 심지어 M1으로 하실 분은 이렇게 하세요
DockerFile
FROM osrf/ros:foxy-desktop
WORKDIR /root
RUN mkdir -p foxy_ws/src/
RUN apt update && \\
apt install ros-foxy-navigation2 ros-foxy-nav2-bringup ros-foxy-turtlebot3* -y
VOLUME [ "/root/foxy_ws/src/" ]
SHELL [ "/bin/bash" , "-c"]
RUN echo "source /opt/ros/$ROS_DISTRO/setup.bash" >> .bashrc
WORKDIR /root/foxy_ws/src
실행
docker build -t navigation
docker run -it --name ros -v $(pwd):/root/foxy_ws/src navigation
cd ..
colcon build
Nav2 설치
기본적으로는 다음과 같이 설치 한다.
sudo apt install ros-<distro>-navigation2 \\
ros-<distro>-nav2-bringup \\
ros-<distro>-turtlebot3*
하지만 좀더 심도있게 공부하고, Navigation을 다뤄야 한다면 다음과 같이 다운 받는걸 추천한다.
cd ~/{YOUR_WORK_SPACE}/src
git clone <https://github.com/ros-planning/navigation2.git> --branch -devel
cd ~/nav2_ws
rosdep install -y -r -q --from-paths src --ignore-src --rosdistro
colcon build --symlink-install
Move Base에서 Nav2로 변화
기존 move base를 분석해 보면 상당히 코드가 비효율적이고, 에러가 많이 날 수 있게 짜여진 것을 확인 할 수 있다. 이를 새롭게 구성하고, 굉장히 깔끔하게 재구성 한 게 다음의 David Lu의 robot navigation이다.
https://github.com/locusrobotics/robot_navigation
하지만 위 package는 ros1에서 만들어져 있고, 여기서 더 발전한게 nav2이다.
그에대한 정보는 아래에 있다. (글 중간에 We would like to thank David Lu!! and Mike Ferguson for their tireless over the span of a decade to keep the Nav Stack alive and well 이라는 항목이 있다.)
https://navigation.ros.org/about/index.html?highlight=david
Nav2 구성
Nav2에서는 기존의 Move Base와 비슷한 구성을 가져가지만 다른 점들도 많다.
구성에는 다음과 같다.
controller server
- Nav2에서는 기본적으로 여러개의 controller를 띄워 놓고 그중에 골라서 사용할 수 있다.
- 현재 어떤 controller를 사용해야 하고, 현재 로봇이 goal point에 도착했는지 확인해 주는 역할을 한다.
- 각가의 controller는 controller server의 plugin으로써 작동한다.(각각 따로 node를 가지지 않는다.)
controller
- 기존의 local planner와 같은 역할을 한다.
- controller가 장애물을 판단해서 피해가게 할 수는 있지만 주 역할은 path를 로봇이 따라가게 만드는 것이다.
- 장애물 회피를 하고 싶다면 차라리 planner에서 path를 업데이트 하자.
- 사실 기존의 local planner와 global planner의 역할을 생각해 보면 local planner에서 굳이 새로 local path를 생성하는 것 보단 path생성 자체는 global planner가 가져가고 local planner는 로봇을 어떻게 ‘움직일’ 것인가에 더 비중을 둬서 이름을 바꾼듯 하다.
planner server
- planner도 controller와 마찬가지로 여러개를 띄워 놓고 작동하게 된다.
- 각각의 planner는 planner server의 plugin으로써 작동한다.(각각 따로 node를 가지지 않는다.)
planner
- 기존의 global planner와 같은 역할을 한다.
- 위에서 설명했듯이 path를 만들어 내는건 planner의 역할이고, plan을 따라가게 하는건 controller의 역할이다.
costmap
- 크게 바뀐 사항이 없다.
recovery behavior
- recovery server에 의해 관리 되며, 각각은 plugin으로 작동한다.
bt navigator
- move base와 비교해서 가장 크게 달라진 점이다.
- 기존 FSM으로 진행되던 방식에서 Behavior Tree를 사용하게 되면서 좀더 다채로운 Navigation을 만들수 있게 됐다.
- behavior_tree_cpp_v3를 사용한다.
https://github.com/BehaviorTree/BehaviorTree.CPP
acml
- Navigation 포스팅이니까 다루지 않는다.
'ROS' 카테고리의 다른 글
[ROS2] Navigation2 분석(3) - DWB Controller (0) | 2022.05.17 |
---|---|
[ROS2] Navigation2 분석(2) - Controller Server (0) | 2022.05.17 |
[ROS2] Lifecycle Node(nav2_util/LifecycleNode) (0) | 2022.03.30 |
[ROS2] Install (Ubuntu 20.04, foxy) (0) | 2022.03.30 |
[ROS] Move Base (6) Local Planner 개념 (0) | 2022.03.16 |