#include "core.hpp" #include #include #include using std::numbers::pi_v; namespace { std::mutex g_mtx; std::string lidar_ip; std::string host_ip; std::string firmware_version; std::string dev_type; ImuRaw g_imu; AttitudeRPY g_rpy; uint64_t g_last_imu_ms = 0; uint64_t g_last_pts_ms = 0; float g_temp_c = 0.f; uint32_t g_power_count = 0; Eigen::Matrix4f g_Twm = Eigen::Matrix4f::Identity(); CloudRGB g_cloud_live; CloudRGB g_cloud_map; Distance6 g_dist6; std::vector g_boxes; std::mutex g_mtx_map; static TemporalCloudAccumulator g_live_acc; static TemporalCloudAccumulator g_map_acc; } // anon namespace Core { // ==== DEFINIÇÕES CORRETAS (sem Core::) ==== std::atomic handle{ 0 }; std::atomic connected{ false }; std::atomic running{ true }; std::atomic debug{ false }; std::atomic last_imu_ms{ 0 }; std::atomic freq_imu{ 0 }; std::atomic last_pcl_ms{ 0 }; std::atomic freq_pcl{ 0 }; std::atomic sensor_ok{ false }; std::atomic streaming{ false }; void init() { std::lock_guard lk(g_mtx); g_Twm = Eigen::Matrix4f::Identity(); g_cloud_live = {}; g_cloud_map = {}; g_dist6 = {}; g_boxes.clear(); g_live_acc.window_ms = 150; // live com rastro curto (ms) g_live_acc.max_points = 200000; // limite de pontos no live g_map_acc.window_ms = 0; // 0 = sem poda temporal (mapa) g_map_acc.max_points = 2000000; // cap de segurança pro mapa (ajuste à GPU) } void set_lidar_ip(const std::string& ip) { lidar_ip = ip; } void set_host_ip(const std::string& ip) { host_ip = ip; } const std::string& get_lidar_ip() { return lidar_ip; } const std::string& get_host_ip() { return host_ip; } void set_fw_version(const std::string& v) { firmware_version = v; } const std::string& get_fw_version() { return firmware_version; } void set_dev_type(const std::string& t) { dev_type = t; } const std::string& get_dev_type() { return dev_type; } void set_last_imu(const ImuRaw& s) { std::lock_guard lk(g_mtx); g_imu = s; g_last_imu_ms = s.t_ms; } ImuRaw get_last_imu() { std::lock_guard lk(g_mtx); return g_imu; } void set_attitude(const AttitudeRPY& rpy) { std::lock_guard lk(g_mtx); g_rpy = rpy; } AttitudeRPY get_attitude() { std::lock_guard lk(g_mtx); return g_rpy; } uint64_t get_last_imu_time_ms() { std::lock_guard lk(g_mtx); return g_last_imu_ms; } void set_last_points_time_ms(uint64_t t) { std::lock_guard lk(g_mtx); g_last_pts_ms = t; } uint64_t get_last_points_time_ms() { std::lock_guard lk(g_mtx); return g_last_pts_ms; } void set_temperature_c(float t) { std::lock_guard lk(g_mtx); g_temp_c = t; } float get_temperature_c() { std::lock_guard lk(g_mtx); return g_temp_c; } void set_power_count(uint32_t n) { std::lock_guard lk(g_mtx); g_power_count = n; } uint32_t get_power_count() { std::lock_guard lk(g_mtx); return g_power_count; } void set_pose_Twm(const Eigen::Matrix4f& Twm) { std::lock_guard lk(g_mtx); g_Twm = Twm; } Eigen::Matrix4f get_pose_Twm() { std::lock_guard lk(g_mtx); return g_Twm; } void set_cloud_live(const CloudRGB& c) { std::lock_guard lk(g_mtx); g_cloud_live = c; } CloudRGB get_cloud_live() { std::lock_guard lk(g_mtx); return g_cloud_live; } void set_distances(const Distance6& d) { std::lock_guard lk(g_mtx); g_dist6 = d; } Distance6 get_distances() { std::lock_guard lk(g_mtx); return g_dist6; } void set_bboxes(const std::vector& boxes) { std::lock_guard lk(g_mtx); g_boxes = boxes; } std::vector get_bboxes() { std::lock_guard lk(g_mtx); return g_boxes; } void set_cloud_map(const CloudRGB& c) { std::lock_guard lk(g_mtx_map); g_cloud_map = c; } CloudRGB get_cloud_map() { std::lock_guard lk(g_mtx_map); return g_cloud_map; } void clear_cloud_map() { std::lock_guard lk(g_mtx_map); g_cloud_map = CloudRGB{}; } void ResetGlobalMap() { clear_cloud_map(); g_map_acc.clear(); g_map_acc.window_ms = 0; g_map_acc.max_points = 2000000; } void AccConfigLive(uint64_t window_ms, size_t max_points) { g_live_acc.window_ms = window_ms; g_live_acc.max_points = max_points; } void AccConfigMap(uint64_t window_ms, size_t max_points) { g_map_acc.window_ms = window_ms; g_map_acc.max_points = max_points; } void AccPushLive(const CloudRGB& pkt, uint64_t t_ms) { g_live_acc.push(pkt); // opcional: se quiser podar no push por ref_ms de fora: (void)t_ms; // não precisa aqui; a prune já ocorre no push interno } CloudRGB AccBuildLive(uint64_t ref_ms) { return g_live_acc.buildMerged(ref_ms); } void AccPushMap(const CloudRGB& pkt, uint64_t t_ms) { g_map_acc.push(pkt); (void)t_ms; } CloudRGB AccBuildMap(uint64_t ref_ms) { return g_map_acc.buildMerged(ref_ms); } void AccClearLive() { // se seu acumulador live usa um deque protegido por mutex: std::lock_guard lk(g_live_acc.mtx); // ajuste ao seu nome real g_live_acc.ring.clear(); } void ClearLiveFrame(uint64_t now_ms) { // limpa cloud atual CloudRGB empty; empty.t_ms = now_ms; empty.pts.clear(); set_cloud_live(empty); // limpa bboxes set_bboxes({}); // (opcional) invalida distâncias InvalidateDistances(); // (opcional) zera a “idade” dos pontos para o snapshot/HUD ver que não há dados novos set_last_points_time_ms(now_ms); } void InvalidateDistances() { Distance6 d; d.front = std::numeric_limits::quiet_NaN(); d.back = std::numeric_limits::quiet_NaN(); d.left = std::numeric_limits::quiet_NaN(); d.right = std::numeric_limits::quiet_NaN(); d.up = std::numeric_limits::quiet_NaN(); d.down = std::numeric_limits::quiet_NaN(); set_distances(d); } // utils float Core::rad2deg(float r) { return r * 180.0f / pi_v; } float Core::deg2rad(float d) { return d * pi_v / 180.0f; } float wrapPi(float a) { const float pi = pi_v; const float twoPi = 2.f * pi; while (a > pi) a -= twoPi; while (a < -pi) a += twoPi; return a; } } // namespace Core