ROS2 nav2(6)

2024. 11. 7. 09:56ROS2/Nav2

로봇의 footprint 설정이다.

 

footprint는 땅에 투사될 때 로봇의 2D 모양을 윤곽으로 나타내며 Nav2에서 주로 계획 중에 충돌을 피하기 위해 사용된다.

이 작업에 관련된 알고리즘은 로봇의 경로나 계획을 계산하는 동안 로봇이 비용 맵의 장애물과 충돌하지 않도록 한다.

 

footprint랑 robot_radius 두 가지 방법 중 하나로 로봇의 footprint를 정의할 수 있다. 둘 다 **글로벌 및 로컬 비용 맵(costmap)**의 footprint나 robot_radius 파라미터로 설정할 수 있다. 각각의 차이점은 아래와 같다:

  1. footprint:
    • footprint는 2D 좌표들의 벡터로 구성되고, 로봇의 기본 링크(base_link) 프레임을 기준으로 로봇의 윤곽을 정의한다.
    • 예를 들어, 로봇이 사각형 모양이면 사각형의 네 꼭짓점 좌표를 입력해 모양을 설정할 수 있다.
    • 좌표로 정의된 첫 번째와 마지막 점은 자동으로 연결되어 로봇 윤곽의 경계선을 닫는다.
  2. robot_radius:
    • 반면, robot_radius 파라미터는 로봇을 원형으로 간주하고 로봇 중심을 base_link에 위치시켜 반지름을 지정한다.
    • 이 설정은 로봇이 원형이거나 대칭적인 경우에 적합하다.
  3. 우선순위:
    • footprint와 robot_radius를 둘 다 설정했을 때는 footprint가 우선 적용된다.
    • 그래서 사각형이나 복잡한 모양의 로봇에는 footprint를 사용하는 게 일반적이다.

이렇게 정의된 footprint는 경로 생성 시 로봇의 충돌을 피할 수 있도록 비용 맵에서 활용되며, 로봇 모양에 맞는 설정을 선택하는 게 중요하다.

 

로봇의 글로벌 비용 맵(footprint)을 설정할 때, robot_radius (원형) 또는 footprint (다각형) 파라미터를 선택하는 결정은 로봇의 특성, 환경, 그리고 사용할 경로 계획 알고리즘에 따라 달라진다. 비원형 로봇을 사용하더라도 원형 발자취가 허용되는 경우도 있다. 예를 들어, NavFn과 같은 경로 계획 알고리즘은 로봇이 원형이라고 가정하고 그리드 셀별로 충돌을 확인하기 때문에 로봇의 정확한 모양을 발자취로 정의할 필요가 없다. 반면, Smac PlannerHybrid-A* 알고리즘은 로봇의 다각형 모양의 발자취를 가능하면 필요에 따라 충돌 체크를 한다. 따라서 다각형 발자취를 사용하는 것이 유용할 수 있다.

또 다른 예로는 창고를 돌아다니는 작은 RC카 로봇이 있다. 이 로봇은 매우 작아서 제한된 공간에서의 기동이 필요하지 않기 때문에 가장 큰 단면 반지름으로 근사하는 것이 시간 절약의 최적화가 될 수 있다.

로컬 비용 맵에서의 발자취 설정

로컬 비용 맵에서 비원형 로봇의 경우는 일반적으로 footprint (다각형)으로 설정된다. 그러나 다각형 발자취에 대해 충돌 회피 알고리즘을 구현할 컴퓨팅 자원이 부족한 경우나 로봇이 환경에 비해 너무 작아 정밀한 충돌 회피가 필요하지 않은 경우에는 robot_radius (원형)을 사용하는 것도 가능하다. 하지만 일반적으로 로컬 경로 계획자는 로봇의 실제 다각형 발자취를 사용해야 한다.

발자취의 동적 업데이트

로봇이 이동 중일 때, 예를 들어 부착된 조작기나 팔레트를 집을 때 등 로봇의 상태가 변경되면 로봇의 모양도 변할 수 있다. 이때, 비용 맵의 ~/footprint 토픽을 통해 발자취를 실시간으로 업데이트할 수 있다. 로봇의 형태가 바뀌면, 그 변경된 다각형 발자취가 자동으로 계획자와 제어기에 의해 사용된다.

 

config 폴더 아래에 nav2_params.yaml을 만든다. 원래 nav2에 기본 configuration파일이 복사 되지만 sam_bot에 맞게 파라미터 값들을 변경한다.

기본 구성파일은 https://github.com/ros-navigation/navigation2/blob/galactic/nav2_bringup/bringup/params/nav2_params.yaml

 

navigation2/nav2_bringup/bringup/params/nav2_params.yaml at galactic · ros-navigation/navigation2

ROS 2 Navigation Framework and System. Contribute to ros-navigation/navigation2 development by creating an account on GitHub.

github.com

여기 있다.

 

로컬 costmap footprint를 정의하는 코드 조각이다. 이 구성 파일에서 로컬 costmap의 footprint 매개변수는 직사각형 모양의

풋프린트로 설정되었다. 이 상자는 sam_bot 프레임의 base_link 중앙에 위치한다.

resolution: 0.05
footprint: "[ [0.21, 0.195], [0.21, -0.195], [-0.21, -0.195], [-0.21, 0.195] ]"
plugins: ["voxel_layer", "inflation_layer"]

 

글로벌 costmap footprint에는 sam_bot의 크기와 일치하고 base_link의 중앙에 위치한 robot_radius를 설정했고 아래의

파라미터들을 수정해주면 된다.

use_sim_time: True
robot_radius: 0.3
resolution: 0.05

 

빌드하고 실행해준다

colcon build
. install/setup.bash
ros2 launch sam_bot_description display.launch.py

 

tf2변환을 정적으로 퍼블리시 하는 방법이다

ros2 run tf2_ros static_transform_publisher 0 0 0 0 0 0 map odom

 

이러면 map => odom변환이 에러없이 퍼블리시 되어야 한다.

이제 방금 만들었던 yaml파일과 nav2_bringup 패키지에있는 navigation_launch.py을 이용해서 실행시킬수있다.

새로운 터미널을 열어 아래의 내용을 입력한다

ros2 launch nav2_bringup navigation_launch.py params_file:=<full/path/to/config/nav2_params.yaml>

 

rviz2의 add버튼을 눌러 By topic > /local_costmap/published_footprint > Polygon을 눌러주면 아래와 같은 결과를 얻을 수 있다.

 

global_costmap에서도 마찬가지로 설정해주면 아래와 같은 결과를 얻을 수 있다.

이제 이러한 정보들을 가지고 새로운 로봇을 만들어서 적용해보겠다.

'ROS2 > Nav2' 카테고리의 다른 글

ROS2 nav2(5)  (0) 2024.11.06
ROS2 nav2(4)  (0) 2024.11.06
ROS2 nav2(3)  (0) 2024.11.05
ROS2 nav2(2) 22.04 + humble  (0) 2024.11.05
ROS2 nav2  (0) 2024.11.04