ROS專(zhuān)題----pluginlib簡(jiǎn)明筆記
ROS專(zhuān)題----pluginlib簡(jiǎn)明筆記
http://wiki.ros.org/pluginlib/Tutorials
----
使用簡(jiǎn)單的插件
本教程介紹如何使用pluginlib創(chuàng)建并加載一個(gè)簡(jiǎn)單的插件。
pluginlib的主要參考可以在它的主頁(yè)pluginlib上找到。
----
簡(jiǎn)單解析:這個(gè)plugin計(jì)算邊長(zhǎng)為10的等邊三角形和正方形的面積。
分別為43.3和100.0,如下:
$ rosrun pluginlib_tutorials polygon_loader
[ INFO] [1489481879.738071797]: Triangle area: 43.30
[ INFO] [1489481879.738268345]: Square area: 100.00
----
公式:
#ifndef PLUGINLIB_TUTORIALS_POLYGON_PLUGINS_H_
#define PLUGINLIB_TUTORIALS_POLYGON_PLUGINS_H_
#include
#include
namespace polygon_plugins
{
class Triangle : public polygon_base::RegularPolygon
{
public:
Triangle() : side_length_() {}
void initialize(double side_length)
{
side_length_ = side_length;
}
double area()
{
return 0.5 * side_length_ * getHeight();
}
double getHeight()
{
return sqrt((side_length_ * side_length_) - ((side_length_ / 2) * (side_length_ / 2)));
}
private:
double side_length_;
};
class Square : public polygon_base::RegularPolygon
{
public:
Square() : side_length_() {}
void initialize(double side_length)
{
side_length_ = side_length;
}
double area()
{
return side_length_ * side_length_;
}
private:
double side_length_;
};
};
#endif
----
#include
#include
#include
int main(int argc, char** argv)
{
pluginlib::ClassLoader
try
{
boost::shared_ptr
triangle->initialize(10.0);
ROS_INFO("Triangle area: %.2f", triangle->area());
}
catch(pluginlib::PluginlibException& ex)
{
ROS_ERROR("The plugin failed to load for some reason. Error: %s", ex.what());
}
try
{
boost::shared_ptr
square->initialize(10.0);
ROS_INFO("Square area: %.2f", square->area());
}
catch(pluginlib::PluginlibException& ex)
{
ROS_ERROR("The plugin failed to load for some reason. Error: %s", ex.what());
}
return 0;
}
----
pluginlib包提供了使用ROS構(gòu)建基礎(chǔ)結(jié)構(gòu)來(lái)編寫(xiě)和動(dòng)態(tài)加載插件的工具。要工作,這些工具需要插件提供程序在其包的package.xml中注冊(cè)他們的插件。
維護(hù)者狀態(tài):維護(hù)
維護(hù)者:Mikael Arguedas
許可證:BSD
錯(cuò)誤/功能跟蹤:https?:?//github.com/ros/pluginlib/issues
資料來(lái)源:git?https://github.com/ros/pluginlib.git(branch:indigo-devel)
內(nèi)容
概述
例
提供插件
注冊(cè)/導(dǎo)出插件
插件說(shuō)明文件
使用ROS包系統(tǒng)注冊(cè)插件
為可用的插件查詢(xún)ROS包系統(tǒng)
使用插件
來(lái)自Pre-Groovy pluginlib的更改
簡(jiǎn)化導(dǎo)出宏
舊版“查找名稱(chēng)”
報(bào)告錯(cuò)誤
概述
pluginlib是一個(gè)用于從ROS包中加載和卸載插件的C ++庫(kù)。插件是從運(yùn)行時(shí)庫(kù)(即共享對(duì)象,動(dòng)態(tài)鏈接庫(kù))加載的動(dòng)態(tài)可加載類(lèi)。使用pluginlib,不必顯式地將其應(yīng)用程序與包含類(lèi)的庫(kù)鏈接 - 而是pluginlib可以在任何時(shí)候打開(kāi)包含導(dǎo)出類(lèi)的庫(kù),而應(yīng)用程序沒(méi)有對(duì)庫(kù)或包含類(lèi)定義的頭文件的任何預(yù)先知曉。插件可用于擴(kuò)展/修改應(yīng)用程序行為,而不需要應(yīng)用程序源代碼。
例
要了解pluginlib的工作原理,讓我們考慮一個(gè)小例子。首先,假設(shè)存在包含多邊形基類(lèi)(“?polygon_interface_package?”)的ROS?包。讓我們也說(shuō),有兩種不同類(lèi)型的多邊形的在系統(tǒng)中支持的:其中生活在“一個(gè)矩形rectangle_plugin?”包和生活在“三角形triangle_plugin?”包。兩者的實(shí)施者rectangle_plugin和triangle_plugin包將包括在它們的特殊出口線(xiàn)包。xml 文件告訴rosbuild系統(tǒng)他們打算為polygon_interface_package包中的多邊形類(lèi)提供插件。這些導(dǎo)出線(xiàn)實(shí)際上是用ROS構(gòu)建/打包系統(tǒng)注冊(cè)類(lèi)。這意味著希望查看系統(tǒng)中所有可用的多邊形類(lèi)的人可以運(yùn)行一個(gè)簡(jiǎn)單的rospack查詢(xún),它將返回可用類(lèi)的列表,在這種情況下,矩形和三角形。
提供插件
注冊(cè)/導(dǎo)出插件
為了允許類(lèi)被動(dòng)態(tài)加載,它必須被標(biāo)記為導(dǎo)出類(lèi)。這是通過(guò)特殊宏P(guān)LUGINLIB_EXPORT_CLASS來(lái)完成的。這個(gè)宏可以放在構(gòu)成插件庫(kù)的任何源(.cpp)文件中,但通常放在導(dǎo)出類(lèi)的.cpp文件的末尾。對(duì)于上面的示例,我們可能在包'example_pkg'中創(chuàng)建一個(gè)class_list.cpp文件,如下所示,并將其編譯到librectangle庫(kù)中:
切換行號(hào)
1 #包括
插件說(shuō)明文件
該插件描述文件是用于存儲(chǔ)所有關(guān)于在機(jī)器可讀格式的插件的重要信息的XML文件。它包含有關(guān)插件所在的庫(kù)的信息,插件的名稱(chēng),插件的類(lèi)型等。如果我們考慮上面討論的rectangle_plugin包,插件描述文件(例如rectangle_plugin.xml)將看起來(lái)像這樣:
有關(guān)插件描述文件及其相關(guān)標(biāo)簽/屬性的詳細(xì)描述,請(qǐng)參閱以下文檔。
我們需要這個(gè)文件除了代碼宏,允許ROS系統(tǒng)自動(dòng)發(fā)現(xiàn),加載和推理插件。插件描述文件還包含重要信息,如插件的描述,不適合在宏中。
使用ROS包系統(tǒng)注冊(cè)插件
為了讓pluginlib查詢(xún)跨所有ROS包的系統(tǒng)上的所有可用插件,每個(gè)包必須顯式指定它導(dǎo)出的插件,以及哪些包庫(kù)包含這些插件。一個(gè)插件提供者必須指向它的插件描述文件,在其package.xml中的內(nèi)外銷(xiāo)標(biāo)簽塊。注意,如果您有其他導(dǎo)出,他們都必須在同一導(dǎo)出字段。
再次考慮rectangle_plugin包,相關(guān)行將如下所示:
有關(guān)導(dǎo)出插件的詳細(xì)說(shuō)明,請(qǐng)參閱以下文檔。
重要說(shuō)明:為了使上述export命令正常工作,提供包必須直接依賴(lài)于包含插件接口的包。例如,rectangle_plugin必須在其catkin / package.xml中具有以下行:
為可用的插件查詢(xún)ROS包系統(tǒng)
可以通過(guò)rospack查詢(xún)ROS包系統(tǒng),以查看任何給定包可用的插件。例如:
rospack plugins --attrib = plugin nav_core
這將返回從nav_core包導(dǎo)出的所有插件。
使用插件
pluginlib在class_loader.h頭文件中提供了一個(gè)ClassLoader類(lèi),使得它能夠快速和容易地使用提供的類(lèi)。有關(guān)此工具的代碼級(jí)API的詳細(xì)文檔,請(qǐng)參閱pluginlib :: ClassLoader文檔。下面,我們將演示一個(gè)使用ClassLoader在一些使用多邊形的代碼中創(chuàng)建矩形實(shí)例的簡(jiǎn)單示例:
切換行號(hào)
1 #包括
重要說(shuō)明:在使用插件時(shí),ClassLoader不能超出范圍。所以,如果你在類(lèi)中加載一個(gè)插件對(duì)象,請(qǐng)確保類(lèi)加載器是該類(lèi)的成員變量。
來(lái)自Pre-Groovy pluginlib的更改
簡(jiǎn)化導(dǎo)出宏
在pluginlib 1.9(Groovy)之前,宏P(guān)LUGINLIB_REGISTER_CLASS和PLUGINLIB_DECLARE_CLASS用于注冊(cè)導(dǎo)出的類(lèi)。這些已被棄用,支持新的PLUGINLIB_EXPORT_CLASS。新的宏是更簡(jiǎn)單,因?yàn)樗恍枰獌蓚€(gè)參數(shù)。
已提供了一個(gè)腳本,可以在源文件夾的根目錄中運(yùn)行pluginlib,以自動(dòng)更新舊宏以利用新的:
plugin_macro_update
舊版“查找名稱(chēng)”
pre-Groovy版本的pluginlib需要為插件描述文件和導(dǎo)出宏中的導(dǎo)出類(lèi)指定一個(gè)“查找名稱(chēng)”。此查找名稱(chēng)充當(dāng)真實(shí)類(lèi)名稱(chēng)的別名 - 在面向用戶(hù)界面中未使用真正的類(lèi)名稱(chēng)。使用此查找別名而不是真實(shí)名稱(chēng)的原因是由于舊版本中的技術(shù)限制。
現(xiàn)在可以使用類(lèi)的真實(shí)名稱(chēng),而不是查找名稱(chēng)。但是,如果用戶(hù)仍然使用查找名稱(chēng),他們可以將其添加到其插件描述文件中。例如:
pluginlib現(xiàn)在將使用“rviz / Rectangle”而不是“rectangle_namespace :: Rectangle”來(lái)引用類(lèi)。如果使用查找名稱(chēng)別名,則不能使用實(shí)際類(lèi)名來(lái)引用類(lèi)。如果未提供查找名稱(chēng),則查找名稱(chēng)和真類(lèi)名稱(chēng)是等效的。
----
XML
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。