ROS学习笔记_02: Topic 和 msg

2023-05-16

1.ROS通信方式

ROS有四种通信方式:

  • Topic 主题
  • Service 服务
  • Parameter Service 参数服务器
  • Actionlib 动作库
    其中,topic是最常用的一种。

2.Topic

Topic: ROS中的异步通信方式,Node间通过publish-subscribe机制通信
在这里插入图片描述
topic有严格的格式要求,叫做 Message: topic内容的数据类型,定义在 .msg文件中。

基本msg包括:

  • bool,int8,int16,int32,int64(以及uint)
  • float32,float64,string
  • time,duration,header
  • 可变长数组array[],固定长度数组array[C]

3.Topic and msg实践

(1) Topic的C++实现

cd catkin_ws/src/
//创建string_processer功能包及其依赖,
catkin_create_pkg strings_processer roscpp std_msgs message_generation message_runtime

//创建自定义消息文件
//在strings_processer包的根目录下新建一个msg文件夹,在其中新建一个叫做strings.msg的文件即可。
touch strings.msg

//打开CMakeLists.txt ,修改。
//添加 add_message_files( DIRECTORY msg FILES strings.msg) 
// 由于msg文件的目录, 默认在src下面,需要用 DIRECTORY msg 指明地址;
// FILES strings.msg 用于向项目中添加刚刚自定义的消息文件。
//添加 generate_messages(DEPENDENCIES std_msgs) ,用于生成自定义的消息文件。

//在strings_processer功能包的src文件夹下,创建 publisher.cpp 文件,来创建节点。
cd src
touch publisher.cpp
//在strings_processer功能包的src文件夹下,创建 subscriber.cpp 文件,来创建节点。
touch subscriber.cpp

