ROS Spinning-----简介

本文介绍了ROS中的Spinning机制,包括单线程和多线程两种模式,并详细解释了ros::spin(), ros::spinOnce(), ros::MultiThreadedSpinner及ros::AsyncSpinner的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    ROS中spinning主要包括单线程spining和多线程spinning,下面分别介绍各自用法。


1 单线程spining

(1)ros::spin()

    ros::spin()是单线程中最简单的形式,如下示例中所有回调函数通过ros::spin()调用,ros::spin()一旦运行起来就不会退出返回(除非主动调用ros::shutdown()或者ctrl+c)。

ros::init(argc, argv, "my_node");
ros::NodeHandle nh;
ros::Subscriber sub = nh.subscribe(...);
...
ros::spin();

(2)ros::spinOnce()

    这是单线程的另一种形式,通常主动周期性调用使用(如publish场合),如下所示:

ros::Rate r(10); // 10 hz
while (should_continue)
{
  ... do some work, publish some messages, etc. ...
  ros::spinOnce();
  r.sleep();
}

ros::spinOnce将在定时到时刻调用所有等候调用的函数,它可以返回。


2 多线程spinning

(1)ros::MultiThreadedSpinner

  MultiThreadedSpinner是blocking spinner,类似于ros::spin()。 可以在它的构造函数指定线程数,如果设置为0或者未指定的话,将在CPU的每个core上创建一个线程。

ros::MultiThreadedSpinner spinner(4); // Use 4 threads
spinner.spin(); // spin() will not return until the node has been shutdown

(2)ros::AsyncSpinner ()

    AsyncSpinner不是blocking spin,更好使用, 支持start()stop()功能。 当它被销毁时候,自动会停止。以下例子等效于上面例子功能:

ros::AsyncSpinner spinner(4); // Use 4 threads
spinner.start();
ros::waitForShutdown();




