Skip to content

RIVAL-ITS/NAV2_Plugnlib

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Dokumentasi Plugin Library pada ROS 2 dengan Behavior Tree

📝 Daftar Isi

  1. Pendahuluan
  2. Konsep Dasar Plugin Library
  3. Struktur Proyek
  4. Komponen Utama
    • Polygon Interface
    • Plugin Implementasi
    • Polygon Loader
    • Action Server
    • Behavior Tree System
  5. Langkah Membangun dan Menjalankan
  6. Behavior Tree XML Configuration
  7. Hasil Visualisasi dengan Groot
  8. Kesimpulan dan Langkah Selanjutnya

Pendahuluan

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.

Konsep Dasar Plugin Library

Apa itu Plugin Library? Plugin Library pada ROS 2 memungkinkan komponen software dikembangkan secara terpisah dan dimuat secara dinamis saat runtime. Ini memungkinkan:

  1. Modularitas : Menambah fungsionalitas tanpa mengubah kode utama
  2. Fleksibilitas : Mengubah perilaku sistem tanpa mengkompilasi ulang
  3. Ekstensibilitas : Pihak ketiga dapat menambahkan fitur baru

Komponen Utama Plugin System

  1. Base Class : Interface yang mendefinisikan fungsi-fungsi yang harus diimplementasikan plugin
  2. Plugin Classes : Implementasi konkret dari base class
  3. Plugin Loader : Komponen yang memuat (load) dan membuat instance plugin saat runtime
  4. Plugin Description File (XML) : File yang mendeskripsikan plugin untuk loader

Kmponen Utama

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);
    }

Pemanfaatan Plugin Tanpa Behavior Tree

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;

Pemanfaatan Plugin Library dengan Bhavior Tree

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:

  1. CalculatePolygonAreaBT : Memanggil action server untuk menghitung luas polygon
  2. CompareAreas : Membandingkan hasil perhitungan luas
  3. LogResult : Menampilkan hasil perhitungan

Langkah Membangun dan Menjalankan

# 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_executor

Behavior Tree XML Configuration

Behavior 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>

Hasil Visualisasi dengan Groot2

Tampilan Groot

Tampilan Terminal

Kesimpulan dan Langkah Selanjutnya

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

About

cara menggunakan pluginlib pada nav2

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors