전통문화대전망 - 전통 미덕 - Ros 글로벌 계획이 완료되었습니다. 노선은 왜 이동합니까?

Ros 글로벌 계획이 완료되었습니다. 노선은 왜 이동합니까?

ROS 에서 로봇 전역 경로 계획은 기본적으로 navfn 패킷을 사용하며 move_base 의 기본 매개변수에서 찾을 수 있습니다.

Base _ global _ planner ('string', 기본값:' navfn/NavfnROS')

내비게이션의 소스 코드에는 global_planner 의 패키지도 있는데, A * 와 Dijkstra 등의 알고리즘이 구현되었지만 navfn 의 소스 프로그램에도 이 두 알고리즘의 구현이 있습니다. 기본적으로 global_planner 폴더의 소스 프로그램은 전혀 사용되지 않습니다. 그렇다면 왜 ROS 의 글로벌 네비게이션에는 두 개의 패키지가 있습니까? 그들 사이의 관계는 무엇입니까? 초기 개발 navfn 패킷 탐색, 기본적으로 Dijkstra 글로벌 경로 계획, * 코드, 왜 A *? 여기 A* 알고리즘에는 버그가 있기 때문에 아무도 할 시간이 없습니다! 13 까지 육삼금은 이 부분을 완성하지 못하고 global_planner 패키지를 다시 발표했다. 수정된 코드는 더 잘 캡슐화되고 명확합니다. 그래서 global_planner 도 navfn 의 업그레이드 제품으로 볼 수 있습니다. 그럼 질문은, 왜 육삼금이 navfn 을 global_planner 로 대체하지 않았을까요? 호환성을 위해. 그래서 두 패키지 모두 존재합니다. 기본값은 navfn 입니다. 즉, global_planner 는 쓸모가 없습니다.

Global_planner 패키지 사용 방법

Move_base 매개변수 base_global_planner 를 global_planner/GlobalPlanner 로 바꾸면 됩니다.

윌 (남자 이름)

& lt paramname = "base _ global _ planner" value = "global _ planner/global planner"/>

Move_base 는 다양한 글로벌 또는 로컬 계획 패키지를 어떻게 호출합니까?

ROS 의 공식 wiki 자습서에서는 자신의 경로 계획 알고리즘을 확장할 수 있다고 언급했습니다. ROS 의 플러그인 메커니즘을 활용하는 것입니다.

1. 특정 프로그램 추가 (pluginlib _ export _ class (...)) 자신이 작성한 전역 또는 로컬 계획자 알고리즘의 시작 부분에 플러그인 메커니즘을 등록합니다.

2. xx_plugin.xml 과 같은 파일에서 이 플러그인을 설명합니다.

3.package.xml 은 이 플러그인이 ROS 에 이를 사용할 것임을 알리는 데 사용된다고 명시합니다.

자세한 절차는 공식 위키 (ROS 의 플러그인 메커니즘) 를 참조하십시오. 위의 작업이 완료되면 위와 같이 매개 변수로 직접 전달할 수 있습니다.

플러그인은 어떻게 작동합니까? (아래 추가 정보 참조)

위의 플러그인의 작동 모드는 ROS 에서 제공하는 템플릿에 따라 구현되어야 한다는 것을 알려줍니다. 이것이 바로 nav_core 패키지가 존재하는 의미입니다. 탐색의 소스 코드에서 이 nav_core 패키지에 몇 개의 헤더 파일만 있는 것을 볼 수 있습니다. 이 헤더 파일은 여러 개의 템플릿을 제공합니다.

Nav_core::BaseGlobalPlanner,

Nav_core::BaseLocalPlanner,

Nav _ core:: 복구 동작

공식 위키문서에서 그들의 소개를 볼 수 있습니다. 따라서 이러한 템플릿의 표준 형식에 따라 자체 플래너 알고리즘을 작성하면 됩니다. 이것들을 알게 되면, 다른 사람이 쓴 각종 기획 플러그인을 다시 보면 매우 간단하다. Global_planner 패키지 및 dwa_local_planner 패키지 외에도 sbql global planner, eband local planner, carrot_planner 등과 같은 다른 많은 알고리즘이 있습니다 구체적인 경로 계획 알고리즘은 매우 많다. A* 와 Dijkstra 알고리즘의 구체적인 구현을 먼저 살펴 보겠습니다.

Global_planner/GlobalPlanner 구현

[global_planner/GlobalPlanner 소스 코드 분석] (/u013158492/article/details)

보충: 플러그인은 어떻게 작동합니까?

원칙:

-pluginlib 가 어떻게 작동하는지 이해하기 위해, 작은 예를 고려해 봅시다.

—먼저 다각형 기본 클래스 ("polygon_interface_package") 가 포함된 ROS 패키지가 있다고 가정합니다.

—다각형에는 rectangle_plugin 패키지 (사각형) 와 triangle_plugin 패키지 (삼각형) 의 두 가지 유형이 있습니다.

-rectangle_plugin 과 triangle_plugin 모두 package.xml 파일에 지정된 내보내기 항목을 사용합니다.

-이는 polygon_interface_package 패키지에 polygon 클래스 플러그인을 제공하려는 rosbuild 구축 시스템을 알려줍니다.

