ros2话题的发布者和订阅者——ubuntu20.04+自定义话题接口类型

2023-05-16

文章目录

  • 话题的发布者
  • 话题的订阅者
  • 自定义话题的接口类型
    • 将自定义的话题引入到程序中

话题的发布者

  1. 导入消息类型,ros自带的消息类型在std_msgs/msg/下面,有string等类型
  2. 定义一个类,里面声明一个发布者话题的共享指针,指针标注发布的数据类型
  3. 在构造函数中使用create_publisher创建声明的这个发布者对象,也可以在声明时创建对象。
  • 声明一个发布者的类(发布者对象、发布数据的函数)
#include "rclcpp/rclcpp.hpp"
// 1. 导入消息类型
#include "std_msgs/msg/string.hpp"

// 定义一个有发布者的类,里面包含发布者对象
class publisher: public rclcpp::Node
{
private:
  // 2.声明一个发布者用于发布消息,这里只是定义,也可以在这里对其进行初始化,我这里在构造函数里面进行初始化
  // 发布者名称为pub_er,用共性指针声明对象,<std_msgs::msg::String>表示要发布的数据类型
  rclcpp::Publisher<std_msgs::msg::String>::SharedPtr pub_er; 
public:
  // 定义一个发布话题的函数,声明类对象调用该函数发布数据。
  publisher(std::string name);
  ~publisher();
  
  void publish_data();
};
publisher::publisher(std::string name):Node(name)
{
    //发布者的构造函数
  RCLCPP_INFO(this->get_logger(),"create publisher");

  // 3. 创造一个发布者
  // 使用create_publisher这个函数创建发布者对象,并声明一下他的发布的数据类型
  // 两个参数,一个是发布的话题名称,参数是队列长度,暂时填一个数字10
  pub_er = this->create_publisher<std_msgs::msg::String>("topic_name",10);

}
// 析构函数,该函数在释放对象后调用,或者按CTRL+C后调用
publisher::~publisher()
{RCLCPP_INFO(this->get_logger(),"delete publisher");}

// 调用该函数,使用发布者把数据发布出去
void publisher::publish_data()
{
  // 声明一个存储数据的对象
  std_msgs::msg::String text_data;
  // 向对象中存储数据要调用该数据类型对象的data
  text_data.data="abcdefg";
  pub_er->publish(text_data);
}

  • 主函数调用发布者独享
int main(int argc, char ** argv)
{
  rclcpp::init(argc,argv);
  // 声明一个节点对象,该节点的类型是我们是声明的 发布者类
  auto node = std::make_shared<publisher>("my_publishr");
  while(1)
  {
    sleep(3);
    node->publish_data();
  }
  rclcpp::spin(node);
  rclcpp::shutdown();
}

话题的订阅者

  • 声明一个订阅者的类
// 创建一个订阅者的类
class subscriber : public rclcpp::Node
{
private:
  // 声明一个话题的订阅者,发布者为sub_er
  // clcpp::Subscription是一个模板类,要订阅的话题类型为std_msgs::msg::String
  rclcpp::Subscription<std_msgs::msg::String>::SharedPtr sub_er;
  // 声明一个订阅者的回调函数,回调函数用于当我们接收到发布者的数据后做的反应
  // 参数是一个共享指针,指针的类型就是发布者发布的类型
  void callback(const std_msgs::msg::String::SharedPtr publish_data)
  {
    //收到数据后的处理逻辑
    // 这里只是把订阅到的数据打印输出一下
    RCLCPP_INFO(this->get_logger(),"data:%s",publish_data->data.c_str());
  }
public:
  subscriber(std::string name);
  ~subscriber();
};

subscriber::subscriber(std::string name):Node(name)
{
  //订阅者的构造函数
  RCLCPP_INFO(this->get_logger(),"create subscriber");

  //构造函数里面创建订阅者
  //使用create_subscription这个来给声明的订阅者来创建一个实体
  //create_subscriptionde第一个参数是:订阅的话题名称,第二个参数是队列长度
  //成员函数不能只用当做参数进行回调,成员函数需要一个对象来调用,可以使用bind
  sub_er = this->create_subscription<std_msgs::msg::String>("topic_name",10,std::bind(&subscriber::callback,this,_1));
}

subscriber::~subscriber()
{ RCLCPP_INFO(this->get_logger(),"delete subscriber"); }
  • 主函数声明这个订阅者对象
