ROS回调函数传参

2023-05-16

一、回调函数仅含单个参数

C++ 代码
void chatterCallback(const std_msgs::String::ConstPtr& msg)  
{  
  ROS_INFO("I heard: [%s]", msg->data.c_str());  
}  
int main(int argc, char** argv)
{
  ....
  ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback); 
  ....
}
#python代码,简要示例
def callback(data):
    rospy.loginfo("I heard %s",data.data)
    
def listener():
    rospy.init_node('node_name')
    rospy.Subscriber("chatter", String, callback)
    # spin() simply keeps python from exiting until this node is stopped
    rospy.spin()
C++ 解析图像
#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <cv_bridge/cv_bridge.h>
#include <sensor_msgs/image_encodings.h>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include<iostream>

using namespace std;
using namespace cv;


long int count_ =0000;//不能命名成count
int n=0;
void imageCallback(const sensor_msgs::ImageConstPtr& msg)
{
      cv_bridge::CvImagePtr cv_ptr;
      try   //对错误异常进行捕获,检查数据的有效性
        { 
         cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8);
         char base_name[256];
         if(n%10==0)
         {
         sprintf(base_name,"/home/zhy/Documents/data/%04ld.jpg",count_++);
         imwrite(base_name, cv_ptr->image);
         }
         n++;
        }
        catch(cv_bridge::Exception& e)  //异常处理
        {
            ROS_ERROR("cv_bridge exception: %s", e.what());
            return;
        }    
        
}

int main(int argc, char** argv)
{
  ros::init(argc, argv, "msg2img2");
  ros::NodeHandle nh_;
  ros::Subscriber image_sub_ = nh_.subscribe("/pylon_camera_node/image_raw", 1, imageCallback);///middle/pylon_camera_node/image_raw/compressed
  
  ros::spin();
  return 0;
}

二、回调函数含有多个参数

#C++代码
void chatterCallback(const std_msgs::String::ConstPtr& msg,type1 &arg1, type2 &arg2,...,typen &argN)  
{  
  ROS_INFO("I heard: [%s]", msg->data.c_str());  
}  
int main(int argc, char** argv)
{
  ros::Subscriber sub = 
      n.subscribe("chatter", 1000, boost::bind(&chatterCallback,_1,arg1,arg2,...,argN); 
  ///需要注意的是,此处  _1 是占位符, 表示了const std_msgs::String::ConstPtr& msg。
}
#python代码,python中使用字典
def callback(data, args): 
  dict_1 = args[0]
  dict_2 = args[1]
... 

sub = rospy.Subscriber("text", String, callback, (dict_1, dict_2))
#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <cv_bridge/cv_bridge.h>
#include <sensor_msgs/image_encodings.h>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include<iostream>

using namespace std;
using namespace cv;


long int count_ =0000;//不能命名成count
int n=0;
void imageCallback(const sensor_msgs::ImageConstPtr& msg, int &rp,char* &ip, int &up)
{
      cv_bridge::CvImagePtr cv_ptr;
      try   //对错误异常进行捕获,检查数据的有效性
        { 
         cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8);
         char base_name[256];
         if(n%10==0)
         {
         sprintf(base_name,"/home/zhy/Documents/data/%04ld.jpg",count_++);
         imwrite(base_name, cv_ptr->image);
         }
         n++;
        }
        catch(cv_bridge::Exception& e)  //异常处理
        {
            ROS_ERROR("cv_bridge exception: %s", e.what());
            return;
        }    
        
}

int main(int argc, char** argv)
{

  int rtp=3;
 char IP[40]="127.0.0.1";
 int udp=4;
  
  ros::init(argc, argv, "msg2img2");
  ros::NodeHandle nh_;
  
  ros::Subscriber image_sub_ = nh_.subscribe<sensor_msgs::Image>("/pylon_camera_node/image_raw", 1,
                                               boost::bind(&imageCallback, _1, rtp,IP,udp)); 

  ros::spin();
  return 0;
}

三、boost::bind()

boost::bind支持所有的function object, function, function pointer以及member function pointers,能够将行数形参数绑定为特定值或者调用所需要的参数,并可以将绑定的参数分配给任意形参。

