refactor: restructure lidarlib into xlidar-driver plugin SDK
- LidarManager facade (liblidar_manager.so): dlopen plugin discovery, available_drivers map<driver_id, PluginRegistry>, create_lidar_device, config.json load/save with legacy lidarlib migration - Common LidarDriverInterface + DriverInfo/DeviceConfig plugin ABI (extern C get_driver_info / create_driver_instance) - Plugins: driver_rplidar (ported from xlocd, Slamtec SDK), driver_olei, driver_sick_code (TiM CoLa-A), driver_sick_safety (nanoScan3), driver_espe - Diagnostics extended with rplidar health + firmware; FOV filter window, range override and legacy remap window unified in DeviceConfig - Rewritten README, diagnostics doc and examples (list_drivers, example, lidar_app) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,9 +1,9 @@
|
||||
# Nghiên cứu: Dữ liệu chẩn đoán (diagnosis) của lidar OLEI & SICK
|
||||
# Nghiên cứu: Dữ liệu chẩn đoán (diagnosis) của các driver xlidar
|
||||
|
||||
Tài liệu này tổng hợp những gì các gói dữ liệu OLEI mang theo về **tình trạng
|
||||
thiết bị** (self-diagnostics), ngoài dữ liệu điểm quét. Kết quả nghiên cứu này
|
||||
là cơ sở cho API `lidarlib::Diagnostics` / `Lidar::get_diagnostics()`
|
||||
(header `include/lidarlib/diagnostics.hpp`).
|
||||
là cơ sở cho API `xlidar::Diagnostics` / `LidarDriverInterface::get_diagnostics()`
|
||||
(header `include/lidar_diagnostics.hpp`).
|
||||
|
||||
Điểm quan trọng: **lidar OLEI không có kênh/query chẩn đoán riêng** — driver
|
||||
chỉ nhận UDP thụ động, thiết bị không nhận lệnh hỏi trạng thái. Toàn bộ thông
|
||||
@@ -76,7 +76,7 @@ an toàn kiểu safety-scanner). Các trường chẩn đoán (port từ driver
|
||||
Vì bit map chưa xác minh, driver **truyền nguyên giá trị raw** qua
|
||||
`Diagnostics` (các trường `std::optional`) thay vì decode sai. Khi có tài
|
||||
liệu V3 chính thức hoặc thiết bị GS1-5 để thử, bổ sung decode tại
|
||||
`decode_diagnostics()` trong `src/olei_lidar.cpp`.
|
||||
`decode_diagnostics()` trong `include/lidar_interface.hpp` (và bảng field trong `plugins/driver_olei/olei_driver.cpp`).
|
||||
|
||||
## 4. SICK TiM (TCP/CoLa-A — telegram `LMDscandata`)
|
||||
|
||||
@@ -126,7 +126,22 @@ Driver đọc byte này vào `info.nano_general_state`, decode qua
|
||||
Lưu ý: block này **chỉ có mặt nếu được tick chọn** trong cấu hình data output
|
||||
của Safety Designer — thiếu block thì trường giữ `nullopt`.
|
||||
|
||||
## 6. Chẩn đoán tầng transport (mọi driver)
|
||||
## 6. Slamtec RPLIDAR (serial — health qua SDK)
|
||||
|
||||
RPLIDAR không nhúng chẩn đoán trong stream điểm quét; thay vào đó SDK có lệnh
|
||||
`getHealth()` trả về `status` (0 = OK, 1 = Warning, 2 = Error) kèm
|
||||
`error_code` 16-bit. Driver (`plugins/driver_rplidar`) gọi health check
|
||||
**một lần lúc `open()`** — status Error thì `open()` trả `DeviceError` và
|
||||
không dùng thiết bị; Warning vẫn chạy nhưng để lại dấu.
|
||||
|
||||
- Snapshot health nằm ở `Diagnostics::rplidar_health_status` /
|
||||
`rplidar_error_code`, decode qua `rplidar_fault()` / `rplidar_warning()`.
|
||||
- `Diagnostics::model` (`slamtec-0xNN` từ device info) và
|
||||
`Diagnostics::firmware` (`fw M.mm hw H`) được tự nhận lúc `open()`.
|
||||
- Chẩn đoán runtime chủ yếu là gián tiếp: `recv_scan()` timeout / mất kết
|
||||
nối serial (`Timeout` / `DeviceDisconnected`), giống mục transport dưới đây.
|
||||
|
||||
## 7. Chẩn đoán tầng transport (mọi driver)
|
||||
|
||||
Ngoài dữ liệu trên wire, bản thân driver cung cấp lớp chẩn đoán kết nối:
|
||||
|
||||
@@ -140,9 +155,9 @@ Ngoài dữ liệu trên wire, bản thân driver cung cấp lớp chẩn đoán
|
||||
Chiến lược giám sát khuyến nghị cho app: coi cảm biến **healthy** khi và chỉ
|
||||
khi `recv_scan()` thành công đều đặn **và** `get_diagnostics().has_fault() == false`.
|
||||
|
||||
## 7. Kiểm tra sẵn sàng: `is_ready()` / `wait_ready()`
|
||||
## 8. Kiểm tra sẵn sàng: `is_ready()` / `wait_ready()`
|
||||
|
||||
Chiến lược trên được gói sẵn trong hai hàm của `Lidar`:
|
||||
Chiến lược trên được gói sẵn trong hai hàm của `LidarDriverInterface`:
|
||||
|
||||
```cpp
|
||||
lidar->open();
|
||||
@@ -166,14 +181,14 @@ if (!lidar->is_ready()) { /* mất dữ liệu hoặc thiết bị báo fault */
|
||||
vẫn ready); app muốn chặt hơn thì tự kiểm tra thêm
|
||||
`!get_diagnostics().has_warning()`.
|
||||
|
||||
## 8. API
|
||||
## 9. API
|
||||
|
||||
```cpp
|
||||
#include "lidarlib/lidarlib.hpp"
|
||||
#include "lidar_manager.hpp"
|
||||
|
||||
lidarlib::ScanResult r;
|
||||
xlidar::ScanResult r;
|
||||
if (lidar->recv_scan(r, 1000)) {
|
||||
lidarlib::Diagnostics d = lidar->get_diagnostics();
|
||||
xlidar::Diagnostics d = lidar->get_diagnostics();
|
||||
|
||||
if (!d.valid) {
|
||||
// chưa có scan nào được decode
|
||||
@@ -182,7 +197,7 @@ if (lidar->recv_scan(r, 1000)) {
|
||||
if (d.voltage_fault()) /* điện áp bất thường */;
|
||||
if (d.temperature_fault()) /* nhiệt độ bất thường */;
|
||||
if (d.monitor_fault()) /* motor/giám sát bất thường */;
|
||||
printf("lidar fault: %s\n", lidarlib::to_string(d).c_str());
|
||||
printf("lidar fault: %s\n", xlidar::to_string(d).c_str());
|
||||
}
|
||||
|
||||
// SICK: cảnh báo kính bẩn — chưa phải fault nhưng nên lên lịch lau
|
||||
@@ -197,7 +212,7 @@ if (lidar->recv_scan(r, 1000)) {
|
||||
}
|
||||
```
|
||||
|
||||
- `Lidar::get_diagnostics()` — snapshot từ vòng quét decode gần nhất; gọi từ
|
||||
- `LidarDriverInterface::get_diagnostics()` — snapshot từ vòng quét decode gần nhất; gọi từ
|
||||
cùng thread đang bơm `recv_scan()`/`spin_once()` (driver không khóa nội bộ).
|
||||
- `decode_diagnostics(const ExtraInfo&)` — hàm free, decode trực tiếp từ
|
||||
`ScanResult::info` nếu app muốn gắn chẩn đoán với đúng scan cụ thể.
|
||||
@@ -207,7 +222,7 @@ if (lidar->recv_scan(r, 1000)) {
|
||||
nano contamination error/manipulation); `has_warning()` gộp các mức cảnh
|
||||
báo kính bẩn.
|
||||
|
||||
## 9. Hướng mở rộng
|
||||
## 10. Hướng mở rộng
|
||||
|
||||
- **SICK SOPAS query chủ động**: `sRN SCdevicestate` (0=busy, 1=ready,
|
||||
2=error), `sRN LCMstate` (mức nhiễm bẩn chi tiết) — cần cơ chế
|
||||
|
||||
Reference in New Issue
Block a user