ROS学习总结十六:订阅一个话题同时发布一个话题(subscriber and publisher)

2023-05-16

在使用ROS的时候,我们会用到很多节点,例如之前的gazebo仿真、hector建图、键盘控制等,这些节点的消息传递主要靠的是话题与订阅。在很多程序中,我们可能需要订阅一些数据,同时我们处理完这些数据后还要再发布出去,这时我们该如何写这个节点:
比如说这里我们接受scan的数据,然后让其数据以scan3的topic重新发送出去,那么可以通过下面的这个程序实现:

#include "sensor_msgs/LaserScan.h"
#include <iostream>
#include <fstream>
#include <test_msgs/Test.h>
  	 
#define RAD2DEG(x) ((x)*180./M_PI)
ros::Publisher scan_pub;
//using namespace std;  	 
void scanCallback(const sensor_msgs::LaserScan::ConstPtr& scan2)
{
  //ros:Publisher pub_f64;
  //std::vector<float>;
  //std::vector<float> data=scan2->ranges;
  //std::cout<< ranges.size()<<" ";
  //int count = scan2->scan_time / scan2->time_increment;
  ROS_INFO("I heard a laser scan %s[%d]:", scan2->header.frame_id.c_str(), count);
  ROS_INFO("range, %f", scan2->ranges[12]);


  unsigned int num_readings = 100;
  double laser_frequency = 40;
  double ranges[num_readings];
  double intensities[num_readings];
 
//  int count = 0;
//  ros::Rate r(1.0);
  ros::Time scan3_time = ros::Time::now();
  sensor_msgs::LaserScan scan3;
  scan3.header.frame_id = "laser_frame";
  scan3.angle_min = -1.57;
  scan3.angle_max = 1.57;
  scan3.angle_increment = 3.14 / num_readings;
  scan3.time_increment = (1 / laser_frequency) / (num_readings);
  //scan3.scan.time=scan2->scan.time;
  scan3.range_min = 0.0;
  scan3.range_max = 100.0;
  scan3.ranges=scan2->ranges;
  scan_pub.publish(scan3);

}

 	 
int main(int argc, char **argv)
{
  ros::init(argc, argv, "rplidar_node_client");
  ros::NodeHandle n;
  	 
  ros::Subscriber sub = n.subscribe<sensor_msgs::LaserScan>("/scan", 1000, scanCallback);
  //ros::Publisher scan_pub = n.advertise<sensor_msgs::LaserScan>("scan3", 50); 
  scan_pub=n.advertise<sensor_msgs::LaserScan>("scan3", 50);	 
  ros::spin();
  	 
  return 0;
}

这个程序部分来自于:

https://blog.csdn.net/geerniya/article/details/84853077
以及
https://www.codetd.com/article/1836116

剩下的是参考一些零零碎碎的文章搭建而成。这里需要注意到main()中注释掉的一行:

  //ros::Publisher scan_pub = n.advertise<sensor_msgs::LaserScan>("scan3", 50); 
  scan_pub=n.advertise<sensor_msgs::LaserScan>("scan3", 50);	

这两者是有区别的,一开始我使用上面一种语法,编译通过但是节点打开后报错:
在这里插入图片描述
后来我在这个论坛里找到了一个解答:

https://answers.ros.org/question/321440/error-call-to-publish-on-an-invalid-publisher-using-approximatetime-policy/

其中似乎提到了一个变量的初始化问题,上面的写法新建了一个变量,而下面的写法使用了全局变量。可能如果要使用上面的语法的话publisher函数处理要放到main主函数中来。

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

ROS学习总结十六:订阅一个话题同时发布一个话题(subscriber and publisher) 的相关文章

