第五篇:ROS常用API使用【类似于库开发】【重点】

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
TODO:写完再整理


前言

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!

本文先对**ROS常用API使用【类似于库开发】**做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章


提示:以下是本篇文章正文内容

一、ROS对象节点注册初始化函数API

1.C++版本(推荐)

(1)函数原型

void init(int &argc, char **argv, const std::string& name, uint32_t options = 0);
 * \param argc 参数个数
 * \param argv 参数列表
 * \param name 节点名称,需要保证其唯一性,不允许包含命名空间
 * \param options 节点启动选项,被封装进了ros::init_options

(2)函数调用

ros::init(argc,argv,"xxxx");

【防盗标记–盒子君hzj】

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)

name: 节点名称,必须保证节点名称唯一,节点名称中不能使用命名空间(不能包含 '/')

(2)函数调用

rospy.init_node("yyyy")

【防盗标记–盒子君hzj】

二、ROS的回旋循环等待函数API

1.C++版本(推荐)

(1)ros::spinOnce()
在循环体内,处理所有可用的回调函数一次

(2)ros::spin()
在循环体内,一直处理所有可用的回调函数

2.python版本

def spin():
    """
    进入循环处理回调 
    """

【防盗标记–盒子君hzj】

三、ROS中时间相关的函数API

(1)设置与获取当前时刻函数API

1.C++版本(推荐)

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 的秒数

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

【防盗标记–盒子君hzj】

2.python版本

# 获取当前时刻
right_now = rospy.Time.now()
rospy.loginfo("当前时刻:%.2f",right_now.to_sec())
rospy.loginfo("当前时刻:%.2f",right_now.to_nsec())

# 自定义时刻
some_time1 = rospy.Time(1234.567891011)
some_time2 = rospy.Time(1234,567891011)
rospy.loginfo("设置时刻1:%.2f",some_time1.to_sec())
rospy.loginfo("设置时刻2:%.2f",some_time2.to_sec())

# 从时间创建对象
# some_time3 = rospy.Time.from_seconds(543.21)
some_time3 = rospy.Time.from_sec(543.21) # from_sec 替换了 from_seconds
rospy.loginfo("设置时刻3:%.2f",some_time3.to_sec())

【防盗标记–盒子君hzj】
.
.

(2)持续时间设置与时刻运算函数API

1.C++版本(推荐)

(1)持续时间设置

ROS_INFO("当前时刻:%.2f",ros::Time::now().toSec());

ros::Duration du(10);//持续10秒钟,参数是double类型的,以秒为单位
du.sleep();//按照指定的持续时间休眠
ROS_INFO("持续时间:%.2f",du.toSec());//将持续时间换算成秒

ROS_INFO("当前时刻:%.2f",ros::Time::now().toSec());

【防盗标记–盒子君hzj】

(2)时刻运算函数

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;//异常

2.python版本

(1)持续时间设置

# 持续时间相关API
rospy.loginfo("持续时间测试开始.....")
du = rospy.Duration(3.3)
rospy.loginfo("du1 持续时间:%.2f",du.to_sec())
rospy.sleep(du) #休眠函数
rospy.loginfo("持续时间测试结束.....")

(2)时刻运算函数【防盗标记–盒子君hzj】

rospy.loginfo("时间运算")
now = rospy.Time.now()
du1 = rospy.Duration(10)
du2 = rospy.Duration(20)
rospy.loginfo("当前时刻:%.2f",now.to_sec())
before_now = now - du1
after_now = now + du1
dd = du1 + du2
# now = now + now #非法
rospy.loginfo("之前时刻:%.2f",before_now.to_sec())
rospy.loginfo("之后时刻:%.2f",after_now.to_sec())
rospy.loginfo("持续时间相加:%.2f",dd.to_sec())

(3)设置运行频率Rate函数API

1.C++版本(推荐)

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

【防盗标记–盒子君hzj】

2.python版本

# 设置执行频率
rate = rospy.Rate(0.5)
while not rospy.is_shutdown():
    rate.sleep() #休眠
    rospy.loginfo("+++++++++++++++")

(4)休眠函数

python版本

rospy.sleep(1)

.
.

四、ROS信息输出函数API

0.C++的信息输入输出