boost::bind()的使用方法(functions and function pointers)

定义如下函数:

int f(int a, int b)
{
    return a + b;
}

bind(f,_1,5)(x)相当于f(x,5);_1是一个占位符,其位于f函数形参的第一形参int a的位置,5位于f函数形参int b的位置;_1表示(x)参数列表的第一个参数

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS回调函数传参 的相关文章

  • 代码解读八 文件名“Ano_FlightCtrl.c”

    这个文件代码有点乱啊 xff0c 反正没怎么看懂 xff0c 涉及到一键起飞和降落 xff0c 以及关于不同任务对应不同的灯光的切换 而且注释也还可以 xff0c 凑活着看下呗 xff0c 其实这个并不是什么关键文件 xff0c 看不懂就算
  • 代码解读九 文件名“Ano_MagProcess.c”

    本部分主要是关于磁力计进行校准操作的 xff0c 用户手册上有详细步骤 xff0c 有需要可以看看 include 34 Ano MagProcess h 34 include 34 Drv LED h 34 本文件是关于磁力计校准及相关处
  • 代码解读十 文件名“Ano_FlightDataCal.c”

    本部分主要是对IMU测量模块测量的值进行后续处理 xff0c 同时在飞行过程中不断对数据进行更新 xff0c 然后进行姿态解算 xff0c 便于后续丢进PID中进行进一步处理 根据所处位置及函数调用情况不难发现此部分算是对底层的进一步封装
  • 【阅读笔记】联邦学习实战——联邦学习攻防实战

    联邦学习实战 联邦学习攻防实战 前言1 后门攻击1 1 问题定义1 2 后门攻击策略1 3 详细实现 2 差分隐私2 1 集中式差分隐私2 2 联邦差分隐私2 3 详细实现 3 模型压缩3 1 参数稀疏化3 1 1 详细实现3 1 2 实验
  • 关于后续部分

    关于算法这块基本上算是读完了 xff0c 只能从大致上理解下了 xff0c 毕竟代码不是自己写的没有最直接的感受 xff0c 那么我们来回顾下 xff0c 试着从整体上来理解下匿名代码除了最上层之外的部分 最上层也就是包含main c在内的
  • cmake:设置编译选项

    此文为 xff1a 轻松入门cmake系列教程 常用 1 cmake debug和release设置 span class token macro property span class token directive hash span
  • cmake:pkg_check_modules

    此文为 xff1a 轻松入门cmake系列教程 理论 是什么 xff1f pkg check modules是 CMake 自己的 pkg config 模块的一个用来简化的封装 xff1a 你不用再检查 CMake 的版本 xff0c 加
  • Unix/Linux编程:针对目录文件描述符的相关操作

    始于版本2 6 16 xff0c Linux内核提供了一系列新的系统调用 xff0c 在执行与传统系统调用相似任务的同时 xff0c 还提供了一些附加功能 xff0c 对某些应用程序非常有用 新 接 口类似的传统接口备 注faccessat
  • ROS:参数服务器通信

    为什么需要 在机器人开发中 xff0c 会有很多参数和设置可以后期需要调整的 xff0c 如果都放到源码里很难实现动态修改和管理 xff0c ROS2为了解决这一问题 xff0c 提出了参数这一通信机制 是什么 如何理解 参数 xff1f
  • MySQL面试:查询性能的优化方法

    实践中如何优化MySQL 四条从效果上第一条影响最大 xff0c 后面越来越小 SQL语句以及索引的优化数据库表结构的优化系统配置的优化硬件优化 查询性能的优化方法 减少请求的数据量 只返回必要的列 xff1a 最好不要使用 SELECT
  • 基础:怎样理解Linux软中断

    软中断 softirq CPU使用率升高也是最常见的一种性能问题 从 取外卖 看中断 中断是系统用来响应硬件设备请求的一种机制 它会打断进程的正常调度和执行 xff0c 然后调用内核中的中断处理程序来响应设备的请求 为什么要有中断呢 xff
  • HTTP:HTTP报文是什么样子的

    引言 如果说HTTP是因特网的信使 xff0c 那么HTTP报文就是它用来搬东西的包裹了HTTP报文是在HTTP应用程序之间发送的数据块 这些数据块以一些文本形式的元信息 meta information 开头 xff0c 这些信息模式了报
  • ROS:服务通信

    话题通信的数据传输是单向的 xff0c 订阅端被动接收发布端的数据 这时候有人就问了 xff0c 如果发布端想主动接收数据怎么办 ROS中提供了另一种通信方式 xff1a 服务通信 ROS xff1a 通信模型 Service通信是双向的
  • linux操作系统:线程,令复杂的项目并行执行

    为什么要有线程 其实 xff0c 对于任何一个进程来讲 xff0c 即使我们没有主动去创建线程 xff0c 进程也是默认会有一个主线程的 线程是负责执行二进制指令的 xff0c 它会根据项目执行计划书 xff08 二进制文件 xff09 一
  • 存储创建及openstack对接——LVM

    说明 本方案是在每一个计算节点 上安装cinder volumes组件来完成对本地存储的管理 若无特殊说明 xff0c 以下步骤仅在计算节点执行 1 前期准备 检查计算节点是否安装 lvm xff0c iscsi 磁盘分区和格式化 裸盘不能
  • clion:输出中文乱码终极解决方案

    临时解决方案 如果在windows时发现clion乱码 xff0c 可以在cmakelist txt中 xff1a c 43 43 在cmakelist txt添加set CMAKE CXX FLAGS 34 CMAKE CXX FLAGS
  • ROS:节点

    节点 ROS xff1a 节点是什么 机器人是各种功能的综合体 xff0c 每一项功能就像机器人的一个工作细胞 xff0c 众多细胞通过一些机制连接到一起 xff0c 成为了一个机器人整体 在ROS中 xff0c 我们给这些 细胞 取了一个
  • VSCode:配置C/C++开发环境

    准备 区分编辑器 编译器 IDE xff1a 作者 xff1a C语言教学 编辑器就是处理文本 xff08 源码 xff09 的程序 xff0c 写代码写的就是文本 xff0c 编辑器可能提供智能提示 代码高亮等辅助功能 xff0c 但不负
  • NXP MIMXRT1052CVL5B + 正点原子 + MCUXpresso IDE 开发环境搭建

    NXP MIMXRT1052CVL5B 43 正点原子 43 MCUXpresso IDE 开发环境搭建 说明资料准备一切就绪 xff0c 搞他安装 IDE 及生成基本工程安装 J Link 及配置开始调试下载点击 运行 按钮 xff0c
  • c语言学习笔记(1) C语言库函数

    1 xff1a ASLL可现实字符 2 xff1a c文件 span class token macro property span class token directive hash span span class token dire

