系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
TODO:写完再整理
文章目录
前言
认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! **开发管理**相关博客专栏: [https://blog.csdn.net/qq_35635374/article/details/138258301](https://blog.csdn.net/qq_35635374/article/details/138258301)开发经验及方法博客专栏:
https://blog.csdn.net/qq_35635374/article/details/138256324
嵌入式系统平台硬软件底层开发相关博客专栏:
https://blog.csdn.net/qq_35635374/article/details/138229695
机器人导航系统架构及业务模块组合策略的相关博客专栏:
https://blog.csdn.net/qq_35635374/article/details/138202210
运动学与动力学基础知识相关博客专栏:
https://blog.csdn.net/qq_35635374/article/details/138201806
机器人传感器及感知相关教程及博客请关注专栏:
https://blog.csdn.net/qq_35635374/article/details/138507260
机器人定位相关教程及博客请关注专栏:
https://blog.csdn.net/qq_35635374/article/details/138199360
机器人地图建立相关教程及博客请关注专栏:
https://blog.csdn.net/qq_35635374/article/details/138199063
机器人动作策略规划相关教程及博客请关注专栏:
https://blog.csdn.net/qq_35635374/article/details/138175048
机器人全局路径规划相关教程及博客请关注专栏:
https://blog.csdn.net/qq_35635374/article/details/138174918
机器人局部轨迹规划相关教程及博客请关注专栏:
https://blog.csdn.net/qq_35635374/article/details/138174730
机器人轨迹跟踪控制相关教程及博客请关注专栏:
https://blog.csdn.net/qq_35635374/article/details/138168913
本文先对**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/