//修改 CMakeLists.txt
//添加可执行文件
add_executable(publisher src/publisher.cpp)
//为避免可执行文件需要依赖中的符号定义,而依赖库的生成是在可执行文件源代码编译之后,产生报错。
//添加此语句,使得编译器需要生成可执行文件的依赖,再去生成可执行文件。
add_dependencies(publisher ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
//为可执行文件链接依赖库
target_link_libraries(publisher ${catkin_LIBRARIES})

//subscriber.cpp,同理
add_executable(subscriber src/subscriber.cpp)
add_dependencies(subscriber ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(subscriber ${catkin_LIBRARIES})

编写publisher.cpp代码

#include<ros/ros.h> // ROS基本头文件
#include<strings_processer/strings.h>   // 引用自定义生成的消息类型,在msg文件夹

int main(int argc, char *argv[])
{
    // 设置消息初值
    strings_processer::strings msg;
    msg.num=0;
    msg.strings="num:";

    // 初始化节点,命名为publisher
    ros::init(argc, argv, "publisher");
    ros::NodeHandle nh; // 新建一个NodeHandle用于管理节点
    // 利用NodeHandle构造一个publisher
    ros::Publisher pub = nh.advertise<strings_processer::strings>("strings_info",1);
    // 设置循环迭代间隔并发布消息
    ros::Rate loop_rate(1.0);
    while (ros::ok())
    {
        msg.num += 1;
        ROS_INFO("We subscribed this: %s %d",msg.strings.c_str(),msg.num);
        pub.publish(msg);
        loop_rate.sleep();
    }
    return 0;
}

编写subscriber.cpp代码

#include<ros/ros.h>
#include<strings_processer/strings.h>

void publisherCallback(const strings_processer::strings &msg)
{
    ROS_INFO("We subscribed this: %s %d",msg.strings.c_str(),msg.num);
}

int main(int argc, char *argv[])
{   
    ros::init(argc, argv, "subscriber");
    ros::NodeHandle nh;
    ros::Subscriber sub = nh.subscribe("strings_info",1,publisherCallback);
    ros::spin();
    return 0;
}

运行:

// 编译
cd ~/catkin_ws
catkin_make
//运行,单独打开4个终端
roscore
rosrun strings_processer publisher
rosrun strings_processer subscriber
rosrun rqt_graph rqt_graph

在这里插入图片描述注: 随着ros框架越来越复杂,节点越来越多,再使用rosrun就太麻烦了,所以在工程中一般用roslaunch命令启动,需要编写.launch文件。

(2) Topic的Python实现

待续…

4.相关命令

在这里插入图片描述

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

ROS学习笔记_02: Topic 和 msg 的相关文章

  • ubuntu20.04 python pycharm使用cv_bridge的问题

    1 终端python运行下面会报错 xff1a from cv bridge boost cv bridge boost import getCvType ImportError lib libgdal so 26 undefined sy
  • demo:图像处理 matlab实现迭代法全局阈值分割和局部自适应阈值分割

    全局阈值分割 迭代法阈值获取方法 xff1a 1 xff09 选取一个的初始估计值T xff08 128 xff1b 2 xff09 用T分割图像 这样便会生成两组像素集合 xff1a G1由所有灰度值大于T的像素组成 xff0c 而G2由
  • Ubuntu 实用内核更新实录

    1 更新软件及内核源码 xff1a sudo apt get install gcc make libncurses5 dev openssl libssl dev sudo apt get install build essential
  • matlab工具箱下载权限受限:您的管理员限制了您对此mathworks产品的下载权限

    我也不知道我为啥安装的时候audio toolbox没安 xff0c 可能有的同学安装matlab时也没有全选所有组件 xff0c 后来用的时候发现下载不了 xff1a 在附加功能管理器中 xff0c MathWorks 工具箱和产品这一部
  • demo:用matlab app designer做一个简易app

    GUI xff08 guide xff09 的教程挺多 xff0c 但app designer是matlab后续版本中才添加的 xff0c 界面更友好但度娘资源比较少 1 点击新建 APP设计工具 xff0c 或者直接在命令行输入appde
  • matlab 数值计算课 二阶微分方程-龙格库塔方法 & ODE45

    详见mathworks 龙格库塔方法 写成矩阵 xff08 状态方程 xff09 的形式更简洁一点 xff08 其实这两种方法结果是一样的 xff0c 如果C是 1 0 0 的话 xff0c 就很明显了 xff09 例如 xff1a 求系统
  • 第一篇simulink电路仿真

    连接一个最基本的二阶RLC震荡电阻 元器件的位置如图 xff1a RLC和电流表电压表在Simscape Foundation Library Electrical下可以找到 xff0c 如图 xff1a 单纯利用这些基本电路元件连接运行会
  • 阿里云Linux系统图形化界面

    https help aliyun com knowledge detail 41227 html
  • source devel/setup.bash bash: devel/setup.bash: No such file or directory解决方法

    看到网上一些解决方法是进入 bashrc把source opt ros kinetic setup bash这句话去掉之类的 xff0c 真是感到欲哭无泪 把这句话去掉只是让这个错误不再显示而已 xff0c 根本不能解决问题 根据报错信息很
  • 基于LQR的倒立摆控制——python代码——dlqr步骤推导

    推荐一个自动控制小车开源项目 xff1a 本文结合老王自动驾驶控制算法第五讲的离散LQR进行学习复盘 Inverted Pendulum Control PythonRobotics documentation dlqr原理 xff08 老
  • 【OpenMV小车——第1.2篇】OpenMV主控板的简介与入门使用

    前言 xff1a 视觉小车最重要的是视觉功能 xff0c 其实现方式主要有 xff1a Opencv 43 外置计算机摄像头 需要计算机作为上位机 Stm32 43 OV7670 较难 xff0c 大师级 OpenMV摄像头 较简单 xff
  • Windows 配置 C/C++ 开发环境

    文章目录 1 安装 MinGW w641 1 下载1 2 解压到合适的目录下1 3 添加到环境变量1 4 测试是否安装成功 2 安装 CMake2 1 下载2 2 解压到合适的目录下2 3 添加到环境变量2 4 测试是否安装成功 3 编译运
  • I.MX6ULL的SPI通信

    简述 SPI是串行外设接口 xff08 Serial Peripheral Interface xff09 的缩写 xff0c 相比于I2C最高400bps的传输速度 xff0c SPI每秒可以传输的数据可以高达几十M甚至上百Mbit 1
  • 信号量与互斥量的区别

    信号量 xff1a 那是多线程同步用的 xff0c 一个线程完成了某一个动作就通过信号告诉别的线程 xff0c 别的线程再进行某些动作 互斥量 xff1a 这是多线程互斥用的 xff0c 比如说 xff0c 一个线程占用了某一个资源 xff
  • C语言常用转义字符表

    C语言常用转义字符表 转义字符 xff1a 转义字符分为一般转义字符 八进制转义字符 十六进制转义字符 一般转义字符 xff1a 背诵 0 n 八进制转义字符 xff1a 141 是合法的 xff0c 前导的0是不能写的 十六进制转义字符
  • 2018年App测试流程及要点梳理

    先说说 xff0c 为什么要给大家梳理App测试流程和要点呢 xff1f 主要是缘于有太多同学咨询相关App测试的问题 xff0c 回答的次数多了 xff0c 就不想打字了 xff0c 还不如这样全部帮你们整理好 xff0c 希望各位看到的
  • 毕业设计--球上自平衡机器人

    目录 前言 一 机器人原理分析 二 控制器设计 三 程序部分 四 硬件清单 五 电路设计 六 结构设计 七 总结与展望 总结 展望 2021 8 18更新 xff1a 看到评论区很多人对这个机器人比较感兴趣 xff0c 把之前挖好的坑填一下
  • ROS入门之CmakeList.txt详讲

    本文为进来学习的总结 xff0c 记录了学习CmakeList txt文档的各个步骤 xff0c 适合从零开始理解CmakeList txt xff0c 可能存在错误之处 xff0c 望批评指正 0 Cmake的起源 为什么有CmakeLi
  • 2 如何给Gazebo中的仿真机械臂添加一个力传感器?

    1 你得有一个仿真机械臂 简单地说你首先的拥有一个能够在Gazebo当中使用的机械臂的URDF文件 xff0c 必须要包含visual collision和inertial三大标签 出于个人习惯 xff0c 这里直接使用UR官方提供的UR5
  • C#学习之事件的本质

    在注册事件时 xff0c 使用EventHandler委托 xff1b 摘要 表示将用于处理不具有事件数据的事件的方法 参数 sender 事件源 e 不包含事件数据的对象 public delegate void EventHandler

随机推荐