首页 > 其他分享 >004话题通信-API的使用

004话题通信-API的使用

时间:2024-06-21 16:31:02浏览次数:26  
标签:ROS 话题 argv API pub 004 msg ros 节点

目录

(一)常用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

标签:ROS,话题,argv,API,pub,004,msg,ros,节点
From: https://blog.csdn.net/2301_78461620/article/details/139841989

相关文章

  • flinksql API StreamTableEnvironment StreamStatementSet应用
    1.问题描述在应用flink实时消费kafka数据多端中,一般会使用flink原生的addsink或flinkSQL利用SqlDialect,比如消费kafka数据实时写入hive和kafka一般用两种方式:第一种方式是写入hive利用SqlDialect,写入kafka利用flink的旁路输出流+原生addSink第二种方式是写入hive和kafka都利用S......
  • SFF2004A-ASEMI无人机专用SFF2004A
    编辑:llSFF2004A-ASEMI无人机专用SFF2004A型号:SFF1006A品牌:ASEMI封装:ITO-220AC最大平均正向电流(IF):20A最大循环峰值反向电压(VRRM):400V最大正向电压(VF):0.95V~1.90V工作温度:-55°C~150°C反向恢复时间:35ns芯片个数:1芯片尺寸:72mil引脚数量:2正向浪涌电流(IFMS):200A包装方式:50/......
  • Node.js车牌识别、文档识别、OCR API-自动化录入信息
    为什么人工智能如此受关注?因为人工智能技术在图片处理以及在感知与认知等领域的不断突破,带来更高的效率。没错,智能机器人、人工智能技术衍生的产品已经开始替代人的工作。文字录入工作较为显著,OCR技术成为手动录入的杀手锏,图片识别、扫描识别多样化的解决方案层出不穷。......
  • Apifox详细使用教程
    一、Apifox简介Apifox是一款集成了API设计、开发、测试等多功能于一体的工具,它提供了API文档管理、API调试、APIMock、API自动化测试等功能。以下是一些关于Apifox使用的基本步骤和教程:我们在日常编程开发过程中经常实行的是前后端分离架构的模式,一个项目的落地会通过产品、......
  • Shopee虾皮API:获取商家店铺商品列表
    一、平台介绍Shopee,作为东南亚及中国台湾地区领先的电商平台,为卖家提供了一个便捷、高效的销售渠道。作为卖家,能够将自己的商品展示在Shopee平台上,并通过平台的流量和工具,将商品销售给更多的潜在买家。为了帮助卖家更好地管理自己的店铺和商品,Shopee提供了丰富的API接口服务......
  • Shopee API接口:获取搜索栏生成的商品结果列表
    一、平台介绍Shopee,作为东南亚领先的电商平台,一直致力于为卖家和买家提供便捷、高效的在线购物体验。为了满足广大开发者的需求,Shopee提供了丰富的API接口服务,帮助卖家和第三方开发者更好地与平台进行数据交互,实现业务的自动化和扩展。通过Shopee的API接口服务,可以轻松地获取......
  • Docker 部署 YApi 记录
    最近想在linux环境部署YApi对接口文档进行管理,只不过基于官方的部署方式,需要npm的配置,而且中间踩了很多坑比如YApi版本,Nodejs版本...... 想着还是使用Docker部署吧,找到了这位大佬的部署方式: https://www.jianshu.com/p/a97d2efb23c5基于大佬的配置,终于部署成功了......
  • apisix~为自定义插件设计一个configmap脚本
    configMapKubernetes中的ConfigMap是一种用来存储配置数据的API资源,它允许您将配置信息以键值对的形式保存,并在容器中使用这些配置信息。ConfigMap提供了一种将配置数据与应用程序解耦的方式,使得应用程序可以动态地获取配置而无需重新构建镜像。以下是ConfigMap的一些特......
  • RapidLayout:中英文版面分析推理库
    引言继上一篇文章之后,我这里想着将360发布的版面分析模型整合到现有的rapid_layout仓库中,便于大家快速使用。不曾想到,我这整理工作越做越多了,好在整体都是往更好方向走。起初,rapid_layout项目是在RapidStructure仓库下的。RapidStructure仓库包含三大块:文档方向分类、版面分析......
  • 【fastapi】定时任务管理
    在FastApi框架搭建的WBE系统中如何实现定时任务的管理?Python中常见的定时任务框架包括Celery、APScheduler和Huey。以下是每个框架的简单对比和示例代码。1.Celery:分布式任务队列,适合处理长时间运行的任务。#安装celery#pipinstallcelery#celery_task.pyfrom......