使用C++的cout和cin要包含iostream的头文件,#include<iostream.h>
在cout或者cin出现错误的时候,可能是C++标准导致的,改成std::cout << XXX <<std::endl

1.C++版本(推荐)

ROS_INFO("时间运算");
ROS_INFO("string_param_init: %s", s.c_str());
ROS_INFO("int_param_init: %d", num);
ROS_INFO(“xxxxxx”);
ROS_ERROR(“xxxxxx”);

.

2.python版本

rospy.loginfo("持续时间测试开始.....")

【防盗标记–盒子君hzj】

.

ros_info信息保存在本地文件

在ros直接录制不能够拿到info信息,只能拿到话题,不能够拿到自己写的ros_info信息,ros_info信息可以在终端直接保存到log文件中
1.在终端中执行

$ sudo script screen.log

内容将保存到当前目录的screen.log文件中

2.执行以下命令停止保存

$ exit 

方法如下:
https://blog.csdn.net/hurg101/article/details/124047724

五、ROS节点状态判断API

在发布实现时,一般会循环发布消息,循环的判断条件一般由节点状态来控制,C++中可以通过 ros::ok() 来判断节点状态是否正常,而 python 中则通过 rospy.is_shutdown() 来实现判断

0.ROS节点退出的原因

(1)节点接收到了关闭信息,比如常用的 ctrl + c 快捷键就是关闭节点的信号;
(2)同名节点启动,导致现有节点退出;
(3)程序中的其他部分调用了节点关闭相关的API(C++中是ros::shutdown(),python中是rospy.signal_shutdown())

1.C++判断(推荐)

(1)检查节点是否已经退出

ros::shutdown() 被调用且执行完毕后,该函数将会返回 false

(2)节点关闭函数

void shutdown();

【防盗标记–盒子君hzj】

2.python判断

(1)检查节点是否已经退出

def is_shutdown():
    """
    @return: True 如果节点已经被关闭
    @rtype: bool
    """

【防盗标记–盒子君hzj】
(2)节点关闭函数
方法一

def signal_shutdown(reason):
    """
    关闭节点
    @param reason: 节点关闭的原因,是一个字符串
    @type  reason: str
    """

方法二

def on_shutdown(h):
    """
    节点被关闭时调用的函数
    @param h: 关闭时调用的回调函数,此函数无参
    @type  h: fn()
    """

【防盗标记–盒子君hzj】

六、ROS日志相关的函数API

1.C++版本(推荐)

(1)DEBUG(调试)
ROS_DEBUG("hello,DEBUG"); //不会输出,只在调试时使用,此类消息不会输出到控制台;

(2)INFO(信息)
ROS_INFO("hello,INFO"); //默认白色字体,标准消息,一般用于说明系统内正在执行的操作;

(3)WARN(警告)
ROS_WARN("Hello,WARN"); //默认黄色字体,提醒一些异常情况,但程序仍然可以执行;

(4)ERROR(错误)
ROS_ERROR("hello,ERROR");//默认红色字体,提示错误信息,此类错误会影响程序运行;

(5)FATAL(严重错误)
ROS_FATAL("hello,FATAL");//默认红色字体,此类错误将阻止节点继续运行。

【防盗标记–盒子君hzj】

2.python版本

(1)DEBUG(调试)
rospy.logdebug("hello,debug")  #不会输出,只在调试时使用,此类消息不会输出到控制台;

(2)INFO(信息)
rospy.loginfo("hello,info")  #默认白色字体,标准消息,一般用于说明系统内正在执行的操作;

(3)WARN(警告)
rospy.logwarn("hello,warn")  #默认黄色字体,提醒一些异常情况,但程序仍然可以执行;

(4)ERROR(错误)
rospy.logerr("hello,error")  #默认红色字体,提示错误信息,此类错误会影响程序运行;

(5)FATAL(严重错误):
rospy.logfatal("hello,fatal") #默认红色字体,此类错误将阻止节点继续运行。

【防盗标记–盒子君hzj】


参考资料

API官网

https://link.zhihu.com/?target=http%3A//wiki.ros.org/APIs

https://link.zhihu.com/?target=https%3A//docs.ros.org/en/api/roscpp/html/

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盒子君~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值