c++代码ros不用while(true)和定时器如何实现循环调用回调函数
时间: 2024-03-21 08:39:45 浏览: 115
除了使用定时器之外,还可以使用ROS的异步Spinner(`ros::AsyncSpinner`)来实现循环调用回调函数,而不需要使用 `while(true)` 循环。
具体实现方式如下:
1. 定义回调函数 `callback()`。
```
void callback(const ros::TimerEvent& event) {
// 回调函数的实现
}
```
2. 在 `main()` 函数中创建异步Spinner,并调用 `start()` 函数。
```
int main(int argc, char** argv) {
ros::init(argc, argv, "async_spinner_example");
ros::NodeHandle nh;
// 创建异步Spinner
ros::AsyncSpinner spinner(1);
spinner.start();
// 循环调用回调函数
while (ros::ok()) {
callback();
ros::Duration(1.0).sleep(); // 等待 1 秒
}
return 0;
}
```
上述代码中,`ros::AsyncSpinner spinner(1)` 表示创建一个异步Spinner,其中的参数 1 表示使用单线程。在 `while` 循环中,调用回调函数 `callback()`,然后使用 `ros::Duration(1.0).sleep()` 函数等待 1 秒。
3. 在 `main()` 函数中调用 `ros::spin()`,并在程序退出时停止异步Spinner。
```
int main(int argc, char** argv) {
ros::init(argc, argv, "async_spinner_example");
ros::NodeHandle nh;
// 创建异步Spinner
ros::AsyncSpinner spinner(1);
spinner.start();
// 循环调用回调函数
while (ros::ok()) {
callback();
ros::Duration(1.0).sleep(); // 等待 1 秒
}
// 停止异步Spinner
spinner.stop();
return 0;
}
```
这样就可以实现不使用定时器和 `while(true)` 循环调用回调函数的功能。
阅读全文