目录
参考学习资料:B站赵虚左的课程
获取当前时刻+设置指定时刻(时间点)
创建time.cpp文件
因为没有实现什么代表性的功能,故随便放在了一个功能包的src下。
time.cpp
#include "ros/ros.h"
/*
任务:获取当前时刻,设置指定时刻
获取当前时刻:调用ros命名空间下的Time类下的now()函数.
指定时刻:调用ros命名空间下的Time类,注意参数的配置,用逗号分割传入两个参数,前后两个参数为整形,前为秒,后为纳秒.
用一个参数,为double型.
*/
int main(int argc, char *argv[])
{
// 防止控制台中文乱码
setlocale(LC_ALL,"");
// 初始化节点
ros::init(argc,argv,"demo_time");
// 初始化句柄,此处会发现没用到n.但是我在注释掉初始化句柄后,就会出现无法调用api的错误.
ros::NodeHandle n;
// 获取当前时刻---now被调用的时刻.参考系:1970年1月1日00:00:00
ros::Time right_now = ros::Time::now();
// 打印在控制台终端,其中toSec()与sec是以秒的形式输出,但是注意返回的类,前者为double型,后者为int32
ROS_INFO("当前时刻:%.2f",right_now.toSec());
ROS_INFO("当前时刻:%d",right_now.sec);
// 设置指定时刻:调用ros命名空间下的Time类,注意参数的配置,用逗号分割传入两个参数,前后两个参数为整形,前为秒,后为纳秒.传入一个参数,为double型.
ros::Time t1(20,123456789);
ros::Time t2(20.123456789);
// 与前面相同转化为秒
ROS_INFO("t1 = %.2f",t1.toSec());
ROS_INFO("t2 = %.2f",t2.toSec());
return 0;
}
注意的点1:传入参数和返回参数的类型。vscode可通过ctrl+shift+空格提示传入参数的类型,返回参数的类型可以鼠标指向函数名即可提示。
注意的点2:初始化句柄从程序上发现并没有调用,但是必须初始化,否则没法调用后续的api。不初始化句柄会报如下错误:
terminate called after throwing an instance of 'ros::TimeNotInitializedException'
what(): Cannot use ros::Time::now() before the first NodeHandle has been created or ros::start() has been called. If this is a standalone app or test that just uses ros::Time and does not communicate over ROS, you may also call ros::Time::init()
已放弃 (核心已转储)
CMakeList.txt配置
add_executable(time src/time.cpp)
add_dependencies(time ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(time
${catkin_LIBRARIES}
)
编译+启动ROS Master+运行节点
catkin_make
roscore
注意我放在了sub_pub功能包下了。
source ./devel/setup.bash
rosrun sub_pub time
结果:
rosmelodic@rosmelodic-virtual-machine:~/catkin_ws$ rosrun sub_pub time
[ INFO] [1667180564.625914795]: 当前时刻:1667180564.63
[ INFO] [1667180564.626587019]: 当前时刻:1667180564
[ INFO] [1667180564.626614175]: t1 = 20.12
[ INFO] [1667180564.626632135]: t2 = 20.12
持续时间(时间段)
添加持续时间部分
继续之前的文件,进行改动。
#include "ros/ros.h"
/*
任务:获取当前时刻,设置指定时刻
获取当前时刻:调用ros命名空间下的Time类下的now()函数.
指定时刻:调用ros命名空间下的Time类,注意参数的配置,用逗号分割传入两个参数,前后两个参数为整形,前为秒,后为纳秒.
用一个参数,为double型.
*/
int main(int argc, char *argv[])
{
// 防止控制台中文乱码
setlocale(LC_ALL,"");
// 初始化节点
ros::init(argc,argv,"demo_time");
// 初始化句柄,此处会发现没用到n.但是我在注释掉初始化句柄后,就会出现无法调用api的错误.
ros::NodeHandle n;
// 获取当前时刻---now被调用的时刻.参考系:1970年1月1日00:00:00
ros::Time right_now = ros::Time::now();
// 打印在控制台终端,其中toSec()与sec是以秒的形式输出,但是注意返回的类,前者为double型,后者为int32
ROS_INFO("当前时刻:%.2f",right_now.toSec());
ROS_INFO("当前时刻:%d",right_now.sec);
// 设置指定时刻:调用ros命名空间下的Time类,注意参数的配置,用逗号分割传入两个参数,前后两个参数为整形,前为秒,后为纳秒.传入一个参数,为double型.
ros::Time t1(20,123456789);
ros::Time t2(20.123456789);
// 与前面相同转化为秒
ROS_INFO("t1 = %.2f",t1.toSec());
ROS_INFO("t2 = %.2f",t2.toSec());
// 持续时间部分
ros::Time start_time = ros::Time::now();
ROS_INFO("开始时刻:%.2f",start_time.toSec());
//持续10.12秒钟,参数是double类型的,以秒为单位
ros::Duration du(10.12);
//按照指定的持续时间休眠
du.sleep();
// 结束时间
ros::Time end_time = ros::Time::now();
ROS_INFO("结束时刻:%.2f",end_time.toSec());
// 二者只差
ROS_INFO("结束时刻与开始时刻的差值:%.2f",end_time.toSec()-start_t