diff --git a/src/control/remote_ctrl/src/remote_ctrl_node.cpp b/src/control/remote_ctrl/src/remote_ctrl_node.cpp index 35a1df3..491a612 100644 --- a/src/control/remote_ctrl/src/remote_ctrl_node.cpp +++ b/src/control/remote_ctrl/src/remote_ctrl_node.cpp @@ -131,7 +131,13 @@ class RemoteCtrlNode : public rclcpp::Node auto now = std::chrono::steady_clock::now(); // 超时阈值:建议 800ms ~ 1500ms - if (now - last_msg_time_ > 800ms) + std::chrono::steady_clock::time_point last; + { + std::lock_guard lock(last_msg_time_mtx_); + last = last_msg_time_; + } + + if (now - last > 800ms) { // 只在第一次进入“失活”时打印日志 if (remote_alive_.exchange(false)) @@ -286,7 +292,10 @@ class RemoteCtrlNode : public rclcpp::Node LOG_INFO("[REMOTE] ✓ control recovered"); } - last_msg_time_ = std::chrono::steady_clock::now(); + { + std::lock_guard lock(last_msg_time_mtx_); + last_msg_time_ = std::chrono::steady_clock::now(); + } LOG_DEBUG("[REMOTE] Processing command: %s", cmd.c_str()); @@ -399,6 +408,7 @@ class RemoteCtrlNode : public rclcpp::Node std::atomic remote_authorized_{false}; // 是否允许远控(锁存) std::atomic remote_alive_{false}; // 是否活跃(心跳) std::chrono::steady_clock::time_point last_msg_time_; + std::mutex last_msg_time_mtx_; // 保护 last_msg_time_ float current_feedback_angle_{0.0f};