9. 경로 계획 및 장애물 회피

이승석·2024년 11월 5일

Delivery Robot

목록 보기
7/11

9. 경로 계획 및 장애물 회피

이 단계에서는 로봇이 지정된 목표 지점까지 자율적으로 이동할 수 있도록 경로 계획(Path Planning)장애물 회피(Obstacle Avoidance) 기능을 구현합니다. 경로 계획은 로봇이 이동할 최적의 경로를 설정하는 과정이고, 장애물 회피는 경로 상의 장애물을 감지하고 안전한 경로로 조정하는 과정입니다. 이를 위해 ROS2의 Nav2 (Navigation Stack 2)를 사용하여 목표 지점까지 안전하게 도달하도록 설정합니다.


1. 경로 계획과 장애물 회피의 필요성

로봇이 특정 위치까지 이동하기 위해서는 다음과 같은 기능이 필요합니다.

  • 경로 계획: 로봇의 현재 위치에서 목표 위치까지의 최적 경로를 계산합니다.
  • 장애물 회피: 이동 중 경로 상에 장애물이 발견되면 이를 감지하고 안전한 경로로 변경하여 회피합니다.
  • 동적 환경 대응: 환경이 동적으로 변할 때 실시간으로 경로를 조정하여 목표 지점까지 안전하게 이동합니다.

Nav2는 이러한 경로 계획과 장애물 회피 기능을 제공하며, 다양한 플러그인을 통해 비용 지도(costmap), 글로벌 및 로컬 경로 계획, 행동 제어 등을 지원합니다.


2. Nav2 패키지 설치

경로 계획과 장애물 회피를 수행하려면 ROS2에서 Nav2 패키지를 설치해야 합니다.

sudo apt update
sudo apt install ros-foxy-navigation2
sudo apt install ros-foxy-nav2-bringup

설치가 완료되면, Nav2 패키지를 사용하여 로봇의 경로 계획과 장애물 회피를 설정할 준비가 됩니다.


3. Nav2 설정 파일 작성

Nav2를 사용하여 로봇의 경로 계획을 수행하려면, 비용 지도(costmap), 로컬 및 글로벌 경로 계획자 등의 설정 파일을 작성해야 합니다.

my_robot_description 패키지의 config 폴더에 Nav2 설정 파일인 nav2_params.yaml을 생성합니다.

touch ~/ros2_ws/src/my_robot_description/config/nav2_params.yaml

nav2_params.yaml 파일을 열고 다음과 같은 내용을 작성하여 Nav2 설정을 구성합니다.

# nav2_params.yaml

amcl:
  ros__parameters:
    use_sim_time: false
    min_particles: 500
    max_particles: 2000
    alpha_slow: 0.001
    alpha_fast: 0.1

global_costmap:
  global_frame: map
  robot_base_frame: base_link
  update_frequency: 1.0
  publish_frequency: 1.0
  plugins: ["static_layer", "obstacle_layer", "inflation_layer"]

  static_layer:
    enabled: true

  obstacle_layer:
    enabled: true
    observation_sources: laser_scan depth_camera
    laser_scan:
      topic: /scan
      max_obstacle_height: 2.0
    depth_camera:
      topic: /camera/depth/points
      max_obstacle_height: 3.0

  inflation_layer:
    inflation_radius: 0.5

local_costmap:
  global_frame: odom
  robot_base_frame: base_link
  update_frequency: 5.0
  publish_frequency: 2.0
  plugins: ["obstacle_layer", "inflation_layer"]

  obstacle_layer:
    enabled: true
    observation_sources: laser_scan depth_camera
    laser_scan:
      topic: /scan
      max_obstacle_height: 2.0
    depth_camera:
      topic: /camera/depth/points
      max_obstacle_height: 3.0

  inflation_layer:
    inflation_radius: 0.5

planner_server:
  ros__parameters:
    expected_planner_frequency: 1.0
    planner_plugins: ["GridBased"]
    GridBased:
      plugin: "nav2_navfn_planner/NavfnPlanner"
      tolerance: 0.5

controller_server:
  ros__parameters:
    controller_frequency: 10.0
    controller_plugins: ["FollowPath"]
    FollowPath:
      plugin: "nav2_regulated_pure_pursuit_controller/RegulatedPurePursuitController"
      desired_linear_vel: 0.5
      lookahead_dist: 0.6

설정 설명:

  • global_costmaplocal_costmap: 로봇의 경로에 장애물이 포함되지 않도록 전역 및 로컬 비용 지도를 설정합니다. 여기서는 RPLIDAR와 RealSense에서 제공하는 데이터를 사용하여 장애물 정보를 추가합니다.
  • planner_server: Nav2에서 사용될 글로벌 경로 계획자를 설정합니다. 여기서는 NavfnPlanner를 사용하여 목표 지점까지의 최적 경로를 생성합니다.
  • controller_server: 로봇의 속도와 회전 각도를 제어하여 로봇이 경로를 따라 이동할 수 있도록 설정합니다.

4. Nav2 Launch 파일 작성