随机推荐

  • Promise限制并发请求数量

    所谓并发请求 xff0c 就是指在一个时间点多个请求同时执行 当并发的请求超过一定数量时 xff0c 会造成网络堵塞 xff0c 服务器压力大崩溃或者其他高并发问题 xff0c 此时需要限制并发请求的数量 假如等待请求接口1000个 xff
  • 部署安装cobbler,实现批量安装CentOS7、Ubuntu17.04、Ubuntu18.04(快捷版)

    文章目录 一 部署安装cobbler1 编辑cobbler配置文件2 持续安装所需文件3 配置tftp4 安装pykickstart5 设置密码6 cobbler管理DHCP7 编辑启动应用服务脚本 二 镜像导入以及自动化文件必读须知1 C
  • IDEA中找不到maven插件Plugin‘ ‘ not found 解决

    1 lt artifactId gt maven compiler plugin lt artifactId gt lt version gt 3 8 0 lt version gt 等 报红 1 1首先要找设置 File Settings
  • 树莓派 安装 Ubuntu MATE18

    Ubuntu MATE18 树莓派 pi 64 raspberrypi span class token punctuation span span class token operator span sudo service cups s
  • Munkres 分配算法

    匈牙利方法 xff08 或 Kuhn 算法 xff09 是由4个基本步骤组成的迭代过程 该方法使用 最小行集 覆盖 操纵 成本矩阵的零点 xff0c 当所需的 最小行集 等于给定成本矩阵的维数时 xff0c 过程终止 Munkres 算法是
  • SORT 多目标跟踪算法笔记

    SORT 是一种简单的在线实时多目标跟踪算法 文章要点为 xff1a 以 IoU 作为前后帧间目标关系度量指标 xff1b 利用卡尔曼滤波器预测当前位置 xff1b 通过匈牙利算法关联检测框到目标 xff1b 应用试探期甄别虚检 xff1b
  • ros:kcf算法+行人检测 = 让机器人自动识别并追踪行人

    实现目标 xff1a 机器人检测到有人走过来 xff0c 迎上去并开始追踪 追踪算法使用kcf算法 xff0c 关于kcf追踪的ros库在github地址 https github com TianyeAlex tracker kcf ro
  • 人物交互(human object interaction)论文汇总-2019年

    1 Relation Parsing Neural Network for Human Object Interaction Detection 1 1 总述 提出一种关系解析神经网络RPNN xff0c 由两部分组成 xff1a 物体 身
  • ROS nodelet 使用详解

    本文以nodelet tutorial math为例来了解nodelet的原理及使用方法 xff0c 理论知识参考http blog csdn net zyh821351004 article details 52143309 代码地址 x
  • MPU6050

    简介 xff1a MPU6050是InvenSense 公司的 MPU6050 作为主芯片 xff0c 能同时检测三轴加速度 三轴陀螺仪 三轴角速度 的运动数据以及温度数据 利用 MPU6050 芯片内部的 DMP 模块 xff08 Dig
  • 字符串切割函数strtok、strtok_s、strtok_r的区别

    strtok函数 头文件 xff1a include lt string h gt 函数原型 xff1a char strtok char str const char delimiters 参数 xff1a str xff1a 待分割的字
  • VMware 虚拟机怎么识别不了ISO文件

    1 安装 a class baidu highlight href https www baidu com s wd 61 E8 99 9A E6 8B 9F E5 85 89 E9 A9 B1 amp tn 61 44039180 cpr
  • hadoop集群查看路径

    管理界面 xff1a http master 8088 HDFS 主界面 xff1a http master 50070 HDFS 文件界面 xff1a http master 50070 explorer html
  • Ubuntu20.04 通过VNC实现远程桌面连接

    前提 xff1a 工控机上预留至少三个以太网口 xff0c 一个接路由器 xff0c 一个接上位机 一 通过无线进行远程连接 1 了解被连接电脑的信息并设置无线连接的网络地址 优先连接无线网络 xff1a 网络地址 xff1a 192 16
  • 结束也是开始

    到昨天为止 精通ORACLE 10G 备份与恢复 算是告一段落了 xff0c 接下来准备学习一下性能调优方面的 xff0c 然后再回过来复习一下 精通ORACLE 10G 备份与恢复
  • TX2小结之CAN通信

    TX2上有2个CAN控制器 xff0c CAN控制器需要通过CAN收发器连接到物理总线上 具体参阅原理图和相关技术参考手册 下载地址 xff1a https developer nvidia com embedded downloads 1
  • ROS中启用CAN

    1 源码安装canopen 从官网下载canopen至Ubuntu xff0c 下载地址 xff1a https github com ros industrial ros canopen tree kinetic devel 终端输入 x
  • ROS节点中的CAN命令

    前言 xff1a 由于在使用TX2的过程中 xff0c 需要使用CAN通讯的方式使我的机器人底盘与TX2进行命令收发 xff0c 而我的其他传感器都建立在ROS框架下 xff0c 为了以后能使数据交互我希望把底盘数据也放到我的ROS框架里面
  • ROS学习总结十一:Gazebo物理仿真环境搭建二:自己搭建一个机器人在gazebo中运动。

    之前使用的是shenlan的源码实现了一系列的功能 xff0c 那么根据之前所学习是否可以使用一个自己的机器人实现gazebo仿真 这里我们尝试一下 xff1a 1 按照之前的方式我们给自己的机器人添加碰撞属性以及惯性属性 xff0c 机器
  • ROS学习总结十六:订阅一个话题同时发布一个话题(subscriber and publisher)

    在使用ROS的时候 xff0c 我们会用到很多节点 xff0c 例如之前的gazebo仿真 hector建图 键盘控制等 xff0c 这些节点的消息传递主要靠的是话题与订阅 在很多程序中 xff0c 我们可能需要订阅一些数据 xff0c 同