-추가된 내보내기는 실제로 빌드/패키징 시스템에 등록됩니다.

즉, rospack 을 통해 사용 가능한 모든 다각형 클래스를 조회할 수 있으며, 사용 가능한 모든 클래스 목록 (주로 직사각형과 삼각형) 을 반환할 수 있습니다.

1) 플러그인 등록/내보내기

클래스가 동적으로 로드되도록 하려면 클래스를 내보내기 클래스로 표시해야 합니다.

이 작업은 특수 매크로 PLUGINLIB_EXPORT_CLASS 를 통해 수행됩니다.

이 매크로는 모든 소스 파일 (. Cpp) 파일로 플러그인 라이브러리를 구성하지만 일반적으로 에 배치됩니다. 클래스의 CPP 파일을 내보냅니다.

위의 예에서 패키지' example_pkg' 에 class_list.cpp 파일을 작성할 수 있습니다

다음과 같이 librectangle 라이브러리에 컴파일합니다.

# include & ltpluginlib/class _ list _ macros.h >

# include & lt 다각형 _ 인터페이스 _ 패키지/다각형.>

# include & ltrectangle _ package/ 직사각형.>

//사각형을 다각형 클래스로 선언

Pluginlib _ export _ class (rectangle _ namespace:: rectangle, polygon_namespace::Polygon)

2) 플러그인 프로필

플러그인 설명 파일은 플러그인에 대한 모든 중요한 정보를 저장하는 XML 파일입니다.

여기에는 플러그인이 있는 라이브러리, 플러그인 이름, 플러그인 유형 등에 대한 정보가 포함되어 있습니다.

위에서 설명한 rectangle_plugin 패키지를 고려하면 rectangle_plugin.xml 과 같은 플러그인 설명 파일은 다음과 같습니다.

ROS 시스템이 코드 매크로 이외의 플러그인을 자동으로 검색, 로드 및 해석할 수 있도록 이 파일이 필요합니다.

& lt 라이브러리 경로 ="lib/librectangle ">

& lt classtype = "rectangle _ namespace:: rectangle" base _ class _ type = "polygon _ namespace:

& lt 설명>

이것은 직사각형 플러그인입니다

& lt/description & gt;;

& lt/class & gt;;

& lt/라이브러리 >

(3) 플러그인 등록

Pluginlib 가 모든 ROS 패키지에서 시스템에서 사용 가능한 모든 플러그인을 조회하도록 하려면 각 패키지에서 내보내는 플러그인과 해당 플러그인이 포함된 패키지 라이브러리를 명시적으로 지정해야 합니다.

플러그인 공급자는 package.xml 의 내보내기 블록에 있는 플러그인 설명 파일을 가리켜야 합니다.

Rectangle_plugin 을 예로 들어 보겠습니다.

& lt 내보내기 & gt

& ltpolygon _ interface _ packageplugin = "$ {prefix}/rectangle _ plugin.xml"/>

& lt/export & gt;;

중요: 위의 내보내기 명령이 제대로 작동하려면 제공된 패키지가 플러그인 인터페이스가 포함된 패키지에 직접 의존해야 합니다.

예를 들어, rectangle_plugin 은 해당 버들개지/패키지. XML 에 다음 행을 포함해야 합니다.

& lt/build _ depend & gt; 다각형 인터페이스 패키지</build _ depend >

& lt/run _ depend & gt; 다각형 인터페이스 패키지</run _ depend >

4) 쿼리 플러그인

ROSpack 을 통해 ROS 패키지 시스템을 쿼리하여 지정된 패키지에 사용할 수 있는 플러그인을 볼 수 있습니다.

Rospack 플러그인 -attrib = 플러그인 nav_core

5) 플러그인 사용

Pluginlib 는 제공된 클래스를 빠르고 쉽게 사용할 수 있도록 class_loader.h 헤더 파일에 ClassLoader 클래스를 제공합니다.

이 도구의 코드 레벨 API 에 대한 자세한 설명서는 pluginlib::ClassLoader 설명서를 참조하십시오.

예를 들어 다각형을 사용하는 일부 코드에서 ClassLoader 를 사용하여 사각형 인스턴스를 만드는 간단한 예는 다음과 같습니다.

# include & ltpluginlib/class _ loader.h >

# include & lt 다각형 _ 인터페이스 _ 패키지/다각형.>

//... 일부 코드 ...

Pluginlib:: classloader < 다각형 이름 공간:: 다각형 & gtpoly _ loader ("polygon _ interface _ package", "polygon _ namespace:: polygon

시도하다

{

Boost::shared _ ptr<;; 다각형 이름 공간:: 다각형 & gtpoly = poly _ loader.createinstance ("rectangle _ namespace:: rectangle");

//... 다각형을 사용하면 boost::shared_ptr 이 범위를 벗어나면 메모리를 자동으로 삭제합니다

}

Catch (플러그인 lib:: pluginlibexception & Ex) 를 참조하십시오

{

//로드에 실패한 클래스 처리

ROS_ERROR ("플러그인이 어떤 이유로 로드에 실패했습니다. 오류: %s ",ex.what ());

}