ROS:API操作

news/2024/11/29 3:39:47/

目录

  • 一、初始化
    • 1.1C++版
    • 1.2Python版
  • 二、话题与服务相关对象
    • 2.1发布对象
      • 2.1.1C++版
    • 2.2订阅对象
      • 2.2.1C++版
    • 2.3服务对象
      • 2.3.1C++版
    • 2.4客户端对象
      • 2.4.1C++版
  • 三、回旋函数
    • 3.1C++版
      • 3.1.1spinOnce()
      • 3.1.2spin()
      • 3.1.3二者比较
  • 四、时间
    • 4.1C++版
  • 五、其它函数
      • 5.1C++版

一、初始化

1.1C++版

/** 该函数可以解析并使用节点启动时传入的参数(通过参数设置节点名称、命名空间...) * 该函数有多个重载版本,如果使用NodeHandle建议调用该版本。 * \param argc 参数个数* \param argv 参数列表* \param name 节点名称,需要保证其唯一性,不允许包含命名空间* \param options 节点启动选项,被封装进了ros::init_options*/
void init(int &argc, char **argv, const std::string& name, uint32_t options = 0);

1.2Python版

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 msater中注册节点@param name: 节点名称,必须保证节点名称唯一,节点名称中不能使用命名空间(不能包含 '/')@type  name: str@param anonymous: 取值为 true 时,为节点名称后缀随机编号@type anonymous: bool"""

二、话题与服务相关对象

2.1发布对象

2.1.1C++版

对象获取

/**
* \brief 根据话题生成发布对象
*
* 在 ROS master 注册并返回一个发布者对象,该对象可以发布消息
*
* 使用示例如下:
*
*   ros::Publisher pub = handle.advertise<std_msgs::Empty>("my_topic", 1);
*
* \param topic 发布消息使用的话题
*
* \param queue_size 等待发送给订阅者的最大消息数量
*
* \param latch (optional) 如果为 true,该话题发布的最后一条消息将被保存,并且后期当有订阅者连接时会将该消息发送给订阅者
*
* \return 调用成功时,会返回一个发布对象
*
*
*/
template <class M>
Publisher advertise(const std::string& topic, uint32_t queue_size, bool latch = false)

消息发布函数:

/**
* 发布消息          
*/
template <typename M>
void publish(const M& message) const

2.2订阅对象

2.2.1C++版

对象获取:

/*** \brief 生成某个话题的订阅对象** 该函数将根据给定的话题在ROS master 注册,并自动连接相同主题的发布方,每接收到一条消息,都会调用回调* 函数,并且传入该消息的共享指针,该消息不能被修改,因为可能其他订阅对象也会使用该消息。* * 使用示例如下:void callback(const std_msgs::Empty::ConstPtr& message)
{
}ros::Subscriber sub = handle.subscribe("my_topic", 1, callback);*
* \param M [template] M 是指消息类型
* \param topic 订阅的话题
* \param queue_size 消息队列长度,超出长度时,头部的消息将被弃用
* \param fp 当订阅到一条消息时,需要执行的回调函数
* \return 调用成功时,返回一个订阅者对象,失败时,返回空对象
* void callback(const std_msgs::Empty::ConstPtr& message){...}
ros::NodeHandle nodeHandle;
ros::Subscriber sub = nodeHandle.subscribe("my_topic", 1, callback);
if (sub) // Enter if subscriber is valid
{
...
}*/
template<class M>
Subscriber subscribe(const std::string& topic, uint32_t queue_size, void(*fp)(const boost::shared_ptr<M const>&), const TransportHints& transport_hints = TransportHints())

2.3服务对象

2.3.1C++版

对象获取:

/**
* \brief 生成服务端对象
*
* 该函数可以连接到 ROS master,并提供一个具有给定名称的服务对象。
*
* 使用示例如下:
\verbatim
bool callback(std_srvs::Empty& request, std_srvs::Empty& response)
{
return true;
}ros::ServiceServer service = handle.advertiseService("my_service", callback);
\endverbatim
*
* \param service 服务的主题名称
* \param srv_func 接收到请求时,需要处理请求的回调函数
* \return 请求成功时返回服务对象,否则返回空对象:
\verbatim
bool Foo::callback(std_srvs::Empty& request, std_srvs::Empty& response)
{
return true;
}
ros::NodeHandle nodeHandle;
Foo foo_object;
ros::ServiceServer service = nodeHandle.advertiseService("my_service", callback);
if (service) // Enter if advertised service is valid
{
...
}
\endverbatim*/
template<class MReq, class MRes>
ServiceServer advertiseService(const std::string& service, bool(*srv_func)(MReq&, MRes&))

2.4客户端对象

2.4.1C++版

对象获取:

/** * @brief 创建一个服务客户端对象** 当清除最后一个连接的引用句柄时,连接将被关闭。** @param service_name 服务主题名称*/template<class Service>ServiceClient serviceClient(const std::string& service_name, bool persistent = false, const M_string& header_values = M_string())

请求发送函数:

/*** @brief 发送请求* 返回值为 bool 类型,true,请求处理成功,false,处理失败。*/template<class Service>bool call(Service& service)

等待服务函数1:

/*** ros::service::waitForService("addInts");* \brief 等待服务可用,否则一致处于阻塞状态* \param service_name 被"等待"的服务的话题名称* \param timeout 等待最大时常,默认为 -1,可以永久等待直至节点关闭* \return 成功返回 true,否则返回 false。*/
ROSCPP_DECL bool waitForService(const std::string& service_name, ros::Duration timeout = ros::Duration(-1));

等待服务函数2:

/**
* client.waitForExistence();
* \brief 等待服务可用,否则一致处于阻塞状态
* \param timeout 等待最大时常,默认为 -1,可以永久等待直至节点关闭
* \return 成功返回 true,否则返回 false。
*/
bool waitForExistence(ros::Duration timeout = ros::Duration(-1));

三、回旋函数

3.1C++版

在ROS程序中,频繁的使用了 ros::spin() 和 ros::spinOnce() 两个回旋函数,可以用于处理回调函数。

3.1.1spinOnce()

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

3.1.2spin()

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

3.1.3二者比较

相同点:二者都用于处理回调函数;

不同点:ros::spin() 是进入了循环执行回调函数,而 ros::spinOnce() 只会执行一次回调函数(没有循环),在 ros::spin() 后的语句不会执行到,而 ros::spinOnce() 后的语句可以执行。

四、时间

4.1C++版

时刻、持续时间、持续时间与时刻运算、定时器

#include "ros/ros.h"/*
演示时间相关的操作,获取当前时刻+设置指定时刻
实现1.准备:头文件、初始化、句柄创建2.获取当前时刻3.设置指定时刻
*/void doSomeThing(const ros::TimerEvent &event){ROS_INFO("-------------");ROS_INFO("event:%s",std::to_string(event.current_real.toSec()).c_str());
}int main(int argc, char *argv[])
{//1.准备ros::init(argc,argv,"hello_time");ros::NodeHandle nh;//2.获取当前时刻//now函数将当前时间封装并返回//当前时刻:被调用执行那一刻//参考系:1970年1月1日0点0分0秒ros::Time right_now=ros::Time::now();ROS_INFO("当前时刻:%.2f",right_now.toSec());ROS_INFO("当前时刻:%d",right_now.sec);//设置指定时刻ros::Time t1(20,312345678);ROS_INFO("t1=%.2f",t1.toSec());//持续时间ros::Duration du(10);//持续10秒钟,参数是double类型的,以秒为单位du.sleep();//按照指定的持续时间休眠ROS_INFO("持续时间:%.2f",du.toSec());//将持续时间换算成秒ROS_INFO("当前时刻:%.2f",ros::Time::now().toSec());//持续时间与时刻运算ROS_INFO("时间运算");ros::Time now = ros::Time::now();ros::Duration du1(10);ros::Duration du2(20);ROS_INFO("当前时刻:%.2f",now.toSec());//1.time 与 duration 运算ros::Time after_now = now + du1;ros::Time before_now = now - du1;ROS_INFO("当前时刻之后:%.2f",after_now.toSec());ROS_INFO("当前时刻之前:%.2f",before_now.toSec());//2.duration 之间相互运算ros::Duration du3 = du1 + du2;ros::Duration du4 = du1 - du2;ROS_INFO("du3 = %.2f",du3.toSec());ROS_INFO("du4 = %.2f",du4.toSec());//PS: time 与 time 不可以运算// ros::Time nn = now + before_now;//异常// ROS 定时器/*** \brief 创建一个定时器,按照指定频率调用回调函数。** \param period 时间间隔* \param callback 回调函数* \param oneshot 如果设置为 true,只执行一次回调函数,设置为 false,就循环执行。* \param autostart 如果为true,返回已经启动的定时器,设置为 false,需要手动启动。*///Timer createTimer(Duration period, const TimerCallback& callback, bool oneshot = false,//                bool autostart = true) const;// ros::Timer timer = nh.createTimer(ros::Duration(0.5),doSomeThing);ros::Timer timer = nh.createTimer(ros::Duration(0.5),doSomeThing,true);//只执行一次// ros::Timer timer = nh.createTimer(ros::Duration(0.5),doSomeThing,false,false);//需要手动启动// timer.start();ros::spin(); //必须 spinreturn 0;
}

设置运行频率

ros::Rate rate(1);//指定频率
while (true)
{ROS_INFO("-----------code----------");rate.sleep();//休眠,休眠时间 = 1 / 频率。
}

五、其它函数

5.1C++版

节点状态判断

/** \brief 检查节点是否已经退出**  ros::shutdown() 被调用且执行完毕后,该函数将会返回 false** \return true 如果节点还健在, false 如果节点已经火化了。*/
bool ok();

节点关闭函数

/*
*   关闭节点
*/
void shutdown();

日志函数

ROS_DEBUG("hello,DEBUG"); //不会输出
ROS_INFO("hello,INFO"); //默认白色字体
ROS_WARN("Hello,WARN"); //默认黄色字体
ROS_ERROR("hello,ERROR");//默认红色字体
ROS_FATAL("hello,FATAL");//默认红色字体

参考:赵虚左ROS入门
在这里插入图片描述


http://www.ppmy.cn/news/706369.html

相关文章

word 页眉 页脚 页码 分页符 目录

目录 各操作所在位置 导出的pdf&#xff0c;目录有空白页 分节问题 页眉设置 目录页页码 删除页眉页脚 查看分页符方法 垂直居中 各操作所在位置 目录的相关操作&#xff1a;在横栏的引用里。 分页符在横栏的插入里。插入->分页。 在首页需要加一页做封面&#x…

html去除分页符,分页符怎么删除 删除分页符的两种方法

在给word文档设置页眉页脚时,如果有分隔符,可能会影响到页码的操作,因此我们要先建分页符删除,可是分页符怎么删除呢?接下来我们就一起来好好的了解一下吧。 分页符怎么删除——删除分页符的两种方法 方法一:用“Delete”键删除 1.打开word文档,单击“开始”菜单下的“显…

分页符怎么删除,word不要的页面删不掉

Word文档中有时会出现空白的地方却怎样都删除不了&#xff0c;也不知道什么原因&#xff0c;鼠标怎么也点击不出来&#xff0c;究竟是什么原因呢&#xff1f;大概是设置了分页符吧&#xff0c;那么&#xff0c;分页符怎么删除&#xff1f;这篇文章为大家运用了两种方式去删除分…

在word中插入分页符,多出一行

类似问题在网上也有多次提及&#xff0c;例如&#xff1a; (1)“ctrlenter进行分页,但是下一页开头总是多出一行” (2)“Word换页时&#xff0c;上一页多了一行看不见的行&#xff0c;影响下页的标题编辑” (3)“word2007分页出现问题&#xff0c;分后多出一行&#xff0c;删除…

word中在分页符后设置标题的段前间距

这个问题今天困扰很久&#xff0c;之前一页用了分页符&#xff0c;然后这一章的标题死活设置不了段前间距&#xff0c;只能设置段后标记。 然后摸索中发现&#xff0c;只要在该段的段首处插入一个“连续”的分节符就行了。效果如下&#xff1a;

Word中分隔符 分页符 分栏符 换行符 分节符的用法

在写论文时&#xff0c;论文格式要求目录需要用“Ⅰ、Ⅱ、Ⅲ、…”作为页码&#xff0c;正文要用“1、2、3、…”作为页码。而有的用户此时就要将目录存为一个单独的文件&#xff0c;再设置不同的页码格式&#xff0c;最后分开打印并装订成册。但是&#xff0c;如果书的前面还有…

word中的页码设置和分页、分节问题

如何查看word页码中的所有格式标记&#xff1a; 1、点击word的开始菜单。 2、在开始菜单中&#xff0c;点击右下角的word选项。 3、在word选项中&#xff0c;点击显示选项。 4、在现实选项中&#xff0c;点击显示所有格式标记&#xff0c;勾选它。 5、点击确定按钮&#xff0c;…

word2019 分页、分节(即分节符下的分页)、页码、页眉设置最佳实践

一、两章内容之间强行分页&#xff1a; 在上一章内容的最后&#xff0c;“插入”、“分页符”。&#xff08;为了方便观察&#xff0c;建议在上一章内容和这个插入的分页符之间&#xff0c;加一个无格式的回车&#xff09; 二、为了方便设置页眉和页码而进行的分节(即分节符下…