ROS(四)通信机制进阶
文档维护:Arvin
网页部署:Arvin
▶
写在前面:本文旨在记录学习ROS过程中的一些重要知识概念和遇到的错误问题。主要参考赵虚左老师的ROS课程(第一个参考链接),由于赵老师用的noetic版本,而我用的是melodic版本,细节上可能会有所差异。
常用API
初始化
C++
1 | /** @brief ROS初始化函数。 |
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): |
话题与服务相关对象
C++
1 | /** |
回旋函数
C++
-
spinOnce()
1
2
3
4
5
6
7
8/**
* \brief 处理一轮回调
*
* 一般应用场景:
* 在循环体内,处理所有可用的回调函数
*
*/
ROSCPP_DECL void spinOnce(); -
spin()
1
2
3
4/**
* \brief 进入循环处理回调
*/
ROSCPP_DECL void spin();
**相同点:**二者都用于处理回调函数;
**不同点:**ros::spin() 是进入了循环执行回调函数,而 ros::spinOnce() 只会执行一次回调函数(没有循环),在 ros::spin() 后的语句不会执行到,而 ros::spinOnce() 后的语句可以执行。
时间
C++
1.时刻
获取时刻,或是设置指定时刻:
1 | ros::init(argc,argv,"hello_time"); |
2.持续时间
设置一个时间区间(间隔):
1 | ROS_INFO("当前时刻:%.2f",ros::Time::now().toSec()); |
3.持续时间与时刻运算
为了方便使用,ROS中提供了时间与时刻的运算:
1 | ROS_INFO("时间运算"); |
4.设置运行频率
1 | ros::Rate rate(1);//指定频率 |
5.定时器
ROS 中内置了专门的定时器,可以实现与 ros::Rate 类似的效果:
1 | ros::NodeHandle nh;//必须创建句柄,否则时间没有初始化,导致后续API调用失败 |
定时器的回调函数:
1 | void doSomeThing(const ros::TimerEvent &event){ |
其他函数
在发布实现时,一般会循环发布消息,循环的判断条件一般由节点状态来控制,C++中可以通过 ros::ok() 来判断节点状态是否正常,而 python 中则通过 rospy.is_shutdown() 来实现判断,导致节点退出的原因主要有如下几种:
- 节点接收到了关闭信息,比如常用的 ctrl + c 快捷键就是关闭节点的信号;
- 同名节点启动,导致现有节点退出;
- 程序中的其他部分调用了节点关闭相关的API(C++中是ros::shutdown(),python中是rospy.signal_shutdown())
另外,日志相关的函数也是极其常用的,在ROS中日志被划分成如下级别:
- DEBUG(调试):只在调试时使用,此类消息不会输出到控制台;
- INFO(信息):标准消息,一般用于说明系统内正在执行的操作;
- WARN(警告):提醒一些异常情况,但程序仍然可以执行;
- ERROR(错误):提示错误信息,此类错误会影响程序运行;
- FATAL(严重错误):此类错误将阻止节点继续运行。
ROS中的头文件与源文件
自定义头文件调用
**需求:**设计头文件,可执行文件本身作为源文件。
流程:
- 编写头文件;
- 编写可执行文件(同时也是源文件);
- 编辑配置文件并执行。
自定义源文件调用
**需求:**设计头文件与源文件,在可执行文件中包含头文件。
流程:
- 编写头文件;
- 编写源文件;
- 编写可执行文件;
- 编辑配置文件并执行。
Python模块导入
文件A实现(包含一个变量):
1 | #! /usr/bin/env python |
文件B核心实现:
1 | import os |
参考资料:
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Arvin!
评论
ValineDisqus