當前位置:吉日网官网 - 傳統節日 - Ros全球規劃已完成。路線為什麽會移動?

Ros全球規劃已完成。路線為什麽會移動?

在ROS中,機器人全局路徑規劃默認使用navfn包,可以在move_base的默認參數中找到。

base_global_planner (`string ',缺省值:“navfn/NavfnROS”)

導航的源代碼裏還有壹個global_planner的包,裏面已經實現了A *和Dijkstra等算法,但是navfn的源程序裏也有這兩個算法的實現。默認情況下,global_planner文件夾中的源程序根本不使用。那麽為什麽ROS中全球導航有兩個包呢?他們之間是什麽關系?因為早期開發用navfn包導航,默認用Dijkstra做全局路徑規劃,有*代碼,為什麽不用A *?因為這裏A*算法有bug,沒人有時間做!直到13,陸三金才完成了這部分工作,重新發布了global_planner包。修改後的代碼封裝得更好,也更清晰。所以global_planner也可以認為是navfn的升級換代產品。那麽問題來了,為什麽陸三金沒有用global_planner取代navfn?為了兼容性。所以兩個包都存在,默認是navfn,也就是說global_planner沒用。

如何使用global_planner軟件包

只需將move_base的參數base_global_planner替換為global_planner/GlobalPlanner即可。

威爾(男子名)

& ltparam name = " base _ global _ planner " value = " global _ planner/global planner "/& gt;

move_base如何調用各種全局或局部計劃程序包?

ROS的官方wiki教程中提到可以擴展自己的路徑規劃算法,思路就是利用ROS的插件機制。

1.添加特定的程序(pluginlib _ export _ class(...))在自己寫的全局或局部規劃器算法的開頭註冊插件機制。

2.在xx_plugin.xml等文件中描述這個插件。

3.package.xml明確指出這個插件用於通知ROS我們將使用它。

詳細流程見官方wiki(ROS的插件機制)。以上工作完成後,我們可以像上面壹樣直接以參數的形式傳遞。

插件是如何工作的?(見下面的補充說明)

上面插件的工作模式告訴我們,必須按照ROS提供的模板來實現,這就是nav_core包存在的意義。在導航的源代碼中,妳會看到這個nav_core包中只有幾個頭文件,而正是這些頭文件提供了多個模板:

nav_core::BaseGlobalPlanner,

nav_core::BaseLocalPlanner,

nav _ core::recovery行為

妳可以在官方維基文檔中看到他們的介紹。所以只要按照這些模板的標準形式來編寫自己的規劃器算法就可以了。知道了這些,我們再看看別人寫的各種策劃插件就很簡單了。除了global_planner包和dwa_local_planner包,還有很多其他的算法比如sbql global planner,eband local planner,carrot_planner等等。具體的路徑規劃算法有很多。我們可以從現有的兩個入手,先看看A*和Dijkstra算法的具體實現。

global_planner/GlobalPlanner的實現

[global_planner/GlobalPlanner源代碼分析](/u 013158492/article/details/50504963)

補充:插件是怎麽工作的?

原則:

-為了理解pluginlib是如何工作的,讓我們考慮壹個小例子。

-首先,假設有壹個包含多邊形基類(“polygon_interface_package”)的ROS包。

-也可以說多邊形有兩種不同的類型:rectangle_plugin包(矩形)和triangle_plugin包(三角形)。

-rectangle_plugin和triangle_plugin都使用package.xml文件中指定的導出項目。

-這告訴rosbuild構建系統,想在polygon_interface_package包中提供polygon類的插件。

-添加的導出項實際上是在構建/打包系統中註冊這些類。

-也就是說,妳可以通過rospack查詢所有可用的多邊形類,它可以返回所有可用類的列表,這裏主要是矩形和三角形。

1)註冊/導出插件

為了允許類被動態加載,它必須被標記為導出類。

這是通過特殊的宏PLUGINLIB_EXPORT_CLASS完成的。

這個宏可以放在任何源文件(。cpp)文件,它構成了插件庫,但是它通常放在。導出類的cpp文件。

對於上面的例子,我們可以在包“example_pkg”中創建壹個class_list.cpp文件

如下所示,並將其編譯到librectangle庫中:

# include & ltplugin lib/class _ list _ macros . h & gt;

# include & lt多邊形_接口_包/多邊形. & gt

# include & ltrectangle _ package/矩形. & gt

//將矩形聲明為多邊形類

PLUGINLIB _ EXPORT _ CLASS(Rectangle _ namespace::Rectangle,polygon_namespace::Polygon)

2)插件描述文件

插件描述文件是壹個XML文件,用於存儲關於插件的所有重要信息。

它包含關於插件所在的庫、插件的名稱、插件的類型等信息。

如果我們考慮上面討論的rectangle_plugin包,插件描述文件(如rectangle_plugin.xml)將如下所示:

我們需要這個文件來允許ROS系統自動發現、加載和解釋除代碼宏之外的插件。

& lt庫路徑="lib/librectangle " >

& ltclass type = " Rectangle _ namespace::Rectangle " base _ class _ type = " Polygon _ namespace::Polygon " & gt;

& lt描述& gt

這是壹個矩形插件

& lt/description & gt;

& lt/class & gt;

& lt/library & gt;

(3)註冊插件

為了讓pluginlib跨所有ROS包查詢系統上所有可用的插件,每個包必須顯式地指定它導出的插件以及包含它們的包庫。

插件提供程序必須指向其package.xml的導出塊中的插件描述文件。

以rectangle_plugin為例:

& lt導出& gt

& ltpolygon _ interface _ package plugin = " $ { prefix }/rectangle _ plugin . XML "/& gt;

& lt/export & gt;

重要提示:為了使上述導出命令正常工作,所提供的包必須直接依賴於包含插件接口的包。

例如,rectangle_plugin必須在它的柳絮/包. xml中包含以下行:

& ltbuild _ depend & gt多邊形接口包& lt/build _ depend & gt;

& ltrun _ depend & gt多邊形接口包& lt/run _ depend & gt;

4)查詢插件

您可以通過rospack查詢ROS包系統,查看任何給定包的可用插件。

rospack插件-attrib =插件nav_core

5)使用插件

Pluginlib在class_loader.h頭文件中提供了壹個ClassLoader類,這使它能夠快速方便地使用所提供的類。

關於這個工具的代碼級API的詳細文檔,請參考pluginlib::ClassLoader文檔。

例如,在壹些使用多邊形的代碼中,使用ClassLoader創建矩形實例的簡單示例:

# include & ltplugin lib/class _ loader . h & gt;

# include & lt多邊形_接口_包/多邊形. & gt

//...壹些代碼...

plugin lib::class loader & lt;多邊形名稱空間::多邊形& gtpoly _ loader(" Polygon _ interface _ package "," Polygon _ namespace::Polygon ");

嘗試

{

boost::shared _ ptr & lt;多邊形名稱空間::多邊形& gtpoly = poly _ loader . create instance(" Rectangle _ namespace::Rectangle ");

//...使用多邊形,boost::shared_ptr會在超出作用域時自動刪除內存

}

catch(pluginlib::PluginlibException & amp;ex)

{

//處理加載失敗的類

ROS_ERROR("插件由於某種原因加載失敗。錯誤:%s ",ex . what());

}

  • 上一篇:什麽生意適合在家裏做?
  • 下一篇:VC代表什麽?有壹個風投行業。VC是什麽意思?
  • copyright 2024吉日网官网