int main(int argc, char ** argv)
{
  rclcpp::init(argc,argv);
  auto node = std::make_shared<subscriber>("my_subscriber");
  rclcpp::spin(node);
  rclcpp::shutdown();
}

自定义话题的接口类型

  1. 在包的src的同级目录下,不是工程目录的src同级目录下创建msg文件夹

  2. 在msg文件夹下创建Xxx.msg文件(文件首字母大写,不能包含_下划线等符号

  3. 在Xxx.msg文件中添加消息类型

  4. 在CmakeList.txt文件和package.xml文件中添加依赖、msg文件的目录

  5. 创建一个msg文件,文件名为Novel.msg

# 添加一个string类型和图片类型
# 调用原有的string类型
string content

# 调用以后的图片类型
sensor_msgs/Image image

# 数组的话直接在数据类型后面加数组的中括号,例如:
# string[] content

  1. 修改CMakeLists.txt文件

主要是添加依赖(find_package和rosidl_generate_interfaces)

# 添加我们要引入数据类型的依赖包
find_package(sensor_msgs REQUIRED) # sensor_msgs/Image
# 自定义数据类型还需要一个rosidl_default_generators
find_package(rosidl_default_generators REQUIRED)

# 自定义数据类型还需要添加一个rosidl_generate_interfaces
rosidl_generate_interfaces(${PROJECT_NAME} 
    "msg/Novel.msg"  #这里是指明msg文件的目录和名称
    DEPENDENCIES sensor_msgs) # 这里需要填上这个类型所需的依赖
  1. 修改package.xml文件
  <depend>sensor_msgs</depend> <!-- 这个是数据类型的依赖 -->
  <!-- 下面三项是需要添加的东西 -->
  <buildtool_depend>rosidl_default_generators</buildtool_depend>
  <exec_depend>rosidl_default_runtime</exec_depend>
  <member_of_group>rosidl_interface_packages</member_of_group>

将自定义的话题引入到程序中

  • 代码中引入头文件和声明一个订阅者
// 引入自定义话题接口的头文件
// 表示在ros2_publisher包或目录下的msg目录下,文件名为Novel
#include <ros2_publisher/msg/Novel.hpp>

  // 定义一个自定义话题数据类型的对象
  ros2_publisher::msg::Novel publish_data_interface;
  // 声明一个自定义数据类型的发布者
  rclcpp::Publisher<ros2_publisher::msg::Novel>::SharedPtr  num_publisher=this->create_publisher<ros2_publisher::msg::Novel>("topic_name",20);

  • 修改CMakeLists.txt文件
添加自定义数据类型的包依赖
find_package(ros2_publisher REQUIRED)

在ament_target_dependencies中添加包依赖名
ament_target_dependencies(
  my_publisher
  "std_msgs"
  "rclcpp"
  ros2_publisher
)
  • 修改package.xml文件
添加定义数据类型的包
  <depend>ros2_publisher</depend>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ros2话题的发布者和订阅者——ubuntu20.04+自定义话题接口类型 的相关文章

随机推荐

  • CMake Error: The current CMakeCache.txt directory is different...

    零 问题描述 开始学ROS时 xff0c 需要编译别人的功能包 xff0c 常常把别人的工作空间拿过来使用 xff0c 但编译时会出现各种错误 xff0c 如下的目录问题 xff1a CMake Error The current CMak
  • Could not find a package configuration file provided by “slam_karto” with any of the following names

    零 问题描述 使用ROS时 xff0c 需要编译别人的功能包 xff0c 但编译时会出现各种错误 xff0c 如下的缺少功能包的问题 xff1a CMake Error at opt ros kinetic share catkin cma
  • AS5047开发简介

    本文有麦粒电子撰写 xff0c 并提供相应产品服务 AS5047是ams公司研发的14bit精度的磁传感器 xff0c 只需要一个磁铁悬于芯片上方就可以检测出相应的角度信息 针对不同的应用场景 xff0c 该芯片还配置了不同的输出接口 xf
  • 舵机PWM转模拟电压(带正反控制)

    舵机PWM转模拟电压 xff08 带正反控制 xff09 本文由 麦粒电子 撰写 xff0c 并提供相应产品服务 叙述 上文讲到讲遥控器接收机信号转换成模拟电压 xff0c 用于驱动直流无刷电机的案例 其中的信号转换器4路转换信号可用于DI
  • mbedtls加密组件使用示例

    目录 1 mbedtls aes组件的使用1 1 AES ECB加解密接口使用1 2 AEC CBC加解密接口使用1 3 AES 使用CFB加解密接口使用1 4 AES 使用OFB加解密接口使用1 4 AES 使用CTR加解密接口使用1 2
  • 2021-10-07

    舵机PWM信号转继电器开关信号 本文由 麦粒电子 撰写 xff0c 并提供相应产品服务 叙述 航模玩家经常需要DIY改装 譬如飞行器做一个投弹的开关 xff0c 船用模型做一个投食机关 再或者弄一些彩灯控制 往往这些功能只需要有一个简单的开
  • 舵机PWM信号转互斥继电器开关信号

    本文由 麦粒电子 撰写 xff0c 并提供相应产品服务 叙述 上次的PWM转继电器开关方案得到大家的不少好评 xff08 博客链接 xff09 xff0c 但是发现有些玩家需要一路PWM同时去控制两路继电器开关通断 xff0c 并且两者是互
  • AMS5601开发 AB角度磁编码器

    AMS5601的ardunio和STM32驱动开发 本文有麦粒电子撰写 xff0c 并提供相应硬件产品服务 前言 目前ams关于磁编码芯片用的比较多的可能是ams5600 xff0c 能够输出pwm信号 xff0c 电压信号以及I2C通信数
  • Spring Security 登录密码验证过程(UsernamePasswordAuthenticationFilter)

    Spring Security主要是一个由一堆Filter组成的过滤器链 每个Filter做自己的事情 今天我跟一下登录的密码认证过程 主要是UsernamePasswordAuthenticationFilter这个类 1 web xml
  • ROS-虚拟CAN通讯/实质CAN通信

    xff11 xff0e 源码安装canopen 从官网下载canopen至Ubuntu xff0c 下载地址 xff1a https github com ros industrial ros canopen tree kinetic de
  • 无人机集群任务规划方法研究综述&论文解读

    无人机集群任务规划方法研究综述 amp 论文解读 参考文献引言 任务规划理论模型 xff1a 分布式任务规划理论分布式智能规划方法的出现 xff1a 无人机集群应用的核心技术集中式 xff1a 分布式集散式 基于逻辑与规则的多无人机任务规划
  • 【无人机设计与开发】推荐几个无人机网址

    本文 也是转载于 北航可靠飞行组的课件 北航官网 xff1a http rfly buaa edu cn index html 官方名网址推荐理由51IMXhttp www 5imx com portal php遥控模型分享ArduPilo
  • 【PX4 飞控剖析】06 树莓派加载安装ROS,Mavros以及PX4固件

    PX4 飞控剖析 06 树莓派加载安装Mavros以及PX4固件 1 树莓派 刷镜像1 1 用Win32DiskImager刷入ubuntu mate 16 04 2 desktop armhf raspberry pi的镜像 1 2 开机
  • 【激光SLAM】 01 cartographer环境建立以及建图测试(详细级)

    激光SLAM cartographer环境建立以及建图测试 xff08 详细级 xff09 cartographerLaunch the 2D backpack demo Download the 3D backpack example b
  • gerrit api使用curl方式

    curl digest u username password X GET 39 http gerriturl a projects 项目名称 config 39 password是gerrit上settings中的密码 项目名称中包含 记
  • lwip 基于select方式实现的tcp简易客户端

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • Kalibr相机矫正 ImportError: cannot import name PlotCollection

    Kalibr相机矫正 ImportError cannot import name PlotCollection 问题描述解决方法 其实非常简单的一个问题 xff0c 在网上找了一天都没找到解决方法 xff0c 一次偶然的操作 xff0c
  • esp32c3 nuttx 移植 micropython 尝试

    源码来自 https github com apache incubator nuttx apps pull 840 和 https github com apache incubator nuttx apps tree 787ac9060
  • 曼孚技术分享丨浅析自动驾驶车辆检测技术

    提到自动驾驶 xff0c 有人不禁会好奇 xff0c 自动驾驶系统如何感知周围环境并做出 人类 的决定 自动驾驶技术的主要模块共三大类 xff0c 即感知 规划和控制 它们之间相互协作 xff0c 共同为车辆的安全性与舒适性保驾护航 简单来
  • ros2话题的发布者和订阅者——ubuntu20.04+自定义话题接口类型

    文章目录 话题的发布者话题的订阅者自定义话题的接口类型将自定义的话题引入到程序中 话题的发布者 导入消息类型 xff0c ros自带的消息类型在std msgs msg 下面 xff0c 有string等类型定义一个类 xff0c 里面声明