栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【系统开发基础储备】ROS常用API使用【类似于库开发-编程用】(第五篇)【重点】

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【系统开发基础储备】ROS常用API使用【类似于库开发-编程用】(第五篇)【重点】

系列文章目录

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

文章目录
  • 系列文章目录
  • 前言
  • 一、ROS对象节点注册初始化函数API
    • 1.C++版本(推荐)
    • 2.python版本
  • 二、ROS的回旋循环等待函数API
    • 1.C++版本(推荐)
    • 2.python版本
  • 三、ROS中时间相关的函数API
    • (1)设置与获取当前时刻函数API
      • 1.C++版本(推荐)
      • 2.python版本
    • (2)持续时间设置与时刻运算函数API
      • 1.C++版本(推荐)
      • 2.python版本
    • (3)设置运行频率Rate函数API
      • 1.C++版本(推荐)
      • 2.python版本
    • (4)休眠函数
      • python版本
  • 四、ROS信息输出函数API
    • 0.C++的信息输入输出
    • 1.C++版本(推荐)
    • 2.python版本
  • 五、ROS节点状态判断API
    • 0.ROS节点退出的原因
    • 1.C++判断(推荐)
    • 2.python判断
  • 六、ROS日志相关的函数API
    • 1.C++版本(推荐)
    • 2.python版本
  • 参考资料


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

本文先对**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
在cout或者cin出现错误的时候,可能是C++标准导致的,改成std::cout << XXX < 
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节点状态判断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/

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/457693.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号