09-10 15:59
Notice
Recent Posts
Recent Comments
반응형
관리 메뉴

BAN2ARU

[Foxy/Nav2] 튜토리얼 3. Navigation Concepts - 1) ROS2 본문

Study/Nav2

[Foxy/Nav2] 튜토리얼 3. Navigation Concepts - 1) ROS2

밴나루 2024. 1. 27. 22:12

Nav2 튜토리얼은 공식 홈페이지를 참조하여 작성함

 

이전 글 참조

2024.01.27 - [Study/Nav2] - [Foxy/Nav2] 튜토리얼 2.Development Guides - 2) Dev Containers

 

ROS2는 Nav2에서 사용되는 핵심 middleware이다.

Action Server

ROS와 마찬가지로 action server는 navigation과 같은 장기 실행 작업을 제어하는 일반적인 방법이다. 이 스택은 action을 더 광범위하게 사용하며 경우에 따라 간단한 토픽 인터페이스 없이 사용된다.

ROS2에서의 action server

Action server는 일반적인 서비스 서버와 유사하다. 클라이언트는 어떤 작업을 완료해야 한다고 요청하지만 해당 작업은 오랜 시간이 걸릴 수 있다. 삽을 불도저에서 올리거나 로봇에게 오른쪽으로 10미터 이동하라고 요청하는 것을 예로 들어 보자.

 

이런 상황에서 액션 서버와 클라이언트는 다른 프로세스와 쓰레드에서 장기 실행 작업을 호출하고 해당 결과에 대한 future를 반환한다. 이 시점에서 액션이 완료될 때까지 block하는 것이 허용되지만 작업이 완료되었는지 확인하는 작업은 가능하다. 여기서 block은 작업이 완료되기 전에 계속해서 다른 작업을 수행하지 않고 대기하는 것을 의미한다. 액션 서버는 장기 실행 작업을 진행하는 동안 클라이언트에게 피드백을 제공한다. 이는 작업의 상태에 대한 정보를 주기적으로 전달하는 것을 의미하며, 해당 피드백은 ROS .action에서 요청 및 결과 유형과 함께 정의된다.

 

피드백 및 결과는 action 클라이언트에 등록된 콜백을 사용하여 동기적으로 수집할 수 도 있으며, 공유 future 객체에서 정보를 비동기적으로 요청할 수도 있다. 이 두 가지는 callback 그룹으로 처리하기 위해 클라이언트 노드를 spinning해야 된다. spinning은 노드가 이벤트 및 콜백 처리를 위해 루프를 실행하는 것을 나타내며, 이는 비동기적인 이벤트 처리 및 콜백 함수 실행을 가능하게 하여 ROS에서 여러 작업을 동시에 처리할 수 있도록 한다.

 

노드가 시작되면 초기에는 unconfigured 상태에 있다. 이 상태에서는 on_configure() 메서드가 호출되며, 이 메서드는 노드를 구성하고 초기화하는 역할을 수행한다. on_configure() 메서드는 노드의 구성 단계에서 실행되는 콜백 메서드로, 노드에서 사용할 매개변수 설정 / ROS 네트워킹 인터페이스 설정 / 안전 시스템을 위한 동적 메모리 할당 설정 등을 수행할 수 있다. 구성 단계 이 후에는 노드가 inactive 상태에 있다. 이 상태에서는 on_activate() 메서드가 호출되며, 이 메서드는 노드를 활성화하고 데이터 처리를 시작하는 역할을 수행한다. on_activate() 메서드는 노드의 활성화 단계에서 실행되는 콜백 메서드로, ROS 네트워킹 인터페이스 활성화, 데이터 처리를 시작하기전에 필요한 프로그램 상태 설정, 프로그램이 실제 정보를 처리할 수 있도록 설정과 같은 역할을 수행할 수 있다.

 

shutdown하려면 비활성화, 정리, 종료로 전환한 후 최종 state로 종료된다. 네트워킹 인터페이스는 비활성화되어 처리가 중지되며 메모리는 할당 해제되어 깨끗하게 종료된다.

 

Lifecycle node framework는 이 프로젝트 전체에서 널리 사용되며 모든 서버에서 사용된다. 가능하면 모든 ROS 시스템에서 라이프사이클 노드를 사용하는 것을 권장한다.

 

Nav2에서는 Lifecycle 노드의 wrapper인 nav2_util LifecycleNode를 사용한다. 해당 wrapper는 일반적인 응용 프로그램을 위하여 lifecycle 노드의 복잡성을 줄이기 위해 설계되었으며, Navigation 2에서 사용되는 서버들은 모드 해당 wrapper를 기반으로 하여 통일된 라이프사이클 관리를 제공한다. 또한 해당 wrapper는 bond 연결을 포함하고 있다. bond는 서버가 활성화된 상태에서 계속해서 활성 상태로 유지되도록 하는 매커니즘으로, 서버가 활성화된 상태에서 갑작스런 crash가 발생하면 bond를 통해 라이프사이클 매니저에게 해당 상태 변경을 알리고 시스템을 중단시켜 치명적인 장애를 방지한다.

728x90
Comments