【ROS】让你的回调函数并行起来
【前言】
众所周知,ROS中的所有回调函数,都由 ros::spin() 这个家伙来统一管理和唤醒。这里说的是所有通过ROS方式创建出来的回调函数,比如ros::Subscriber、ros::Timer等等的回调函数。
【举例】
我们先来看一个示例节点:
#include <ros/ros.h>
#include <cstdlib>
#include <time.h>
#include <iostream>void test_1()
{usleep(200 * 1000);ROS_INFO("test 1");
}void test_2()
{ROS_INFO("test 2");
}int main(int argc, char** argv)
{ros::init(argc, argv, "test_node");ros::NodeHandle nh;ros::Timer timer_1 = nh.createTimer(ros::Duration(0.1), [&](const ros::TimerEvent &){test_1();});ros::Timer timer_2 = nh.createTimer(ros::Duration(0.05), [&](const ros::TimerEvent &){test_2();});ros::spin();return 1;
}
你猜 timer_2 定时器的回调函数 test_2() 的实际运行频率是多少?会是我们设置的0.05秒一次吗?
很遗憾,test_2() 的实际运行频率是 0.2秒一次!
聪明的你肯定已经察觉出端倪,test_1() 这个回调中阻塞了200毫秒,并且它也影响了 test_2() 的调用。
没错,ros::spin() 是通过单线程的方式,管理所有回调函数的!!!
【出路】
那如果我们的节点中,有些回调函数确实需要执行一些复杂操作,导致回调执行被阻塞一段时间,我们又该怎么办呢?
此时,我们应该把 spin() 替换成 ros::AsyncSpinner ,也就是异步的多线程回调执行器!同样是上面的代码,我们做一下修改:
#include <ros/ros.h>
#include <cstdlib>
#include <iostream>
#include <time.h>void test_1()
{usleep(200 * 1000);ROS_INFO("test 1");
}void test_2()
{ROS_INFO("test 2");
}int main(int argc, char** argv)
{ros::init(argc, argv, "test_node");ros::NodeHandle nh;ros::Timer timer_1 = nh.createTimer(ros::Duration(0.1), [&](const ros::TimerEvent &){test_1();});ros::Timer timer_2 = nh.createTimer(ros::Duration(0.05), [&](const ros::TimerEvent &){test_2();});ros::AsyncSpinner spinner(4); //非阻塞式的spinner, 可以使用start和stop进行启停spinner.start(); //启动线程ros::waitForShutdown();return 1;
}
再次运行这个节点,你会发现,test_2() 的执行频率变成了我们期望的 20Hz了。
注意:上面代码中的 spinner(4) 代表开启4个线程循环,你可以根据你的运行环境,设置影响的线程数量。
相关文章:
【ROS】让你的回调函数并行起来
【前言】 众所周知,ROS中的所有回调函数,都由 ros::spin() 这个家伙来统一管理和唤醒。这里说的是所有通过ROS方式创建出来的回调函数,比如ros::Subscriber、ros::Timer等等的回调函数。 【举例】 我们先来看一个示例节点: #i…...
M12电连接器的编码分类及应用领域分析
12电连接器的编码主要包括A、B、C、D、X、S、T、K、L等类型,每种编码都有其特定的应用场景和功能: A编码:适用于传感器、直流电、1G以太网。 B编码:主要用于PROFIBUS总线系统。 C编码:适用于交流电。 D编码&#x…...
基于YOLOv8的道路裂缝坑洼检测系统
基于YOLOv8的道路裂缝坑洼检测系统 (价格88) 包含 【“裂缝”,“凹坑”】 2个类 通过PYQT构建UI界面,包含图片检测,视频检测,摄像头实时检测。 (该系统可以根据数据训练出的yolov8的权重文件,运用在其他检测系…...
蓝鹏测径仪非标定制订制流程
测径仪通常属于非标定制设备,非标定制意味着这些设备不是按照标准规格批量生产的,而是根据特定的客户需求和应用场景设计和制造的。例如,某些测径仪可能需要特殊的测量范围、精度、传感器或软件来满足特定的工业检测要求。 测径仪非标定制的…...
vue基础3
1.推荐好用的第三方框架 BootCDN - Bootstrap 中文网开源项目免费 CDN 加速服务 1.moment.js 2.dayjs 2.收集表达数据 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>Document</title><…...
LINUX -exec函数族
1、功能: *让父子进程来执行不相干的操作 *能够替换进程地址空间的代码.text段 *执行另外的程序,不需要创建额外的的地址空间 *当前程序中调用另外一个应用程序 2、执行目录下的程序: *指定执行目录下的程序 int execl(const char *path,…...
c++ 智能指针shared_ptr与make_shared
shared_ptr是C11引入的一种智能指针,它允许多个shared_ptr实例共享同一个对象,通过引用计数来管理对象的生命周期。当最后一个持有对象的shared_ptr被销毁时,它会自动删除所指向的对象。这种智能指针主要用于解决资源管理问题&…...
2024-HW最新漏洞整理及相应解决方案(二)
目录 前言: 漏洞 1.用友NC系统电采complainjudge接口的sql注入漏洞 2.用友U8 CRM产品存在SQL注入漏洞 3.WordPress LMS 插件任意文件上传漏洞 4.Oracle Fusion Middleware 安全漏洞CVE-2024-21181 5.WordPress plugin LearnPress 安全漏洞CVE-2024-6589 6.W…...
spring boot整合JPA兼容MySQL8和达梦数据库8
前言 Spring Boot是一个基于Spring框架的快速开发框架,它可以简化Spring应用的配置和部署过程。JPA(Java Persistence API)是Java持久化规范的一种实现,它提供了一种统一的方式来访问和管理数据库。MySQL和达梦数据库都是常用的关…...
规划决策算法(四)---Frenet坐标系
知乎:坐标系转换 1.Frenet 坐标系 什么是 Frenet 坐标系: 为什么使用 Frenet 坐标系: 通常情况,我们只会关注车辆当前距离左右车道线的距离,来判断是否偏离车道,是否需要打方向盘进行方向微调。而不是基于…...
大数据处理:大数据处理框架Hadoop、Spark
大数据处理是当代信息技术领域的一个重要分支,它涉及到海量数据的存储、管理和分析。为了高效地应对大数据处理的挑战,多种框架被开发出来,其中Hadoop和Spark是最为知名和广泛应用的两种。以下将详细介绍这两种框架以及它们在大数据处理中的应…...
网传的高频流量费会影响到个人用户的算法和策略T0吗?
先解答这个问题:高频的流量费这个确实是会影响你自己算法的交易的!但是,强调一个但是:有的券商是没有流量费的!小编今天就来带大家了解一下!第一:算法交易的应用场景! 算法交易的主…...
阿里云服务器 Ubuntu18.04 安装 mysql8.0并允许外部连接
参考教程: 官网教程 参考教程一 首先彻底删除mysql5.7 dpkg --list|grep mysql #查看 sudo apt-get remove mysql-common #卸载 sudo apt-get autoremove --purge mysql-server-5.7 #版本自己修改 dpkg -l|grep ^rc|awk {print$2}|sudo xargs dpkg -P #清除残留数…...
(Arxiv-2023)MobileDiffusion:移动设备上即时文本到图像生成
MobileDiffusion:移动设备上即时文本到图像生成 Paper Title:MobileDiffusion: Instant Text-to-Image Generation on Mobile Devices Paper是谷歌出品 Paper地址 图 1:MobileDiffusion 用于 (a) 文本到图像的生成。(b) Canny 边缘到图像、风…...
【七】Hadoop3.3.4基于ubuntu24的分布式集群安装
文章目录 1. 下载和准备工作1.1 安装包下载1.2 前提条件 2. 安装过程STEP 1: 解压并配置Hadoop选择环境变量添加位置的原则检查环境变量是否生效 STEP 2: 配置Hadoop2.1. 修改core-site.xml2.2. 修改hdfs-site.xml2.3. 修改mapred-site.xml2.4. 修改yarn-site.xml2.5. 修改hado…...
【Rust光年纪】深入了解Rust语言的关键库:功能特点与使用场景分析
探索Rust语言下的重要库:硬件接口控制和数据库操作全解析 前言 随着Rust语言在嵌入式开发和数据库操作领域的不断发展,越来越多的优秀库和工具涌现出来。本文将介绍一些用于Rust语言的重要库,包括硬件接口库、嵌入式硬件抽象层、ORM和查询构…...
矩估计与最大似然估计的通俗理解
点估计与区间估计 矩估计与最大似然估计都属于点估计,也就是估计出来的结果是一个具体的值。对比区间估计,通过样本得出的估计值是一个范围区间。例如估计馒头店每天卖出的馒头个数,点估计就是最终直接估计每天卖出10个,而区间估…...
性能调优本质:如何精准定位瓶颈并实现系统极致优化
目录 先入为主的反例 性能调优的本质 性能调优实操案例 性能调优相关文章 先入为主的反例 在典型的 ETL 场景中,我们经常需要对数据进行各式各样的转换,有的时候,因为业务需求太复杂,我们往往还需要自定义 UDF(User Defined Functions)来实现特定的转换逻辑。 但是…...
Git的命令
git add . 添加到暂存区 git commit -m 备注 提交 git branch 查看所有分支 git branch -d 分支名 删除分支 git push origin --delete 分支名 远程分支删除 git branch -a 查看删除后的分支 git clone 地址 例如https://gitee.com/whale456/demo.git git push origin m…...
WPF中使用定时器更新元素-DispatcherTimer
在WPF中使用定时器来更新UI元素是一种常见且有用的做法,特别是当你需要基于时间间隔来刷新数据或执行某些操作时。DispatcherTimer是WPF中用于在UI线程上执行周期性任务的理想选择,因为它确保了对UI元素的更新是线程安全的 例子程序 每隔0.5s 界面中的…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
