ROS学习笔记(十) roscpp介绍(四)

roscpp介绍(四)

时钟

ROS中计算机器人移动距离、设定程序的等待时间、设定计时器等,都需要时钟。
roscpp中有两种表示时间的方法:一种是时刻(ros::Time),一种是时长(ros::Duration).TIme和Duration都有相同的表示方法:

...
//Time和Duration都由秒和纳秒组成
int32 sec
int32 nsec
...

要使用TIme和Duration,需要#include<ros/time.h>#include<ros/duration.h>

ros::Time begin = ros::Time::now();//获取当前时间
ros::Time at_some_time1(5,20000000);//5.2s
ros::Time at_some_time2(5.2);//同上,重载了float类型和两个uint类型的构造函数
ros::Duration one_hour(60*60,0);//1h

double secs1 = at_some_time1.toSec();//将Time转为double型时间
double secs2 = one_hour.toSec();//将Duration转为double型时间

Time指的是某个时刻,Duration指的是某个时间段,数据结构相同,用于不同的场景下。ROS重载了Time、Duration类型之间的加减运算

ros::Time t1 = ros::Time::now() - ros::Duration(5.5)//t1是5.5s前的时刻,Time加减Duration返回都是Time
ros::Timw t2 = ros::Time::now() + ros::Duration(3.3);//t2是当前时刻往后推3.3s的时刻
ros::Duration d1 = t2-t1;//从t1到t2的时长,两个Time相减返回Duration类型
ros::Duration d2 = d1 - ros::Duration(0,300);//两个Duration相减,还是Duration
//注意没有Time+Time的做法

sleep

通常在机器人执行任务中有需要等待的场景用sleep功能,roscpp中提供了两种sleep的方法

ros::Duration(0.5).sleep();//用Duration对象的sleep方法休眠

ros::Rate r(10); //10HZ
while(ros::ok())
{
	r.sleep();
	//定义好sleep的频率,Rate对象会自动让整个循环以10hz休眠,即使有任务执行占用了时间
}

Timer

定时器Timer通过设定回调函数和触发时间来实现某些动作的反复执行(和topic中的subscriber很像)。

void callback1(const ros::TImerEvent&)
{
	ROS_INFO("Callback 1 tigered");
}

void callback2(const ros::TimerEvent&)
{
	ROS_INFO("Callback 2 triggered");
}

int main(int argc, char **argv)
{	
	ros::init(argc,argv,"timer");
	ros::NodeHandle nh;
	
	ros::TImer time1 = nh.createTimer(ros::Duration(0.1),callback1); //timer1每0.1s触发一次
	ros::TImer time2 = nh.createTimer(ros::Duration(1.0),callback2);//timer2每1.0s触发一次
	ros::spin();
	return 0;
}

日志(Log)

ROS提供了一套日志记录和输出系统(基于topic),每个节点会把日志信息发送到一个统一的topic : /rosout(rosout本身就是一个node,负责日志的记录,启动master时系统会附带rosout启动)。

在roscpp中进行日志的输出需要#include<ros/console.h>,头文件包括了五个级别的日志输出接口:
DEBUG
INFO
WARN
ERROR
FATAL
用法:

ROS_DEBUG("The velocity is %f", vel);
ROS_WARN("Warn: the use is deprecated.");
ROS_FATAL("Cannot start this node.");

也可以在一些特定的场景,特定条件下输出(一般用不到这么复杂的功能)。可参考http://wiki.ros.org/roscpp/Overview/Logging

异常(Exception)

roscpp有两种异常类型,当有以下错误时就会抛出异常

ros::InvalidNodeNameException
//当无效的基础名称传给ros::init(),通常名称中有/,就会触发

ros::InvalidNameException
//当无效名称传给roscpp
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值