首页 > 其他分享 >【ROS教程】ROS常用API讲解

【ROS教程】ROS常用API讲解

时间:2024-08-27 13:15:00浏览次数:10  
标签:std 教程 ros const string void API ROS NodeHandle

@

目录


1.节点初始化

ROSCPP_DECL void init(int &argc, char **argv, const std::string& name, uint32_t options = 0);
ROSCPP_DECL void init(const M_string& remappings, const std::string& name, uint32_t options = 0);
ROSCPP_DECL void init(const VP_string& remapping_args, const std::string& name, uint32_t options = 0);
  • 这里讲解第一种初始化方式
参数 含义
argc main函数的第一个参数
argv main函数的第二个参数
name 节点的名字,必须是唯一的

2.话题通信

2.1 创建发布者对象

template <class M>
Publisher NodeHandle::advertise(const std::string& topic, uint32_t queue_size, bool latch = false);
  
template <class M>
Publisher NodeHandle::advertise(const std::string& topic, uint32_t queue_size,
                        const SubscriberStatusCallback& connect_cb,
                        const SubscriberStatusCallback& disconnect_cb = SubscriberStatusCallback(),
                        const VoidConstPtr& tracked_object = VoidConstPtr(),
                        bool latch = false);
  • 这里讲解第一种构造方式
参数 含义
topic 话题的名字,必须是唯一的
queue_size 等待发送给订阅者的最大消息数量
latch 如果为 true,该话题发布的最后一条消息将被保存,并且后期当有订阅者连接时会将该消息发送给订阅者

2.2 消息发布

template <typename M>
      void Publisher::publish(const M& message) const;
参数 含义
message 被组织的消息

2.3 创建订阅者对象

template<class M>
Subscriber NodeHandle::subscribe(const std::string& topic, uint32_t queue_size, void(*fp)(const boost::shared_ptr<M const>&), const TransportHints& transport_hints = TransportHints());

template<class M>
Subscriber NodeHandle::subscribe(const std::string& topic, uint32_t queue_size, const boost::function<void (const boost::shared_ptr<M const>&)>& callback,
                         const VoidConstPtr& tracked_object = VoidConstPtr(), const TransportHints& transport_hints = TransportHints());
参数 含义
topic 话题的名字,必须是唯一的
queue_size main函数的第二个参数
fp 回调函数的函数指针
return 调用成功时,返回一个订阅者对象,失败时,返回空对象

3.服务通信

3.1 创建服务对象

  template<class T, class MReq, class MRes>
  ServiceServer NodeHandle::advertiseService(const std::string& service, bool(T::*srv_func)(MReq &, MRes &), T *obj);
  
  template<class T, class MReq, class MRes>
  ServiceServer NodeHandle::advertiseService(const std::string& service, bool(T::*srv_func)(ServiceEvent<MReq, MRes>&), T *obj);

  template<class T, class MReq, class MRes>
  ServiceServer NodeHandle::advertiseService(const std::string& service, bool(T::*srv_func)(MReq &, MRes &), const boost::shared_ptr<T>& obj);

  template<class T, class MReq, class MRes>
  ServiceServer NodeHandle::advertiseService(const std::string& service, bool(T::*srv_func)(ServiceEvent<MReq, MRes>&), const boost::shared_ptr<T>& obj);

  template<class MReq, class MRes>
  ServiceServer NodeHandle::advertiseService(const std::string& service, bool(*srv_func)(MReq&, MRes&));

  template<class MReq, class MRes>
  ServiceServer NodeHandle::advertiseService(const std::string& service, bool(*srv_func)(ServiceEvent<MReq, MRes>&));
  
  template<class MReq, class MRes>
  ServiceServer NodeHandle::advertiseService(const std::string& service, const boost::function<bool(MReq&, MRes&)>& callback, 
                                 const VoidConstPtr& tracked_object = VoidConstPtr());

  template<class S>
  ServiceServer NodeHandle::advertiseService(const std::string& service, const boost::function<bool(S&)>& callback, 
                                 const VoidConstPtr& tracked_object = VoidConstPtr());
参数 含义
service 服务名称,必须是唯一的
srv_func 接收到请求时,需要处理请求的回调函数
return 请求成功时返回服务对象,否则返回空对象

3.2 创建客户对象

  template<class MReq, class MRes>
  ServiceClient NodeHandle::serviceClient(const std::string& service_name, bool persistent = false, 
                              const M_string& header_values = M_string());
  template<class Service>
  ServiceClient NodeHandle::serviceClient(const std::string& service_name, bool persistent = false, 
                              const M_string& header_values = M_string());
                            
参数 含义
service_name 服务名称,必须是唯一的

3.3 客户发送请求

  template<class Service>
  bool ServiceClient::call(Service& service);
参数 含义
service .srv文件定义的服务类型

3.4 客户对象等待服务

ROSCPP_DECL bool service::waitForService(const std::string& service_name, int32_t timeout);
ROSCPP_DECL bool service::waitForService(const std::string& service_name, ros::Duration timeout = ros::Duration(-1));
参数 含义
service_name 被等待的服务名称,必须是唯一的
timeout 等待最大时常,默认为 -1,可以永久等待直至节点关闭
return 成功返回 true,否则返回 false

4. 回旋函数

  • 简而言之,用到回调函数,就要用回旋函数处理

4.1 spin

/** 
 * \brief 进入循环处理回调 
 */
ROSCPP_DECL void spin();

4.2 spinOnce

/**
 * \brief 处理一轮回调
 *
 * 一般应用场景:
 *     在循环体内,处理所有可用的回调函数
 * 
 */
ROSCPP_DECL void spinOnce();

5.时间

5.1 时刻

5.1.1 获取当前时刻

ros::init(argc,argv,"hello_time");
ros::NodeHandle nh;//必须创建句柄,否则时间没有初始化,导致后续API调用失败
ros::Time right_now = ros::Time::now();//将当前时刻封装成对象
ROS_INFO("当前时刻:%.2f",right_now.toSec());//获取距离 1970年01月01日 00:00:00 的秒数
ROS_INFO("当前时刻:%d",right_now.sec);//获取距离 1970年01月01日 00:00:00 的秒数

5.1.2 设置时刻

ros::init(argc,argv,"hello_time");
ros::NodeHandle nh;//必须创建句柄,否则时间没有初始化,导致后续API调用失败
ros::Time someTime(100,100000000);// 参数1:秒数  参数2:纳秒
ROS_INFO("时刻:%.2f",someTime.toSec()); //100.10
ros::Time someTime2(100.3);//直接传入 double 类型的秒数
ROS_INFO("时刻:%.2f",someTime2.toSec()); //100.30

5.2 时间间隔

5.2.1 设置时间间隔

ros::init(argc,argv,"hello_time");
ros::NodeHandle nh;//必须创建句柄,否则时间没有初始化,导致后续API调用失败
ros::Duration du(10);//持续10秒钟,参数是double类型的,以秒为单位
ROS_INFO("持续时间:%.2f",du.toSec());//将持续时间换算成秒

5.2.2 进行休眠

ros::init(argc,argv,"hello_time");
ros::NodeHandle nh;//必须创建句柄,否则时间没有初始化,导致后续API调用失败
ros::Duration du(10);//持续10秒钟,参数是double类型的,以秒为单位
du.sleep();//按照指定的持续时间休眠

5.3 设置运行频率

Rate::Rate(double frequency);
参数 含义
frequency 运行频率

6.参数设置

6.1 修改或新增参数

  void NodeHandle::setParam(const std::string& key, const XmlRpc::XmlRpcValue& v) const;
  void NodeHandle::setParam(const std::string& key, const std::string& s) const;
  void NodeHandle::setParam(const std::string& key, const char* s) const;
  void NodeHandle::setParam(const std::string& key, double d) const;
  void NodeHandle::setParam(const std::string& key, int i) const;
  void NodeHandle::setParam(const std::string& key, bool b) const;
  void NodeHandle::setParam(const std::string& key, const std::vector<std::string>& vec) const;
  void NodeHandle::setParam(const std::string& key, const std::vector<double>& vec) const;
  void NodeHandle::setParam(const std::string& key, const std::vector<float>& vec) const;
  void NodeHandle::setParam(const std::string& key, const std::vector<int>& vec) const;
  void NodeHandle::setParam(const std::string& key, const std::vector<bool>& vec) const;
  void NodeHandle::setParam(const std::string& key, const std::map<std::string, std::string>& map) const;
  void NodeHandle::setParam(const std::string& key, const std::map<std::string, double>& map) const;
  void NodeHandle::setParam(const std::string& key, const std::map<std::string, float>& map) const;
  void NodeHandle::setParam(const std::string& key, const std::map<std::string, int>& map) const;
  void NodeHandle::setParam(const std::string& key, const std::map<std::string, bool>& map) const;
  • ROS提供了16种可以设置的参数类型,如上。
  • 使用 ros::param::set有完全相同的效果

6.2 获取参数

/*
    参数服务器操作之查询_C++实现:
    在 roscpp 中提供了两套 API 实现参数操作
  
    ros::NodeHandle::param(键,默认值) 
            存在,返回对应结果,否则返回默认值

    ros::NodeHandle::getParam(键,存储结果的变量)
            存在,返回 true,且将值赋值给参数2
            若果键不存在,那么返回值为 false,且不为参数2赋值

    ros::NodeHandle::getParamCached(键,存储结果的变量)--提高变量获取效率
            存在,返回 true,且将值赋值给参数2
            若果键不存在,那么返回值为 false,且不为参数2赋值

    ros::NodeHandle::getParamNames(std::vector<std::string>)
            获取所有的键,并存储在参数 vector 中 

    ros::NodeHandle::hasParam(键)
            是否包含某个键,存在返回 true,否则返回 false

    ros::NodeHandle::searchParam(参数1,参数2)
            搜索键,参数1是被搜索的键,参数2存储搜索结果的变量

    ros::param ----- 与 NodeHandle 类似
*/

