Sử Dụng Pangolin Để Tối Ưu Hóa Môi Trường Gỡ Lỗi Trực Quan SLAM Trên Ubuntu 20.04

Giới thiệu về sử dụng Pangolin cho SLAM trên Ubuntu 20.04

Trong quá trình phát triển SLAM (Định vị và Xây dựng Bản Đồ Đồng Bộ), gỡ lỗi trực quan là một phần không thể thiếu. Mặc dù ROS cung cấp các công cụ mạnh mẽ như Rviz, nhưng sự phụ thuộc lớn và tốc độ khởi động chậm thường gây khó khăn cho nhà phát triển. Đặc biệt trong giai đoạn phát triển nguyên mẫu nhanh, cần một giải pháp trực quan nhẹ và phản hồi nhanh. Pangolin, một thư viện trực quan 3D dựa trên OpenGL, có thể thực hiện việc kết xuất dữ liệu chính của SLAM như đám mây điểm và đường dẫn camera với chi phí tài nguyên thấp. Bài viết này sẽ hướng dẫn bạn thiết lập môi trường gỡ lỗi trực quan SLAM bằng Pangolin từ đầu trên hệ điều hành Ubuntu 20.04. Thay vì các hướng dẫn cơ bản, chúng ta sẽ tập trung vào nhu cầu thực tế trong phát triển SLAM, minh họa cách tận dụng tính năng đa cửa sổ và đa luồng của Pangolin để xây dựng quy trình làm việc hiệu quả.

Lý do chọn Pangolin thay thế ROS cho trực quan hóa SLAM

Khi đánh giá các công cụ trực quan, các nhà phát triển SLAM thường chú ý đến ba chỉ số chính: **thời gian thực**, **tính linh hoạt** và **chiếm dụng tài nguyên**. So sánh cụ thể giữa Pangolin và ROS Rviz:
Tính năngPangolinROS Rviz
Thời gian khởi động<0.5s2-5s
Bộ nhớ chiếm dụng50-100MB300-500MB
Tốc độ khung hình đám mây điểm (100 nghìn điểm)60+ FPS30-45 FPS
Hỗ trợ đa cửa sổCó sẵnCần plugin
Phụ thuộc mã nguồn3 lõi20+ gói ROS
Pangolin đặc biệt phù hợp với các tình huống sau: - Kiểm chứng thuật toán nguyên mẫu - Triển khai trên nền tảng nhúng - Gỡ lỗi đồng bộ nhiều cảm biến

Cấu hình và cài đặt môi trường

Cấu hình môi trường Pangolin trên Ubuntu 20.04 chỉ cần ba bước, nhưng quản lý phụ thuộc hợp lý có thể tránh được vấn đề tương thích sau này.
sudo apt install libgl1-mesa-dev libglew-dev
sudo apt install libpthread-stubs0-dev
sudo apt install libeigen3-dev
Tải xuống và biên dịch mã nguồn:
git clone --depth 1 --branch v0.8 https://github.com/stevenlovegrove/Pangolin.git
cd Pangolin
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_EXAMPLES=OFF -DBUILD_TOOLS=ON -DBUILD_PANGOLIN_PYTHON=OFF -DBUILD_PANGOLIN_VARS=ON
make -j$(nproc)
sudo make install

Xây dựng khung ứng dụng trực quan hóa SLAM

Tạo `visualizer.h` để định nghĩa các thành phần cốt lõi:
#include <pangolin/pangolin.h>
#include <mutex>

class SLAMVisualizer {
public:
    SLAMVisualizer(int w, int h);
    void UpdatePose(const Eigen::Matrix4f& T);
    void UpdatePoints(const std::vector<Eigen::Vector3f>& points);
    void Run();

private:
    pangolin::OpenGlRenderState cam_state_;
    pangolin::View* display_ = nullptr;
    std::mutex data_mutex_;
    std::vector<Eigen::Vector3f> map_points_;
    Eigen::Matrix4f current_pose_;
};
Tập trung vào logic kết xuất trong `visualizer.cpp`:
void SLAMVisualizer::Run() {
    pangolin::CreateWindowAndBind("SLAM Debug", 1024, 768);
    glEnable(GL_DEPTH_TEST);

    cam_state_.SetProjectionMatrix(pangolin::ProjectionMatrix(1024,768,500,500,512,389,0.1,1000));
    cam_state_.SetModelViewMatrix(pangolin::ModelViewLookAt(0,-3,-3, 0,0,0, pangolin::AxisY));

    display_ = &pangolin::CreateDisplay().SetBounds(0, 1, 0, 1, -1024.0f/768.0f).SetHandler(new pangolin::Handler3D(cam_state_));

    while(!pangolin::ShouldQuit()) {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        display_->Activate(cam_state_);
        DrawCamera(current_pose_);
        glPointSize(2);
        glBegin(GL_POINTS);
        std::lock_guard<std::mutex> lock(data_mutex_);
        for(const auto& pt : map_points_) {
            glColor3f(0,1,0);
            glVertex3f(pt.x(), pt.y(), pt.z());
        }
        glEnd();
        pangolin::FinishFrame();
    }
}

Mô hình cập nhật dữ liệu đa luồng

Thiết kế mô hình truyền dữ liệu an toàn giữa luồng kết xuất và luồng tính toán:
void SLAMVisualizer::UpdatePoints(const std::vector<Eigen::Vector3f>& points) {
    std::lock_guard<std::mutex> lock(data_mutex_);
    map_points_ = points;
}

while(!pangolin::ShouldQuit()) {
    if(pangolin::Pushed(pangolin::KeyboardProxy('s'))) {
        std::lock_guard<std::mutex> lock(data_mutex_);
        SavePointCloud(map_points_);
    }
}

Thực hiện chức năng gỡ lỗi nâng cao

Pangolin có thể xây dựng một bảng điều khiển hoàn chỉnh cho gỡ lỗi SLAM.

Gỡ lỗi đa chế độ xem

Sử dụng chia cửa sổ để quan sát đồng thời từ nhiều góc nhìn:
pangolin::View& main_disp = pangolin::Display("main").SetBounds(0, 0.7, 0, 1.0);
pangolin::View& top_disp = pangolin::Display("top").SetBounds(0, 0.3, 0, 0.5);
pangolin::View& side_disp = pangolin::Display("side").SetBounds(0, 0.3, 0.5, 1.0);
Tích hợp bảng điều khiển tham số động để tăng tốc vòng đời thuật toán:
pangolin::CreatePanel("params").SetBounds(0.7, 1.0, 0, 0.3);
pangolin::Var<float> reproj_thresh("params.Reproj Threshold", 3.0, 0.1, 10.0);
pangolin::Var<int> max_features("params.Max Features", 200, 50, 1000);
pangolin::Var<bool> show_kf("params.Show Keyframes", true, false);

Thẻ: Ubuntu Pangolin SLAM OpenGL cmake

Đăng vào ngày 7 tháng 6 lúc 18:56