Simple Commander API

개요

Nav2 Simple (Python3) Commander의 목표는 Python3 사용자에게 “라이브러리로서의 내비게이션” 기능을 제공하는 것입니다. Nav2의 기능을 활용하여 응용 프로그램을 구축할 수 있도록 ROS 2 및 액션 서버 작업을 모두 처리하는 API를 제공합니다. 또한 nav2_simple_commander 패키지에서 사용법 및 데모를 제공합니다. Github Page

아래에 간단한 데모가 표시됩니다. 참고로 goToPose(), goThroughPoses(), followWaypoints() 와 유사한 함수들은 비동기적 으로 작동하여 단일 스레드 응용 프로그램에서 피드백을 수신하고 처리할 수 있습니다. 따라서 작업이 완료될 때까지 기다리는 동안, while not nav.isTaskComplete() 디자인은 내비게이션 완료 사항을 폴링하고, 작업이 완료되지 않은 경우 응용 프로그램에서 관심 있는 작업(피드백 처리, 로봇이 수집한 데이터 처리, 오류 확인 등)을 수행해야 합니다.

이 간단한 commander는 동일한 유형의 명령을 예상되는 것과 중단할 수 있지만, goToPose()goThroughPoses() 또는 followWaypoints() 간을 전환할 때는 현재 명령을 명시적으로 취소하고 새로운 명령을 내려야 합니다.

from nav2_simple_commander.robot_navigator import BasicNavigator
import rclpy

rclpy.init()
nav = BasicNavigator()

# ...

nav.setInitialPose(init_pose)
nav.waitUntilNav2Active() # if autostarted, else use lifecycleStartup()

# ...

path = nav.getPath(init_pose, goal_pose)
smoothed_path = nav.smoothPath(path)

# ...

nav.goToPose(goal_pose)
while not nav.isTaskComplete():
  feedback = nav.getFeedback()
  if feedback.navigation_duration > 600:
    nav.cancelTask()

# ...

  result = nav.getResult()
  if result == TaskResult.SUCCEEDED:
      print('Goal succeeded!')
  elif result == TaskResult.CANCELED:
      print('Goal was canceled!')
  elif result == TaskResult.FAILED:
      print('Goal failed!')

Commander API

기본 Navigator에서 제공하는 메서드는 다음과 같습니다. 입력 및 예상 반환 값을 보여줍니다. 서버가 실패하면 예외를 throw하거나 None 객체를 반환할 수 있으므로 내비게이션 호출을 try/catch로 적절하게 래핑하고 반환 값을 None 유형으로 확인하십시오.

2023년 9월 이후 새로운 기능: 간단한 Navigator 생성자는 다중 로봇 응용 프로그램 또는 네임스페이스 Nav2 시작을 지원하기 위해 namespace 필드를 허용합니다.

Table 2 Robot Navigator 메서드 설명

Robot Navigator 메서드 설명

설명

setInitialPose(initial_pose)

로봇의 초기 위치(PoseStamped)를 설정합니다.

goThroughPoses(poses, behavior_tree='')

일련의 위치(PoseStamped 의 목록)를 통과하도록 로봇에 요청합니다.

goToPose(pose, behavior_tree='')

특정 위치(PoseStamped)로 로봇을 이동하도록 요청합니다.

followWaypoints(poses)

일련의 경유지(PoseStamped 의 목록)를 따라 이동하도록 로봇에 요청합니다.

followPath(path, controller_id='', goal_checker_id='')

시작점에서 목표지까지의 경로(PoseStamped, nav_msgs/Path)를 따라가도록 로봇에 요청합니다.

spin(spin_dist=1.57, time_allowance=10)

주어진 각도로 로봇을 회전하도록 요청합니다.

driveOnHeading(dist=0.15, speed=0.025, time_allowance=10)

주어진 거리만큼 로봇을 특정 방향으로 운전하도록 요청합니다.

backup(backup_dist=0.15, backup_speed=0.025, time_allowance=10)

주어진 거리만큼 로봇을 후진하도록 요청합니다.

assistedTeleop(time_allowance=30)

보조 텔레옵 작업을 실행하도록 로봇에 요청합니다.

cancelTask()

진행 중인 작업을 취소합니다.

isTaskComplete(trackingRoute=False)

작업이 완료되었는지 확인합니다. 경로 추적 작업을 확인하는 경우, 기본 인수를 True 로 설정합니다.

getFeedback(trackingRoute=False)

작업으로부터 피드백을 받아옵니다. 경로 추적 작업의 피드백을 가져오려면 기본 인수를 True 로 설정합니다.

