- Pendahuluan
- Konsep Dasar Plugin Library
- Struktur Proyek
- Komponen Utama
- Polygon Interface
- Plugin Implementasi
- Polygon Loader
- Action Server
- Behavior Tree System
- Langkah Membangun dan Menjalankan
- Behavior Tree XML Configuration
- Hasil Visualisasi dengan Groot
- Kesimpulan dan Langkah Selanjutnya
Plugin Library pada ROS 2 adalah mekanisme yang memungkinkan kita menambahkan fungsionalitas baru ke aplikasi tanpa harus mengubah atau mengkompilasi ulang kode utama. Dokumentasi ini menjelaskan implementasi Plugin Library dengan contoh kasus penghitungan luas bangun datar (segitiga dan persegi panjang) yang terintegrasi dengan Behavior Tree.
Proyek ini adalah langkah awal sebelum memahami penggunaan Behavior Tree pada navigasi robot dengan Nav2, di mana pemahaman tentang plugin dan behavior tree menjadi fundamental.
Apa itu Plugin Library? Plugin Library pada ROS 2 memungkinkan komponen software dikembangkan secara terpisah dan dimuat secara dinamis saat runtime. Ini memungkinkan:
- Modularitas : Menambah fungsionalitas tanpa mengubah kode utama
- Fleksibilitas : Mengubah perilaku sistem tanpa mengkompilasi ulang
- Ekstensibilitas : Pihak ketiga dapat menambahkan fitur baru
Komponen Utama Plugin System
- Base Class : Interface yang mendefinisikan fungsi-fungsi yang harus diimplementasikan plugin
- Plugin Classes : Implementasi konkret dari base class
- Plugin Loader : Komponen yang memuat (load) dan membuat instance plugin saat runtime
- Plugin Description File (XML) : File yang mendeskripsikan plugin untuk loader
Polygon Interface
Base class yang mendefinisikan interface untuk semua plugin polygon:
//polygon_interface/include/polygon_interface/polygon_base.hpp
class PolygonBase
{
public:
virtual ~PolygonBase() = default;
virtual void initialize(double width, double height) = 0;
virtual double area() const = 0;
virtual std::string shape_name() const = 0;
};Ini adalah kontrak yang harus diimplementasikan oleh setiap plugin polygon. Metode virtual memungkinkan polymorphism untuk plugin yang berbeda.
Plugin Implementasi
- Triangel Plugin
// triangle_plugin/src/triangle.cpp
class Triangle : public polygon_interface::PolygonBase
{
public:
void initialize(double width, double height) override {
width_ = width;
height_ = height;
}
double area() const override {
return 0.5 * width_ * height_; // Rumus luas segitiga
}
std::string shape_name() const override {
return "Triangle";
}
private:
double width_;
double height_;
};
PLUGINLIB_EXPORT_CLASS(triangle_plugin::Triangle, polygon_interface::PolygonBase)File Deskripsi Plugin:
<!-- triangle_plugin/triangle_plugin.xml -->
<library path="triangle_plugin">
<class name="triangle_plugin/Triangle"
type="triangle_plugin::Triangle"
base_class_type="polygon_interface::PolygonBase">
<description>Plugin untuk segitiga, menghitung area.</description>
</class>
</library>-
Begitu pula dengan Rectangel selengkapnya ada pada kode didalam
-
Action Server
Action server digunakan untuk memproses permintaan perhitungan luas polygon:
// polygon_bt_system/src/polygon_action_server.cpp void execute(const std::shared_ptr<GoalHandle> goal_handle) { // Load plugin berdasarkan nama auto plugin = loader_->createSharedInstance(goal->plugin_name); // Inisialisasi dan hitung luas plugin->initialize(goal->width, goal->height); result->area = plugin->area(); result->shape_name = plugin->shape_name(); // Feedback dan hasil goal_handle->succeed(result); }
menggunakan package polygon_loader
// polygon_loader/src/polygon_loader.cpp
pluginlib::ClassLoader<polygon_interface::PolygonBase> loader(
"polygon_interface", "polygon_interface::PolygonBase");
auto plugin = loader.createSharedInstance("rectangle_plugin/Rectangle");
plugin->initialize(5.0, 6.0);
std::cout << plugin->shape_name() << " area: " << plugin->area() << std::endl;Behavior Tree System
Integrasi plugin dengan Behavior Tree:
// polygon_bt_system/src/polygon_bt_executor.cpp
factory_.registerNodeType<CalculatePolygonAreaBT>("CalculatePolygonAreaBT");
factory_.registerNodeType<CompareAreas>("CompareAreas");
factory_.registerNodeType<LogResult>("LogResult");
tree_ = factory_.createTreeFromFile(xml_file);Node-node BT Custom:
- CalculatePolygonAreaBT : Memanggil action server untuk menghitung luas polygon
- CompareAreas : Membandingkan hasil perhitungan luas
- LogResult : Menampilkan hasil perhitungan
# Clone repository (asumsikan Anda sudah memilikinya)
cd ~/belajar_kode/plugin_lib
# Build packages
colcon build --symlink-install
# Source environment
source install/setup.bash
# Jalankan action server
ros2 run polygon_bt_system polygon_action_server
# Di terminal baru, jalankan behavior tree executor
ros2 run polygon_bt_system polygon_bt_executorBehavior Tree dikonfigurasi dalam file XML:
<!-- polygon_bt_system/config/polygon_behavior_tree.xml -->
<BehaviorTree ID="PolygonCalculationBehaviorTree">
<Sequence name="main_sequence">
<!-- Calculate Triangle Area -->
<CalculatePolygonAreaBT
name="calculate_triangle"
plugin_name="triangle_plugin/Triangle"
width="6.0"
height="8.0"
area="{triangle_area}"
shape_name="{triangle_name}"
success="{triangle_success}" />
<!-- Log Triangle Result -->
<LogResult
name="log_triangle"
shape_name="{triangle_name}"
area="{triangle_area}" />
<!-- Calculate Rectangle Area -->
<CalculatePolygonAreaBT
name="calculate_rectangle"
plugin_name="rectangle_plugin/Rectangle"
width="5.0"
height="4.0"
area="{rectangle_area}"
shape_name="{rectangle_name}"
success="{rectangle_success}" />
<!-- Log Rectangle Result -->
<LogResult
name="log_rectangle"
shape_name="{rectangle_name}"
area="{rectangle_area}" />
</Sequence>
</BehaviorTree>Pemahaman ini adalah dasar penting sebelum melangkah ke integrasi Behavior Tree dengan Nav2, di mana kita akan menggunakan konsep yang sama untuk:
- Membuat custom plugin navigasi
- Mengonfigurasi behavior tree untuk navigasi robot
- Menyesuaikan perilaku robot dengan behavior tree yang kompleks