6.3 删除参数

/* 
    参数服务器操作之删除_C++实现:

    ros::NodeHandle::deleteParam("键")
        根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 false

    ros::param::del("键")
        根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 false
*/

本文由博客一文多发平台 OpenWrite 发布!

标签:std,教程,ros,const,string,void,API,ROS,NodeHandle
From: https://www.cnblogs.com/UnderTurrets/p/18382507

相关文章

  • Adobe InCopy(IC)文字处理软件win/mac软件下载安装 系统要求和使用教程
    目录一、AdobeIC软件介绍1.1软件概述1.2软件特点1.3适用范围二、系统要求2.1Windows系统要求2.2macOS系统要求三、安装步骤3.1Windows系统安装步骤3.2macOS系统安装步骤四、使用教程4.1基本操作4.2高级功能4.3注意事项一、AdobeIC软件介绍1.1软......
  • c++教程之三大结构
    C++顺序结构教程在编程的世界里,顺序结构是构建所有程序的基础。无论是简单的脚本还是复杂的应用程序,它们都是由一系列按照特定顺序执行的指令组成的。C++,作为一种高效、灵活的编程语言,同样遵循这一原则。本教程将深入介绍C++中的顺序结构,包括变量与数据类型、运算符与表达式、......
  • AI工业ros机械臂
    1、基本介绍该产品是一款面向于人工智能、机器人工程等专业的实验平台,能够学习基于人工智能技术的智能机器臂相关知识。主要由工业六轴机械臂、机械臂控制器、边缘计算主机、安全防护工作台四部分构成。该产品可完成的课程:机器视觉、机器人操作系统ROS等,同时也能够完成智能机......
  • Java中的API网关:Spring Cloud Gateway与Zuul
    在微服务架构中,API网关扮演着至关重要的角色。它作为系统的入口,负责请求的路由、负载均衡、认证授权、限流熔断等功能。本文将深入探讨两个流行的JavaAPI网关解决方案:SpringCloudGateway和NetflixZuul,并通过详细的解释和代码示例展示它们的使用方法和优缺点。1.API网关概......
  • OUC 2024夏 移动软件开发 实验四:媒体API之口述校史
    一、实验准备课程主页:课程主页(gitee.com)实验文档:lab4文档实验视频:lab4视频二、实验目标1、掌握视频API的操作方法;2、掌握如何发送随机颜色的弹幕。三、实验步骤1、项目创建和页面配置基本流程见前两个lab,在此不再赘述。2、导航栏设计编写App.js:{"pages":[......
  • 在Windows上搭建自己的Git服务器的图文教程
    一、简介以前,在别家的公司,一般早就把源代码管理工具搭建好了,很少有机会自己搭建一套。最近,公司也许要把现在不少的源码进行管理,于是我打算自己搭建源代码管理服务器。说起源代码管理,当然有很多中解决方案,我个人偏向搭建一个Git服务器。毕竟这个自己用的比较多,也熟悉。而且,现在......
  • OOTD一键换衣(环境部署保姆级教学,包括完整fastapi访问换衣代码)
    替换裤子图:  "OOTD一键换衣"是指使用人工智能(AI)技术,特别是计算机视觉和深度学习技术,来自动更换人物照片中的服装的技术或应用。这种技术允许用户上传一张人物照片,并且通过AI算法替换照片中人物的服装,以达到试穿不同服饰的效果而无需真实更换服装。这种技术在电子商务、虚......
  • (五)焊缝检测之--测量间距并用ROS消息包发送
    前言在上一小节记录了矩形参照物的检测。这一小节将介绍基于识别到的圆形焊缝和矩形参照物的坐标,读出两点之间在x和y方向上的间距,并通过话题通信的方式发送初期一、测量圆心和焊缝间距在之前小节中已经分别通过霍夫圆检测拿到了圆心坐标和矩形参照物角点坐标,分别将其记......
  • Microsoft Word使用公式字体Latin Modern Math时导出pdf显示异常
    MicrosoftWord使用公式字体LatinModernMath时导出pdf显示异常参考资料1问题描述将Word公式字体修改为LatinModernMath,另存为pdf,导出的pdf文件中公式字体为位图而非矢量图,且部分符号可能缺失。2问题原因安装的字体LatinModernMath为otf文件而非ttf文件,Word无法将字体......
  • Adobe Lightroom Classic LRC v13.5 下载及安装教程 (图像后期处理软件)
    前言AdobeLightroomClassic为您提供强大的一键式工具和高级控件,使您的照片看起来很棒。轻松整理桌面上的所有照片,并以多种方式共享。使用LightroomClassic,您需要具备所有桌面编辑工具,才能充分发挥照片的作用。增强色彩,使沉闷的镜头充满活力,去除分散注意力的物体,并拉直歪斜的镜......