getResult()

작업의 최종 결과를 가져옵니다. isTaskCompleteTrue 를 반환한 후에 호출해야 합니다.

getPath(start, goal, planner_id='', use_start=False)

시작점에서 목표지까지의 경로를 가져옵니다. (PoseStamped, nav_msgs/Path)

getPathThroughPoses(start, goals, planner_id='', use_start=False)

시작점에서 목표지까지의 경로를 가져옵니다. (PoseStamped 의 목록, nav_msgs/Path)

getRoute(start, goal, use_start=False)

시작점에서 목표지까지의 빈도 경로와 밀집 경로를 가져옵니다. 시작점과 목표점은 알려진 NodeIDs의 경우 PoseStamped 또는 int 일 수 있습니다.

getandTrackRoute(start, goal, use_start=False)

시작점에서 목표지까지의 빈도 경로와 밀집 경로를 가져오고 추적합니다. 시작점과 목표점은 알려진 NodeIDs의 경우 PoseStamped 또는 int 일 수 있습니다.

smoothPath(path, smoother_id='', max_duration=2.0, check_for_collision=False)

주어진 경로를 부드럽게 만듭니다. (nav_msgs/Path)

changeMap(map_filepath)

현재 맵에서 map_filepath 의 yaml로 변경을 요청합니다.

clearAllCostmaps()

전역 및 로컬 코스트맵을 모두 지웁니다.

clearLocalCostmap()

로컬 코스트맵을 지웁니다.

clearGlobalCostmap()

전역 코스트맵을 지웁니다.

getGlobalCostmap()

전역 코스트맵을 가져옵니다.

getLocalCostmap()

로컬 코스트맵을 가져옵니다.

waitUntilNav2Active(navigator='bt_navigator', localizer='amcl')

Nav2가 완전히 온라인이 되고 라이프사이클 노드가 활성 상태에 있는지 블록됩니다. autostart 또는 외부 라이프사이클 bringup과 함께 사용하십시오.

lifecycleStartup()

모든 라이프사이클 관리 서버에 활성 상태로 전환하도록 요청을 보냅니다. autostart가 False 인 경우에 사용하여 이 프로그램이 Nav2의 라이프사이클을 제어합니다.

lifecycleShutdown()

모든 라이프사이클 관리 서버에 종료 요청을 보냅니다.

destroyNode()

객체에서 사용하는 리소스를 해제합니다.

코스트맵 API

이것은 코스트맵 2D 메시지에 대한 Python3 API입니다. 코스트맵 2D C++ API에서 찾을 수 있는 기본 변환, 가져오기/설정 및 처리 세맨틱스를 제공합니다.

Table 3 코스트맵 메서드 설명

메서드

설명

getSizeInCellsX()

셀의 맵 너비를 가져옵니다.

getSizeInCellsY()

셀의 맵 높이를 가져옵니다.

getSizeInMetersX()

미터 단위로 x 축 맵 크기를 가져옵니다.

getSizeInMetersY()

미터 단위로 y 축 맵 크기를 가져옵니다.

getOriginX()

맵의 x 축 원점을 가져옵니다.

getOriginY()

맵의 y 축 원점을 가져옵니다.

getResolution()

맵 해상도를 가져옵니다.

getGlobalFrameID()

전역 프레임 ID를 가져옵니다.

getCostmapTimestamp()

코스트맵 타임스탬프를 가져옵니다.

getCostXY(mx, my)

맵 좌표 mx (int), my (int)를 사용하여 코스트맵의 셀을 가져옵니다.

getCostIdx(index)

인덱스 (int)를 사용하여 코스트맵의 셀을 가져옵니다.

setCost(mx, my, cost)

맵 좌표 mx (int), my (int)를 사용하여 코스트맵의 셀을 설정합니다.

mapToWorld(mx, my)

맵 좌표 mx (int), my (int)를 사용하여 월드 좌표 wx (float), wy (float)를 가져옵니다.

worldToMapValidated(wx, wy)

월드 좌표 wx (float), wy (float)를 사용하여 맵 좌표 mx (int), my (int)를 가져옵니다. wx wy 좌표가 유효하지 않은 경우, (None,None)을 반환합니다.

getIndex(mx, my)

맵 좌표 mx (int), my (int)를 사용하여 셀의 인덱스 (int)를 가져옵니다.

풋프린트 충돌 체크 API

이것은 풋프린트 충돌 체크를 위한 Python3 API입니다. 좌표를 조작하고 주어진 맵에서 풋프린트의 비용을 계산하는 데 필요한 메서드를 제공합니다.