Nav2 노드를 실행하기 위한 launch 파일을 작성하여, 로봇이 경로 계획과 장애물 회피 기능을 실행할 수 있도록 합니다.

my_robot_description 패키지의 launch 폴더에 nav2_launch.py 파일을 생성합니다.

touch ~/ros2_ws/src/my_robot_description/launch/nav2_launch.py

nav2_launch.py 파일에 다음과 같은 내용을 추가하여 Nav2를 실행하도록 설정합니다.

# nav2_launch.py

from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        Node(
            package='nav2_bringup',
            executable='bringup_launch.py',
            name='nav2_bringup',
            output='screen',
            parameters=['~/ros2_ws/src/my_robot_description/config/nav2_params.yaml']
        ),
    ])

이 파일은 nav2_bringup 노드를 실행하여 Nav2 설정 파일을 로드하고, 로봇의 경로 계획 및 장애물 회피 기능을 활성화합니다.


5. 목표 지점 설정 및 테스트

Nav2를 실행한 후, RViz에서 로봇의 목표 지점을 설정하고 경로 계획 및 장애물 회피 기능을 테스트할 수 있습니다.

5.1 Nav2 Launch 파일 실행

다음 명령어를 사용하여 Nav2를 실행합니다.

ros2 launch my_robot_description nav2_launch.py

Nav2가 실행되면 로봇의 현재 위치와 비용 지도(costmap), 경로 등이 자동으로 생성됩니다.

5.2 RViz에서 목표 지점 설정

RViz에서 목표 지점을 설정하여 로봇이 해당 위치까지 이동하도록 합니다.

  1. RViz 실행:

    ros2 run rviz2 rviz2
  2. 2D Goal Pose 도구 사용: RViz 상단 메뉴에서 2D Goal Pose 도구를 선택한 후, 목표 지점을 클릭하여 설정합니다. 로봇이 이 목표 지점까지 이동할 수 있도록 Nav2가 경로를 계획하고, 로봇을 이동시킵니다.

5.3 경로 계획 및 장애물 회피 확인

로봇이 목표 지점까지 이동하는 동안, 경로 상의 장애물을 감지하고, 장애물이 있을 경우 로컬 경로를 실시간으로 조정하여 안전한 경로로 회피하는지 확인합니다. RViz에서는 로봇의 이동 경로와 주변 장애물 정보가 시각화됩니다.


6. 실시간 경로 수정 및 동적 장애물 대응

Nav2는 로봇의 주변 환경이 실시간으로 변할 때에도 경로를 수정하여 안전하게 이동할 수 있습니다. 예를 들어, 이동 중 새로운 장애물이 나타나면 Nav2가 로컬 경로를 조정하여 회피하도록 설정할 수 있습니다.

6.1 동적 장애물 추가

Gazebo에서 로봇의 경로 상에 새로운 장애물을 추가하여, Nav2가 이를 회피하도록 테스트합니다. RPLIDAR와 RealSense 센서가 장애물을 감지하면 Nav2는 로컬 비용 지도를 업데이트하고 새로운 경로를 생성하여 회피할 것입니다.

6.2 실시간 경로 수정 확인

RViz에서 로봇의 경로와 비용 지도가 실시간으로 업데이트되는지 확인합니다. 로봇이 이동 중에도 경로를 안전하게 수정하여 목표 지점까지 도달하는지 확인할 수 있습니다.


7. 장애물 회피 성능 향상

Nav2의 경로 계획과 장애물 회피 성능을 향상시키기 위해, 비용 지도와 경로 계획 알고리즘의 매개변수를 조정할 수 있습니다.

7.1 비용 지도 매개변수 조정

nav2_params.yaml 파일에서 inflation_radius와 같은 매개변수를 조정하여 로봇과 장애물 간의 최소 거리를 설정할 수 있습니다. 이를 통해 로봇이 장애물 근처를 지나갈 때 안전 거리를 유지하도록 조정할 수 있습니다.

**7.2 로컬 경

로 계획 알고리즘 설정**

로컬 경로 계획 알고리즘에서 desired_linear_vel, lookahead_dist와 같은 매개변수를 조정하여 로봇의 속도와 장애물 회피 반응성을 최적화할 수 있습니다. 로봇이 부드럽게 이동하고 장애물을 민첩하게 회피하도록 설정합니다.


결론

이 단계에서는 Nav2를 사용하여 경로 계획과 장애물 회피 기능을 구현하고, 로봇이 지정된 목표 지점까지 안전하게 이동할 수 있도록 설정했습니다. 경로 상의 장애물을 감지하고 회피하면서 목표 지점까지 최적의 경로를 유지하도록 설정함으로써, 로봇이 자율적으로 다양한 환경에서 이동할 수 있게 되었습니다. 이제 배달 로봇은 지도와 위치 추정을 기반으로 자율적으로 경로를 설정하고 이동할 수 있으며, 실시간으로 장애물 회피를 수행할 수 있습니다.

profile
student studying Embedded-development

0개의 댓글