3 话题通信-API的使用

目录

(一)常用API

1 初始化

1.1 初始化函数(c++)

(1)函数一般表达式:

(2)使用

 (3)举例(c++)

案例1:argc与argv使用

要求

cmakelists.txt配置

代码

效果图

案例2:options的使用

要求

cmakelists.txt配置

代码

效果图

1.2 初始化函数(python)

(1)一般表达式

(2)使用

(3)举例

 案例1:argc与argv使用

要求

配置

代码

效果图

 案例2:options的使用

要求

配置

代码

效果图

2 话题与服务相关对象

2.1 基于(c++)

2.1.1 发布对象

(1)简介

(2)举例

案例1:有无latch

2.1.2 订阅对象

2.1.3 服务对象

2.1.4 客户端对象

2.2 基于python

2.2.1 发布对象

(1)一般形式

(2)举例

案例1:有无latch

3 回旋函数

3.1 基于C++

(1)spinonce()

(2)spin()

(3)比较

(4)举例

案例1:回旋函数spin()

案例2:回旋spinonce()

3.2 基于Python

4 时间

4.1 基于C++

(1)时刻

(2)持续时间

(3)持续时间与时刻运算

(4)设置运行频率

(5)定时器

(6)举例

案例1

4.2 基于python

(1)时刻

(2)持续时间

(3)持续时间与时刻运算

(4)置运行频率

(5)定时器

(6)举例

案例1

5 其他函数

5.1 基于C++

(1)节点状态判断

(2)节点关闭函数

(3)日志函数

(4)举例

案例1

5.2 基于python

(1)节点状态判断

(2)节点关闭函数

(3)日志函数

(4)举例

案例1


(一)常用API

1 初始化

1.1 初始化函数(c++)

(1)函数一般表达式:
 ros::init(argc,argv,"talker",ros::init_options::AnonymousName);

//void init(const M_string& remappings, const std::string& name, uint32_t options = 0);
/*
作用:ROS初始化函数

         参数:
            1.argc                  ---  封装实参个数(n+1)
            2.argv                  ---  封装参数的数组
            3.name               ---  为节点命名(唯一性)
            4.options           ---  节点启动选项

                返回值:void

*/
(2)使用
1. argc 与 argv 的使用
                如果按照ROS中的特定格式传入实参,那么ROS可以加以使用,比如设置全局参数,给节点命名
2. options 的使用
                节点命名要保证唯一,会导致一个问题:同一节点不能重复启动
           结果:ROS中当有重名节点启动时,之前的节点会被关闭
           需求:特定场景下,需要一个节点多次启动且能正常运行,怎么办?
           解法:设置启动项ros::init_options::AnonymousName
ros::init(argc,argv,"talker",ros::init_options::AnonymousName);
//当创建ROS节点时,会在用户自定义的节点名称后加随机数,从而避免重名问题
 (3)举例(c++)
案例1:argc与argv使用
要求

        按照ROS中的特定格式传入实参,设置全局参数,给节点命名

cmakelists.txt配置
  • cmakelists.txt配置
add_executable(demo01_api_pub src/demo01_api_pub.cpp)

target_link_libraries(demo01_api_pub
  ${catkin_LIBRARIES}
)
代码
#include "ros/ros.h"
#include "std_msgs/String.h" //普通文本类型的消息
#include <sstream>

int main(int argc, char  *argv[])
{   
    setlocale(LC_ALL,"");
    ros::init(argc,argv,"talker");    //实例化 ROS 句柄
    ros::NodeHandle nh;    //该类封装了 ROS 中的一些常用功能
    ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",10,true);
    std_msgs::String msg;
    // msg.data = "你好啊!!!";
    std::string msg_front = "Hello 你好!"; //消息前缀
    int count = 0;     //消息计数器
    ros::Rate r(10);    //逻辑(一秒10次)
    ros::Duration(3).sleep();        //设置循环,循环中发布数据

    while (ros::ok())        //节点不死
    {
       count++;
        std::stringstream ss;       //使用 stringstream 拼接字符串与编号
        ss << msg_front << count;
        msg.data = ss.str();

         if (count<=10)
         {
            pub.publish(msg);    //发布消息
            ROS_INFO("发送的消息:%s",msg.data.c_str());
        }
        r.sleep();
        ros::spinOnce();
    }
    return 0;
}

