ROS專(zhuān)題----pluginlib簡(jiǎn)明筆記

      網(wǎng)友投稿 796 2022-05-29

      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 poly_loader("pluginlib_tutorials", "polygon_base::RegularPolygon");

      try

      {

      boost::shared_ptr triangle = poly_loader.createInstance("pluginlib_tutorials/regular_triangle");

      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

      ROS專(zhuān)題----pluginlib簡(jiǎn)明筆記

      {

      boost::shared_ptr square = poly_loader.createInstance("pluginlib_tutorials/regular_square");

      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 #包括 2 #包括 3 #包括 4 5 //將Rectangle聲明為多邊形類(lèi) 6 PLUGINLIB_EXPORT_CLASS(rectangle_namespace :: Rectangle,polygon_namespace :: Polygon)

      插件說(shuō)明文件

      該插件描述文件是用于存儲(chǔ)所有關(guān)于在機(jī)器可讀格式的插件的重要信息的XML文件。它包含有關(guān)插件所在的庫(kù)的信息,插件的名稱(chēng),插件的類(lèi)型等。如果我們考慮上面討論的rectangle_plugin包,插件描述文件(例如rectangle_plugin.xml)將看起來(lái)像這樣:

      這是一個(gè)矩形插件

      有關(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中具有以下行:

      polygon_interface_package polygon_interface_package

      為可用的插件查詢(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 #包括 2 #包括 3 4 // ... some code ... 5 6 pluginlib :: ClassLoader < polygon_namespace :: Polygon > poly_loader(“ polygon_interface_package ”,“ polygon_namespace :: Polygon ”); 7 8 嘗試 9 { 10 boost :: shared_ptr < polygon_namespace :: Polygon > poly = poly_loader。createInstance(“ rectangle_namespace :: Rectangle ”); 11 12 // ...使用多邊形,boost :: shared_ptr會(huì)在超出范圍 13時(shí)自動(dòng)刪除內(nèi)存 } 14 catch(pluginlib :: PluginlibException&ex) 15 { 16 //處理類(lèi)無(wú)法加載 17 ROS_ERROR(“ 該插件未能加載由于某種原因,錯(cuò)誤:%s。 ”, 恩。什么()); 18 }}

      重要說(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),他們可以將其添加到其插件描述文件中。例如:

      這是一個(gè)矩形插件

      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)容。

      上一篇:React Native發(fā)布重構(gòu)路線(xiàn)圖
      下一篇:其他類(lèi)似GitBook的在線(xiàn)文檔創(chuàng)作平臺(tái)
      相關(guān)文章
      亚洲AV无码成人精品区蜜桃| 亚洲黄页网在线观看| 亚洲国产成人精品青青草原| 久久国产亚洲高清观看| 亚洲无码视频在线| 亚洲Av永久无码精品黑人| 亚洲人成www在线播放| 中文字幕在线观看亚洲日韩| 亚洲最大中文字幕无码网站 | 国产精品亚洲综合久久| 亚洲国产中文在线视频| 亚洲精品亚洲人成在线播放| 亚洲人成网站看在线播放| 亚洲av成人综合网| 亚洲一线产品二线产品| 亚洲av无码有乱码在线观看| 春暖花开亚洲性无区一区二区| 久久久久亚洲AV无码去区首| 在线观看亚洲精品专区| 亚洲精品一级无码鲁丝片 | 亚洲人AV永久一区二区三区久久| 亚洲精品动漫人成3d在线| 亚洲性日韩精品一区二区三区| 久久精品国产亚洲7777| 中文字幕亚洲激情| 亚洲AV永久青草无码精品| 亚洲视频免费在线播放| 亚洲1区1区3区4区产品乱码芒果| 亚洲一区二区三区免费观看 | 日韩va亚洲va欧洲va国产| 亚洲国产精品第一区二区| 亚洲欧洲日本国产| 亚洲欧洲AV无码专区| 亚洲av无码乱码在线观看野外| 亚洲一区二区视频在线观看| 情人伊人久久综合亚洲| 亚洲黄色免费在线观看| 亚洲综合精品伊人久久| 亚洲AV中文无码乱人伦在线视色| 亚洲午夜福利717| 亚洲色图校园春色|