2026/8/29 13:24:47
网站建设
项目流程
1. ROS2 标准 rclcpp::Rate
rclcpp::Rate rate(10); ... rate.sleep();
- 自动补偿循环内运算耗时,严格锁定平均频率
- 适合不需要低延迟、追求稳定 CPU 负载的场景(比如建图、状态打印)
rate.sleep()会自动计算本次循环已经消耗的时间,然后休眠补足剩余时长,保证整个while循环稳定卡在 10Hz 运行。例:本次里面算法耗时 20ms,sleep()就休眠 80ms,总周期 = 100ms,严格 10Hz.
2. C++ 原生线程休眠std::this_thread::sleep_for
void TeleObsAvoidNode::Run() { while (rclcpp::ok()) { //去消息队列里捞已经收到的话题数据,挨个执行订阅回调比如激光雷达回调、遥控器指令回调),否则下面的读取不到更新后的数据。 rclcpp::spin_some(this->get_node_base_interface()); if (obs_avoidance_active_) { geometry_msgs::msg::Twist cmd_vel; tele_obs_avoid_ptr_->Update(laser_scan_, tele_cmd_vel_, cmd_vel); cmd_vel_pub_->publish(cmd_vel); } // std::chrono::milliseconds(10)表示10ms, 只 sleep 10ms,不再用 rate(10) 的 0.1s 固定周期 std::this_thread::sleep_for(std::chrono::milliseconds(10)); }
- 固定休眠时长,不做耗时补偿假设循环内算法跑了 3ms,本轮总耗时 = 3+10=13ms; 算法跑了 15ms,本轮总耗时 = 15+10=25ms,实际频率会波动。