随机推荐

  • 查看ROS的版本

    查看ROS的版本 启动ROS核心 xff1a roscore获取ROS参数 xff1a rosparam get rosdistro
  • ROS 版本选择和安装

    文章目录 声明 xff1a ROS 的版本选择ROS 的安装ROS 的安装方式软件源安装步骤 声明 xff1a 本文中的内容参考了市面上绝大多数畅销的ROS书籍 xff0c 本文只作个人学习记录和学习分享使用 xff0c 不作任何商业用途
  • 数据结构(考研&面试)

    数据结构和算法 xff08 持续更新 xff09 参考清华大学严蔚敏数据结构与算法 适用于考研 amp 求职 数据结构与算法JAVA落地版 Java 数据结构与算法 xff08 代码实现 下载链接 xff09 本教程全部采用C语言实现 1
  • Sphinx入门

    文章目录 Sphinx画流程图和时序图 最近在使用sphinx的时候遇到了一点问题 xff0c 首先是不支持中文检索 xff0c 为此进行了一些配置 xff0c 参考链接 首先安装jieba库 xff0c python3的安装命令是 xff
  • Linux系统信息查看命令大全

    系统 QUOTE uname a 查看内核 操作系统 CPU信息 head n 1 etc issue 查看操作系统版本 cat proc cpuinfo 查看CPU信息 hostname 查看计算机名 lspci tv 列出所有PCI设备
  • linux系统触摸板用不了(解决)

    安装好linux系统可能出现用不了触摸板的情况 xff0c 只可以单击 xff0c 不可以滑动 解决方式一 sudo modprobe psmouse sudo modprobe r psmouse 解决方式二 sudo modprobe
  • 百度移动软件开发面试题(20131018)

    1 new与malloc的区别 xff1f 分析 xff1a 一 new和malloc都是用于申请动态内存 new使用delete释放空间 xff0c malloc使用free释放 new和delete是C 43 43 中的运算符 xff0
  • Ubuntu 中apt update和upgrade 的区别

    转自https blog csdn net csdn duomaomao article details 77802673 简要说明 xff1a apt update xff1a 只检查 xff0c 不更新 xff08 已安装的软件包是否有
  • ubuntu下域名解析出问题的解决办法

    内网服务器配置了固定ip xff0c 未配置dns xff0c 临时需要接入外网时 xff0c 域名解析失败 xff0c 需要临时添加域名解析 操作如下 xff1a sudo vim etc resolv conf 然后底下插入你的好用的d
  • Git clone wiringPi出现Connection reset by peer的解决办法

    Git clone wiringPi出现Connection reset by peer的解决办法 小伙伴们按照正常的方法来安装强大的GPIO库wiringPi一般为如下几步 xff1a git span class hljs keywor
  • Linux内存占用过高?非也

    前言 今天在我的RPi2上测试GPIO程序 xff0c 忽然发现机器超卡 xff0c 重启之后依然如此 于是我top了一下发现了一个问题就是内存爆满 xff01 xff01 可我还啥都没干呢这是咋了 xff1f 于是我呵呵地开始查资料 xf
  • MPC控制笔记(一)

    转自 我的博客 笔记参考1 xff1a Understanding Model Predictive Control Youtube 带自动生成字幕 笔记参考2 xff1a Understanding Model Predictive Co
  • [强化学习笔记专题(二)]Nature DQN

    转自 我的博客 DQN Nature 一 算法流程 xff1a 定义可配置参数 episode 数量 M最大仿真时间 T xff0c g r
  • [强化学习论文] (HDQN) Integrating Temporal Abstraction and Intrinsic Motivation

    转自我的博客 论文 题目 Hierarchical Deep Reinforcement Learning Integrating Temporal Abstraction and Intrinsic Motivation 作者 Tejas
  • 强化学习专题笔记(一) 强化学习基础

    一 长期回报 对于问题的简化 xff0c 采用理想的MDP xff0c 简化问题到具有马尔科夫性 xff0c 对于马尔科夫决策过程而言 xff0c 在理想状态下 xff0c 每一个行动都要为最终的目标最大化长期回报 而努力 max t
  • [马士兵] 一. 初识JAVA 10.notepad++的安装_配置系统环境变量path

    1 安装记事本 xff1a notepad 2 安装 xff1a 一直下一步 3 打开记事本进行设置 xff1a 设置 首选项 xff1a 设置 语言格式设置 xff1a 4 打开notepad 43 43 xff08 1 xff09 方式
  • MPC控制笔记(一)

    转自 我的博客 笔记参考1 xff1a Understanding Model Predictive Control Youtube 带自动生成字幕 笔记参考2 xff1a Understanding Model Predictive Co
  • 【简单数学概念】为什么傅里叶变换能把时域变为频域?

    一 定义 频率 xff1a 在1秒时间内 xff0c 完成相同变化的次数 周期 xff1a 完成1次变化所消耗的时间 两者的关系为 xff1a 频率 61 1 周期 时域 xff1a 描述数学函数或物理信号对时间的关系 xff08 横轴是时
  • 一文彻底搞懂嵌入式中UART、RS232、RS485、CAN协议

    一文彻底搞懂嵌入式中UART RS232 RS485 CAN协议 之前分享过一些使用UART RS232 RS485 CAN协议进行传感器数据读取 伺服电机控制的文章 xff0c 但这些协议之间到底有什么不同 xff0c 工作原理又到底是什
  • ROS回调函数传参

    一 回调函数仅含单个参数 C 43 43 代码 void chatterCallback const std msgs String ConstPtr amp msg ROS INFO 34 I heard s 34 msg gt data