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ăng | Pangolin | ROS Rviz |
|---|
| Thời gian khởi động | <0.5s | 2-5s |
| Bộ nhớ chiếm dụng | 50-100MB | 300-500MB |
| Tốc độ khung hình đám mây điểm (100 nghìn điểm) | 60+ FPS | 30-45 FPS |
| Hỗ trợ đa cửa sổ | Có sẵn | Cần plugin |
| Phụ thuộc mã nguồn | 3 lõi | 20+ 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);