效果图

案例2:options的使用
要求

        按照ROS中的特定格式传入实参,设置全局参数,给节点命名,即可以重复调用同一个节点

cmakelists.txt配置
add_executable(demo01_api_pub src/demo01_api_pub.cpp)

target_link_libraries(demo01_api_pub
  ${catkin_LIBRARIES}
)
代码
#include "ros/ros.h"
#include "std_msgs/String.h" //普通文本类型的消息
#include <sstream>

int main(int argc, char  *argv[])
{   
    setlocale(LC_ALL,"");
    ros::init(argc,argv,"talker",ros::init_options::AnonymousName);    //实例化 ROS 句柄
    ros::NodeHandle nh;    //该类封装了 ROS 中的一些常用功能
    ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",10,true);
    std_msgs::String msg;
    // msg.data = "你好啊!!!";
    std::string msg_front = "Hello 你好!"; //消息前缀
    int count = 0;     //消息计数器
    ros::Rate r(10);    //逻辑(一秒10次)
    ros::Duration(3).sleep();        //设置循环,循环中发布数据

    while (ros::ok())        //节点不死
    {
       count++;
        std::stringstream ss;       //使用 stringstream 拼接字符串与编号
        ss << msg_front << count;
        msg.data = ss.str();

         if (count<=10)
         {
            pub.publish(msg);    //发布消息
            ROS_INFO("发送的消息:%s",msg.data.c_str());
        }
        r.sleep();
        ros::spinOnce();
    }
    return 0;
}

效果图

1.2 初始化函数(python)

(1)一般表达式
def init_node(name, argv=None, anonymous=False, log_level=None, disable_rostime=False, disable_rosout=False, disable_signals=False, xmlrpc_port=0, tcpros_port=0):            

作用:   ROS初始化
参数:
        name: 节点名称,必须保证节点名称唯一,节点名称中不能使用命名空间(不能包含 '/')
        argv=None       ---- 封装节点调用时传递参数
        anonymous=False    --- bool 可以为节点名称生成随即后缀,可以解决重名问题
            
  
    # rospy.init_node("api_listener_p",True)    //不可以简写
    rospy.init_node("api_listener_p",anonymous=True)
(2)使用
使用:
     1.argc使用
        可以按照ROS中指定的语法格式传参,ROS可以解析并加以使用
     2.anonymous使用
        可以设置值为True,节点名称可以后缀随机数
(3)举例
 案例1:argc与argv使用
要求

        按照ROS中的特定格式传入实参,设置全局参数,给节点命名

配置
  • cmakelists.txt配置
