3 话题通信-API的使用

news2024/10/5 17:24:44

目录

(一)常用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.coloradmin.cn/o/1859797.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何绘制网络安全运营的“谷歌地图”?

正如Google Maps&#xff08;谷歌地图&#xff09;彻底改变了驾车出行时的导航模式一样&#xff0c;通过流程映射绘制一张指导网络安全运营的“电子地图”&#xff0c;可以彻底改变组织理解和管理网络安全运营工作的方式。 现代企业网络安全运营的核心并不是部署防火墙和杀毒软…

如何系统学习机器学习?

我不是计算机专业&#xff0c;第一次接触机器学习还是在研一的时候&#xff0c;当时是看到机器学习可以做号码识别&#xff0c;就觉得好厉害&#xff0c;想学这个。 首次了解到Python这门语言&#xff0c;知道了机器学习可以做什么后&#xff0c;就感觉打开了新世界一样。再后来…

数据质量管理-准确性管理

前情提要 根据GB/T 36344-2018《信息技术 数据质量评价指标》的标准文档&#xff0c;当前数据质量评价指标框架中包含6评价指标&#xff0c;在实际的数据治理过程中&#xff0c;存在一个关联性指标。7个指标中存在4个定性指标&#xff0c;3个定量指标&#xff1b; 定性指标&am…

IT入门知识第六部分《后端开发》(6/10)

目录 后端开发&#xff1a;构建强大的服务端逻辑 1.引言 2.后端技术概述 2.1 数据库 2.2 服务器 2.3 API 2.4 安全性 3.服务器和API 3.1 服务器的作用 3.2 API的作用 4.后端框架 4.1 Node.js 4.1.1 特点 4.1.2 用途 4.1.3 代码案例分析 4.2 Django 4.2.1 特点 …

《Redis设计与实现》阅读总结-1

第 2 章 简单动态字符串&#xff08;SDS&#xff09; 1. Redis使用自己构建一种名为简单动态字符串&#xff08;simple dynamic string ,SDS&#xff09;的抽象类型&#xff0c;作为Redis的默认字符串。 2. SDS的结构&#xff1a; free属性&#xff1a;表示这个SDS没有分配任何…

【SQL Server数据库】熟悉DBMS的基本操作及数据库的创建

目录 一、SQL SERVER基本操作 二、用Management Studio创建数据库 1、使用Management Studio创建数据库bookdb&#xff0c;各项参数采用默认设置。 2、使用Management Studio创建数据库EDUC 3. 在EDUC中创建三个表&#xff0c;根据下面要求创建Student&#xff0c;Course&am…

C语言 | Leetcode C语言题解之第190题颠倒二进制位

题目&#xff1a; 题解&#xff1a; const uint32_t M1 0x55555555; // 01010101010101010101010101010101 const uint32_t M2 0x33333333; // 00110011001100110011001100110011 const uint32_t M4 0x0f0f0f0f; // 00001111000011110000111100001111 const uint32_t M8…

django学习入门系列之第三点《小米商城头标总结》

文章目录 总结往期回顾 总结 body标签&#xff0c;默认有一个边框&#xff0c;造成页面四边都有白色的间距&#xff0c;那该如何去除呢? body{margin: 0; }文本居中 文本水平居中&#xff0c;文本会在这个区域中居中text-align作为HTML元素属性其主要是用来文本水平居中的。 &…

一键模板生成视频解决方案,海量模板,满足多样需求

视频已经成为企业营销、宣传、培训的重要手段&#xff0c;高昂的制作成本、复杂的技术门槛以及繁琐的制作流程&#xff0c;往往让许多企业望而却步。美摄科技凭借其深厚的技术积累和创新能力&#xff0c;推出了面向企业的智能一键模板生成视频解决方案&#xff0c;为企业视频制…

电梯开关状态人员进出检测数据集VOC+YOLO格式2220张4类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2220 标注数量(xml文件个数)&#xff1a;2220 标注数量(txt文件个数)&#xff1a;2220 标注…

50KW-2500KW水冷式负载组概述

对于需要“针落”安静操作的环境&#xff0c;EAK 负载组为传统风冷装置提供了极具吸引力的替代方案。 该系列负载组是水冷的&#xff0c;允许在受控环境中进行室内安装&#xff0c;而不是在室外安装&#xff0c;因为室外设备暴露在元素中。除了完全相当之外&#xff0c;还非常紧…

Github2024-06-25 Python开源项目日报 Top10

根据Github Trendings的统计,今日(2024-06-25统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10TypeScript项目1系统设计指南 创建周期:2507 天开发语言:Python协议类型:OtherStar数量:241693 个Fork数量:42010 次关注人数…

图解布隆过滤器(Bloom Filter)

布隆过滤器详解 布隆过滤器&#xff08;Bloom Filter&#xff09;是一种空间效率非常高的随机数据结构&#xff0c;由布隆&#xff08;Burton Howard Bloom&#xff09;在1970年提出&#xff0c;用于检验一个元素是否属于一个集合。 具体来说&#xff0c;它可能会错误地认为一个…

2024CICE电博会·以“链主”企业为核心,推动产业链协同发展

随着全球科技日新月异的发展&#xff0c;消费电子产业已成为推动经济增长、改善人民生活的重要力量。中国国际消费电子博览会&#xff08;简称CICE电博会&#xff09;自2001年创办以来&#xff0c;已经走过了二十余个春秋&#xff0c;凭借其独特的地理位置优势、专业的组织策划…

MYSQL九、MYSQL的视图的认识

视图 视图&#xff08;View&#xff09;是一种虚拟存在的表。视图中的数据并不在数据库中实际存在。行和列数据来自定义视图的查询中使用的表&#xff0c;并且是在使用视图时动态生成的。 视图只保存了查询的SQL逻辑&#xff0c;不保存查询结果。在创建视图的时候&#xff0c;…

Delphi-2M:基于病史预测未来健康的改进GPT架构

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

一份日本 AWS Summit 的前线快报

5月底刚参加完 AWS 中国 Summit「这次的上海 AWS Summit 好玩的有点过分」&#xff0c;后来网翻官不经意间看到 6 月 AWS 还会在日本举办一场 Summit。正好最近公司也签下了几个日本客户&#xff0c;眼看着 5 年签证也即将到期&#xff0c;于是心一横&#xff0c;决定东渡扶桑。…

快速上手 Spring Boot:基础使用详解

快速上手 Spring Boot&#xff1a;基础使用详解 文章目录 快速上手 Spring Boot&#xff1a;基础使用详解1、什么是SpringBoot2、Springboot快速入门搭建3、SpringBoot起步依赖4、SpringBoot自动配置&#xff1a;以tomcat启动为例5、SpringBoot基础配置6、yaml7、多环境开发配置…

移动硬盘恢复数据要多久 4T移动硬盘数据恢复一般多少钱

在日常工作中&#xff0c;移动硬盘是非常实用的一种数据文件存储设备&#xff0c;在大数据存储上是有极强的优势的&#xff0c;不过移动硬盘有时候也会出现数据丢失的情况。接下来给大家详细讲解&#xff0c;移动硬盘恢复数据要多久&#xff0c;以及4T移动硬盘数据恢复一般多少…

当你在浏览器输入一个地址

你在浏览器中输出了一个地址&#xff0c;回车后&#xff0c;一直到显示页面&#xff0c;中间经历了哪些过程 &#xff1f; 1. 用户输入 URL 并按下回车 用户在浏览器的地址栏中输入一个 URL&#xff08;例如 http://example.com&#xff09;并按下回车键。 2. DNS 解析 浏览…