Table 4 풋프린트 충돌 체커 메서드 설명

메서드

설명

footprintCost(footprint)

암시적으로 제공된 좌표 위치에서 풋프린트 (Polygon)를 충돌로 확인합니다.

lineCost(x0, x1, y0, y1, step_size=0.5)

라인을 따라 모든 지점을 반복하여 충돌을 확인합니다. 라인은 x0, y0, x1, y1, step_size (int 또는 float)으로 정의됩니다.

worldToMapValidated(wx, wy)

월드 좌표 wx (float), wy (float)를 사용하여 맵 좌표 mx (int), my (int)를 가져옵니다. wx wy 좌표가 유효하지 않은 경우, (None,None)을 반환합니다. 코스트맵이 (setCostmap(costmap) 를 통해) 아직 정의되지 않은 경우 None이 반환됩니다.

pointCost(x, y)

맵 좌표 XY를 사용하여 코스트맵의 점의 비용을 가져옵니다. (int)

setCostmap(costmap)

풋프린트 충돌 체커와 함께 사용할 코스트맵을 지정합니다. (PyCostmap2D)

footprintCostAtPose(x, y, theta, footprint)

맵 좌표에서 특정 Pose의 풋프린트 비용을 가져옵니다. x, y, theta (float) 및 풋프린트 (Polygon).

예제와 데모

이 모든 내용은 패키지 에서 찾을 수 있습니다.

nav2_simple_commander 에는 사용자로서 사용할 수 있는 API 기능을 강조하는 몇 가지 예제가 있습니다:

  • example_nav_to_pose.py - Navigator의 pose로 이동하는 기능 및 여러 보조 메서드를 보여줍니다.

  • example_nav_through_poses.py - Navigator의 위치를 통과하는 기능과 여러 보조 메서드를 보여줍니다.

  • example_waypoint_follower.py - Navigator의 waypoint를 따라가는 기능과 여러 보조 메서드를 보여줍니다.

  • example_follow_path.py - Navigator의 경로를 따라가는 기능과 경로 부드럽게 만드는 등 여러 보조 메서드를 보여줍니다.

nav2_simple_commander 에는 사용자가 API를 사용하여 빌드할 수 있는 간단한 자율성 응용 프로그램을 강조하는 몇 가지 데모가 있습니다:

  • demo_security.py - 간단한 보안 로봇 응용 프로그램으로, 보안 경로를 따라 로봇이 순찰 경로를 수행하도록 Navigate Through Poses를 사용하는 방법을 보여줍니다.

  • demo_picking.py - 간단한 물건 집는 응용 프로그램으로, 로봇이 창고의 특정 선반으로 이동하여 물건을 집거나 사람이 물건을 바구니에 넣고 배송 목적지로 전달하는 방법을 보여줍니다.

  • demo_inspection.py - 간단한 선반 검사 응용 프로그램으로, 선반의 현재 상태를 분석하고 찾을 수 있는 항목을 확인하기 위해 Waypoint Follower 및 작업 실행기를 사용하는 방법을 보여줍니다.

example_nav_to_pose.py

먼저 로봇 bringup 을 완료 한다.

로봇의 bash 즉 PC에서 로봇에 ssh 접속한 bash이다.

ros2 launch zeta2_bringup zeta2_bringup.launch.py # if, mc, control, odom, making tf, scan, joy

다음으로 PC에서 navigation을 실행해준다.

ros2 launch zeta2_navigation zeta2_navigation.launch.py

그리고 PC에서 새로운 터미널을 열고 example_nav_to_pose를 실행한다.

ros2 run zeta2_simple_commander example_nav_to_pose

그 결과 아래와 같이 작동할 것이다.

../../_images/example_nav_to_pose_x2.gif

example_nav_through_poses.py

먼저 로봇 bringup 을 완료 한다.

로봇의 bash 즉 PC에서 로봇에 ssh 접속한 bash이다.

ros2 launch zeta2_bringup zeta2_bringup.launch.py # if, mc, control, odom, making tf, scan, joy

다음으로 PC에서 navigation을 실행해준다.

ros2 launch zeta2_navigation zeta2_navigation.launch.py

그리고 PC에서 새로운 터미널을 열고 example_nav_through_poses를 실행한다.

ros2 run zeta2_simple_commander example_nav_through_poses

그 결과 아래와 같이 작동할 것이다.

../../_images/example_nav_through_pose_x2.gif

이런 식으로 다양한 샘플 예제 코드를 보고 수정하여 자신의 환경에 맞는 경로 설정을 할 수 있다.