我最近在学习激光雷达SLAM。我安装了ubuntu22.04并且根据博主鱼香ros的一键安装了ros2 humble版本。为了运行lego loam,我在github上找到了博主鱼香ros改写的lego loam humble版,并且我已经成功编译。但是rviz中并没有轨迹,于是我下载了原作者的bag文件并将其转换成了.bd3文件,但仍然没有轨迹。第一个终端窗口:lei@leiguoguo:~/ros2_ws$ ros2 launch lego_loam_sr run.launch.py [INFO] [launch]: All log files can be found below /home/lei/.ros/log/2025-06-17-10-36-39-658661-leiguoguo-7646 [INFO] [launch]: Default logging verbosity is set to INFO [INFO] [lego_loam_sr-1]: process started with pid [7647] [INFO] [static_transform_publisher-2]: process started with pid [7649] [INFO] [static_transform_publisher-3]: process started with pid [7651] [INFO] [static_transform_publisher-4]: process started with pid [7653] [INFO] [rviz2-5]: process started with pid [7655] [static_transform_publisher-4] RCUTILS_CONSOLE_STDOUT_LINE_BUFFERED is now ignored. Please set RCUTILS_LOGGING_USE_STDOUT and RCUTILS_LOGGING_BUFFERED_STREAM to control the stream and the buffering of log messages. [static_transform_publisher-3] RCUTILS_CONSOLE_STDOUT_LINE_BUFFERED is now ignored. Please set RCUTILS_LOGGING_USE_STDOUT and RCUTILS_LOGGING_BUFFERED_STREAM to control the stream and the buffering of log messages. [static_transform_publisher-2] RCUTILS_CONSOLE_STDOUT_LINE_BUFFERED is now ignored. Please set RCUTILS_LOGGING_USE_STDOUT and RCUTILS_LOGGING_BUFFERED_STREAM to control the stream and the buffering of log messages. [static_transform_publisher-3] [WARN] [1750127799.715366258] []: Old-style arguments are deprecated; see --help for new-style arguments [static_transform_publisher-4] [WARN] [1750127799.715367461] []: Old-style arguments are deprecated; see --help for new-style arguments [static_transform_publisher-2] [WARN] [1750127799.715368389] []: Old-style arguments are deprecated; see --help for new-style arguments [rviz2-5] RCUTILS_CONSOLE_STDOUT_LINE_BUFFERED is now ignored. Please set RCUTILS_LOGGING_USE_STDOUT and RCUTILS_LOGGING_BUFFERED_STREAM to control the stream and the buffering of log messages. [rviz2-5] Warning: Ignoring XDG_SESSION_TYPE=wayland on Gnome. Use QT_QPA_PLATFORM=wayland to run on Wayland anyway. [lego_loam_sr-1] RCUTILS_CONSOLE_STDOUT_LINE_BUFFERED is now ignored. Please set RCUTILS_LOGGING_USE_STDOUT and RCUTILS_LOGGING_BUFFERED_STREAM to control the stream and the buffering of log messages. [static_transform_publisher-3] [INFO] [1750127799.736069007] [base_link_to_camera]: Spinning until stopped - publishing transform [static_transform_publisher-3] translation: ('0.000000', '0.000000', '0.000000') [static_transform_publisher-3] rotation: ('-0.499999', '-0.500000', '-0.500000', '0.500001') [static_transform_publisher-3] from 'camera' to 'base_link' [static_transform_publisher-4] [INFO] [1750127799.736074443] [velodyne_to_base_link]: Spinning until stopped - publishing transform [static_transform_publisher-4] translation: ('0.000000', '0.000000', '0.000000') [static_transform_publisher-4] rotation: ('0.000000', '0.000000', '0.000000', '1.000000') [static_transform_publisher-4] from 'base_link' to 'velodyne' [static_transform_publisher-2] [INFO] [1750127799.736076789] [camera_init_to_map]: Spinning until stopped - publishing transform [static_transform_publisher-2] translation: ('0.000000', '0.000000', '0.000000') [static_transform_publisher-2] rotation: ('0.500000', '0.499999', '0.500000', '0.500001') [static_transform_publisher-2] from 'map' to 'camera_init' [lego_loam_sr-1] [INFO] [1750127799.756201716] [image_projection]: ----> Started. [lego_loam_sr-1] [INFO] [1750127799.756278719] [feature_association]: ----> Started. [lego_loam_sr-1] [INFO] [1750127799.756287725] [map_optimization]: ----> Started. [lego_loam_sr-1] [INFO] [1750127799.756294112] [transform_fusion]: ----> Started. [rviz2-5] [INFO] [1750127801.783291447] [rviz2]: Stereo is NOT SUPPORTED [rviz2-5] [INFO] [1750127801.783409655] [rviz2]: OpenGl version: 4.6 (GLSL 4.6) [rviz2-5] [INFO] [1750127801.796149614] [rviz2]: Stereo is NOT SUPPORTED ros2 launch lego_loam /home/lei/ros2_ws/src/LeGO-LOAM-ROS2/LeGO-LOAM/launch/run.launch.py [INFO] [rviz2-5]: process has finished cleanly [pid 7655] 第二个终端创窗口:lei@leiguoguo:~/ros2_ws$ source /opt/ros/humble/setup.bash lei@leiguoguo:~/ros2_ws$ source ~/ros2_ws/install/setup.bash lei@leiguoguo:~/ros2_ws$ ros2 bag play /home/lei/ros2_bag [INFO] [1750127971.316237348] [rosbag2_storage]: Opened database '/home/lei/ros2_bag/ros2_bag.db3' for READ_ONLY. [INFO] [1750127971.316356460] [rosbag2_player]: Set rate to 1 [WARN] [1750127971.319173825] [rosbag2_player]: Ignoring a topic '/rosout', reason: Something went wrong loading the typesupport library for message type rosgraph_msgs/Log. Library could not be found.. [WARN] [1750127971.319306206] [rosbag2_player]: Ignoring a topic '/rosout_agg', reason: Something went wrong loading the typesupport library for message type rosgraph_msgs/Log. Library could not be found.. [INFO] [1750127971.328125593] [rosbag2_player]: Adding keyboard callbacks. [INFO] [1750127971.328146451] [rosbag2_player]: Press SPACE for Pause/Resume [INFO] [1750127971.328154723] [rosbag2_player]: Press CURSOR_RIGHT for Play Next Message [INFO] [1750127971.328161427] [rosbag2_player]: Press CURSOR_UP for Increase Rate 10% [INFO] [1750127971.328167456] [rosbag2_player]: Press CURSOR_DOWN for Decrease Rate 10% [INFO] [1750127971.328443036] [rosbag2_storage]: Opened database '/home/lei/ros2_bag/ros2_bag.db3' for READ_ONLY. 第三个终端窗口:lei@leiguoguo:~/ros2_ws$ sudo apt update [sudo] lei 的密码: 命中:1 http://mirrors.huaweicloud.com/repository/ubuntu jammy InRelease 获取:2 http://mirrors.tuna.tsinghua.edu.cn/ros2/ubuntu jammy InRelease [4,682 B] 命中:4 https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu jammy InRelease 命中:3 https://packages.microsoft.com/repos/code stable InRelease 命中:5 http://mirrors.huaweicloud.com/repository/ubuntu jammy-updates InRelease 命中:6 http://mirrors.huaweicloud.com/repository/ubuntu jammy-backports InRelease 命中:7 http://mirrors.huaweicloud.com/repository/ubuntu jammy-security InRelease 已下载 4,682 B,耗时 7秒 (653 B/s) 正在读取软件包列表... 完成 正在分析软件包的依赖关系树... 完成 正在读取状态信息... 完成 有 268 个软件包可以升级。请执行 ‘apt list --upgradable’ 来查看它们。 lei@leiguoguo:~/ros2_ws$ cd .. lei@leiguoguo:~$ sudo apt install --reinstall ros-humble-rosgraph-msgs 正在读取软件包列表... 完成 正在分析软件包的依赖关系树... 完成 正在读取状态信息... 完成 升级了 0 个软件包,新安装了 0 个软件包,重新安装了 1 个软件包,要卸载 0 个软件包,有 268 个软件包未被升级。 需要下载 36.2 kB 的归档。 解压缩后会消耗 0 B 的额外空间。 获取:1 http://mirrors.tuna.tsinghua.edu.cn/ros2/ubuntu jammy/main amd64 ros-humble-rosgraph-msgs amd64 1.2.1-1jammy.20250607.025930 [36.2 kB] 已下载 36.2 kB,耗时 1秒 (39.1 kB/s) (正在读取数据库 ... 系统当前共安装有 262567 个文件和目录。) 准备解压 .../ros-humble-rosgraph-msgs_1.2.1-1jammy.20250607.025930_amd64.deb ... 正在解压 ros-humble-rosgraph-msgs (1.2.1-1jammy.20250607.025930) 并覆盖 (1.2.1-1jammy.20250607.025930) ... 正在设置 ros-humble-rosgraph-msgs (1.2.1-1jammy.20250607.025930) ... 正在处理用于 libc-bin (2.35-0ubuntu3.8) 的触发器 ...
最新发布
06-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值