catkin_install_python(PROGRAMS
  scripts/demo01_api_pub_p.py
  DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
代码
#! /usr/bin/env python
# coding=UTF-8
 
import rospy
from std_msgs.msg import String

if __name__ == "__main__":
    rospy.init_node("api_listener_p")
    pub = rospy.Publisher("fang",String,queue_size=10)
    msg = String()  #创建 msg 对象
    msg_front = "hello"
    count = 0  #计数器 
    # 设置循环频率
    rate = rospy.Rate(1)
    while not rospy.is_shutdown():
        count += 1
        if count  <= 10:
            msg.data = msg_front + str(count)  #拼接字符串
            pub.publish(msg)
            rospy.loginfo("写出的数据:%s",msg.data)
        rate.sleep()
        
效果图

 案例2:options的使用
要求

        按照ROS中的特定格式传入实参,设置全局参数,给节点命名,即可以重复调用同一个节点

配置
  • cmakelists.txt配置
catkin_install_python(PROGRAMS
  scripts/demo01_api_pub_p.py
  DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
代码
#! /usr/bin/env python
# coding=UTF-8
 
import rospy
from std_msgs.msg import String

if __name__ == "__main__":
    rospy.init_node("api_listener_p",anonymous=True)
    pub = rospy.Publisher("fang",String,queue_size=10)
    msg = String()  #创建 msg 对象
    msg_front = "hello"
    count = 0  #计数器 
    # 设置循环频率
    rate = rospy.Rate(1)
    while not rospy.is_shutdown():
        count += 1
        if count  <= 10:
            msg.data = msg_front + str(count)  #拼接字符串
            pub.publish(msg)
            rospy.loginfo("写出的数据:%s",msg.data)
        rate.sleep()
        
效果图

2 话题与服务相关对象

2.1 基于(c++)

        在 roscpp 中,话题和服务的相关对象一般由 NodeHandle 创建。NodeHandle有一个重要作用是可以用于设置命名空间

2.1.1 发布对象
(1)简介
   
/*
作用:创建发布者对象

模板:被发布的消息的类型
参数:
    1.话题名称
    2.队列长度
    3.latch(可选)   如果设置为true,他会保存发布方的最后一道消息,并且新的订阅对象连接到发布方时,发布方会将这条信息发给订阅者
使用:
    1.latch 设置为true的作用?
以静态地图发布为例,
    方案1:可以使用固定频率发布地图数据,但是效率低
    方案2:可以将地图发表对象的latch设置为true,并且发布方只发送一次数据,每当订阅者连接时,将地图数据发送给订阅者(只发送一次)
   
*/

 ros::NodeHandle nh;//该类封装了 ROS 中的一些常用功能
 ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",10,true);
(2)举例
案例1:有无latch

要求

        查看有无latch情况

cmakelists.txt配置

add_executable(demo01_api_pub src/demo01_api_pub.cpp)
add_executable(demo01_api_sub src/demo01_api_sub.cpp)

target_link_libraries(demo01_api_pub
  ${catkin_LIBRARIES}
)

target_link_libraries(demo01_api_sub
  ${catkin_LIBRARIES}
)

发布方代码

#include "ros/ros.h"
#include "std_msgs/String.h" //普通文本类型的消息
#include <sstream>

int main(int argc, char  *argv[])
{   
    setlocale(LC_ALL,"");
    ros::init(argc,argv,"talker",ros::init_options::AnonymousName);    //实例化 ROS 句柄
    ros::NodeHandle nh;    //该类封装了 ROS 中的一些常用功能
    ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",10,true);//latch=true
    //ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",10,true);latch=false
    std_msgs::String msg;
    // msg.data = "你好啊!!!";
    std::string msg_front = "Hello 你好!"; //消息前缀
    int count = 0;     //消息计数器
    ros::Rate r(10);    //逻辑(一秒10次)
    ros::Duration(3).sleep();        //设置循环,循环中发布数据

    while (ros::ok())        //节点不死
    {
       count++;
        std::stringstream ss;       //使用 stringstream 拼接字符串与编号
        ss << msg_front << count;
        msg.data = ss.str();

         if (count<=10)
         {
            pub.publish(msg);    //发布消息
            ROS_INFO("发送的消息:%s",msg.data.c_str());
        }
        r.sleep();
        ros::spinOnce();
    }
    return 0;
}

订阅方代码

/*
    需求: 实现基本的话题通信,一方发布数据,一方接收数据,
         实现的关键点:
         1.发送方
         2.接收方
         3.数据(此处为普通文本)


    消息订阅方:
        订阅话题并打印接收到的消息

    实现流程:
        1.包含头文件 
        2.初始化 ROS 节点:命名(唯一)
        3.实例化 ROS 句柄
        4.实例化 订阅者 对象
        5.处理订阅的消息(回调函数)
        6.设置循环调用回调函数

*/
// 1.包含头文件 
#include "ros/ros.h"
#include "std_msgs/String.h"

void doMsg(const std_msgs::String::ConstPtr& msg_p){
    ROS_INFO("我听见:%s",msg_p->data.c_str());
    
    // ROS_INFO("我听见:%s",(*msg_p).data.c_str());
}
int main(int argc, char  *argv[])
{
    setlocale(LC_ALL,"");
    //2.初始化 ROS 节点:命名(唯一)
    ros::init(argc,argv,"listener");
    //3.实例化 ROS 句柄
    ros::NodeHandle nh;

    //4.实例化 订阅者 对象
    ros::Subscriber sub = nh.subscribe<std_msgs::String>("chatter",10,doMsg);
    //5.处理订阅的消息(回调函数)

    //     6.设置循环调用回调函数
    ros::spin();//循环读取接收的数据,并调用回调函数处理

    return 0;
}

效果图

发布方latch=true

发布方latch=false

2.1.2 订阅

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/744011.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

label studio数据标注平台的自动化标注使用

&#xff08;作者&#xff1a;陈玓玏&#xff09; 开源项目&#xff0c;欢迎star哦&#xff0c;https://github.com/tencentmusic/cube-studio 做图文音项目过程中&#xff0c;我们通常会需要进行数据标注。label studio是一个比较好上手的标注平台&#xff0c;可以直接搜…

【Unity小技巧】记一个RenderTexture无法正确输出Camera视图下的Depth渲染的问题

问题 这个问题出现在使用URP管线时&#xff0c;我试图用Shader实现血条的制作&#xff0c;并用RenderTexture将视图渲染到RawImage上。 但是渲染结果出现了问题&#xff1a; 可以看到液体边缘的渲染出现了错误&#xff0c;原因不明 在StackFlow上查找后找到了类似的问题&…

轻松掌握:工科生如何高效阅读国际期刊和撰写论文(上)

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三连支…

基于 MHA 的 MySQL 高可用主从架构

Author&#xff1a;Arsen Date&#xff1a;2024/06/25 目录 一、前言1.1 概述1.2 组件1.3 流程 二、环境三、部署3.1 基本环境3.1.1 hosts 配置3.1.2 配置 SSH 免密访问 3.2 MySQL 主从3.2.1 基础环境配置3.2.2 启动 MySQL 实例3.2.3 配置 MySQL 主从3.2.4 MySQL 主从同步验证 …

耐盐雾抗腐蚀航空插头插座

航空插头插座概述 耐盐雾720小时航空插头插座是一种专门设计用于抵抗盐雾侵蚀的航空用连接器&#xff0c;广泛应用于航空航天、海洋工程和其他需要高防护级别的领域。这类插头插座不仅具备一般的电气连接功能&#xff0c;还能在含盐较高的环境中长时间工作而不被腐蚀&#xff…

Linux 标准IO的fopen和fclose

getchar(),putchar() ‐‐‐‐ 一个字符 gets(buf),puts(buf) ‐‐‐‐ 一串字符 scanf(),printf() ‐‐‐‐ 一个字符&#xff0c;一串字符都可以 fopen函数的形式 FILE * fopen(constchar *path , cost char *mode) /* * description : 打开一个文件 * param ‐ path…

Prometheus:开源监控解决方案的力量

前言 在当今高度数字化和云原生应用的时代&#xff0c;监控系统是确保系统稳定性和性能的关键组成部分。而 Prometheus 作为一种开源的监控解决方案&#xff0c;正在成为越来越多企业和开发者的首选。本文将深入探讨 Prometheus 的特性、优势以及如何利用它来构建强大的监控系…

圈复杂度.

圈复杂度是衡量代码的重要标准 配置&#xff1a; eslint里面&#xff1a;rules&#xff1a;complexity&#xff1a;[error,10]

第28课 绘制原理图——绘制导线

概述 放置完元器件之后&#xff0c;接着就要用导线将元器件的管脚一个一个连起来了。 绘制导线的方法 点击快速工具条上的“线”命令&#xff0c;进入绘制导线的过程。 点击选择某个管脚或电源端口&#xff0c;作为导线的起始端。 再点击选择另一个管脚或电源端口&#xff0c…

为什么永远不会有语言取代 C/C++?

每个 CPU 都带有一种称为 ISA&#xff08;指令集架构&#xff09;汇编的电路语言。ISA 程序集是一种硬件语言&#xff0c;由基本数据操作、数学计算和结构化编程&#xff08;即 jmp&#xff09;的操作组成。但是&#xff0c;为每个计算需求编写汇编代码无疑是耗时的&#xff0c…

(六)使用统计学方法进行变量有效性测试(43道选择题)

本文整理了使用统计学方法进行变量有效性测试相关的练习题&#xff0c;共43道&#xff0c;适用于想巩固理论基础的同学。来源&#xff1a;如荷学数据科学题库&#xff08;CDA二级-第7章&#xff09;。 1&#xff09; 2&#xff09; 3&#xff09; 4&#xff09; 5&#xff09;…

pinia.js报patchToApply.hasOwnProperty is not a function

vue3 ts pinia.js 先看报错> patchToApply.hasOwnProperty is not a function 错误信息&#xff1a; pinia.js?v91704efd:913 Uncaught (in promise) TypeError: patchToApply.hasOwnProperty is not a functionat mergeReactiveObjects (pinia.js?v91704efd:913:23)…

YOLOv5改进(七)--改进损失函数EIoU、Alpha-IoU、SIoU、Focal-EIOU

文章目录 1、前言2、损失函数代码实现2.1、修改metrics.py2.2、修改loss.py 3、替换EIOU4、替换SIoU5、替换Alpha-IoU6、替换Focal-EIOU7、目标检测系列文章 1、前言 YOLOv5默认使用损失函数为CIoU&#xff0c;本文主要针对损失函数进行修改&#xff0c;主要将bbox_iou函数进行…

昇思25天学习打卡营第2天|onereal》

今天学习内容是了解华为昇思平台。虽然打了卡&#xff0c;但是我的jupyter里面并没有播放按钮&#xff0c;所以还是无法运行代码。反映给昇思吴彦祖小哥了&#xff0c;他说需要专家帮我解决。 我还是要自我表扬一下&#xff0c;不懂就问&#xff0c;切莫不懂装懂&#xff0c;那…

充电宝哪个牌子最好最耐用?耐用西圣、罗马仕、绿联充电宝实测

目前充电宝是我们出行必备的“能量伴侣”。然而&#xff0c;市面上充电宝品牌繁多&#xff0c;让人眼花缭乱&#xff0c;究竟哪个牌子最好最耐用呢&#xff1f;为了给大家找到答案&#xff0c;我们精心挑选了西圣、罗马仕和绿联这三个备受关注的品牌&#xff0c;并对它们的充电…

clion调试opencv程序时,查看内存中图像的方法

很久之前在windows上使用 visual studio中 Image Watch插件查看内存中图像感觉很方便&#xff0c;后来转到liunx上开发后&#xff0c;在clion上一直没有找到对应的插件。之前看到过qtOpenImageDebugger好像有类似功能&#xff0c;vs code好像也可以&#xff0c;但是没有配置。 …

文华6幅图指标公式大全-多空精准买卖点提示指标源码

文华6幅图指标公式大全-多空精准买卖点提示指标源码&#xff1a; HH: HHV ( HIGH ,1)/5 HHV ( HIGH ,2)/5 HHV ( HIGH ,2)/5 HHV ( HIGH ,5)/5 HHV ( HIGH ,8)/5; LL: LLV ( LOW ,1)/5 LLV ( LOW ,2)/5 LLV ( LOW ,2)/5 LLV ( LOW ,5)/5 LLV ( LOW ,8)/5; H1: IFELSE ( H &l…

18.枚举

学习知识&#xff1a;枚举类型、相关的使用方法 Main.java&#xff1a; public class Main {public static void main(String[] args) {myenum[] colorlist myenum.values();//获取枚举中所有对象的引用数组for (myenum one : colorlist){System.out.println(one.toString(…

git提交新仓库代码,提示无权限,但用户名已修改

目录 1 用户名无权限 2 删除用户凭据 2.1 打开控制面板 2.2 找到“凭据管理器” 2.3 删除git历史 3 npm工具库添加git仓库指引 1 用户名无权限 之前因为时间的原因&#xff0c;js-tool-big-box工具库没有提交到github上去&#xff0c;今天想着往上提交一下&#xff0c;但…

如何打造安全DNS以保障业务可用?一文解读

DNS自1987年被实施以来&#xff0c;已成为网络通信中最重要的核心基础设施&#xff0c;同时也是企业对外提供数字服务的关键。没有正常安全的DNS服务&#xff0c;企业经营也就无从谈起。在DNS攻击逐年上升且容易被忽略的现代应用时代&#xff0c;如何打造安全DNS&#xff1f;本…