ROS2学习之路之ros2时间

ros2时间
获取时间

#include <chrono>
using namespace std::chrono_literals;
获取系统当前时间
auto start = std::chrono::system_clock::now();
auto end  = std::chrono::system_clock::now();
计算时间差
std::chrono::duration<double> diff = end - start;

std::chrono::steady_clock

获取系统当前时间
std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
计算时间差
std::chrono::duration_cast<std::chrono::microseconds> diff = (end - start).count();
#include <iostream>
#include <iomanip>
#include <ctime>
#include <chrono>
 
int main()
{
	 std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
    auto now = std::chrono::system_clock::now();//now为std::chrono::system_clock::time_point 类型
    std::time_t now_ = std::chrono::system_clock::to_time_t(now - std::chrono::hours(24));
    std::cout << "the time was " << std::put_time(std::localtime(&now_), "%F %T") << std::endl;
    std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
    std::chrono::duration_cast<std::chrono::microseconds> diff = (end - start).count();
}

std::chrono::high_resolution_clock

  using namespace std::chrono;

  high_resolution_clock::time_point start = high_resolution_clock::now();
  high_resolution_clock::time_point end = high_resolution_clock::now();
  duration<double> diff = duration_cast<duration<double>>(start - end);
  std::cout << "time " << diff.count() << " seconds.";

ros2的时间戳

auto t1 = rclcpp::Clock().now();
double t1_s = t1.seconds();
double t1_n = t1.nanoseconds();
auto tn = rclcpp::Clock().now();
RCLCPP_INFO(nodePtr_->get_logger(), " time 1: %ld  %ld   %ld", t1_s,t1_n,tn-t1);
auto t2 = std::chrono::system_clock::now(); 
time_t t2_s = std::chrono::system_clock::to_time_t ( t2 );
RCLCPP_INFO(nodePtr_->get_logger(), " time 2: %ld ",t2_s);

std::chrono::steady_clock::time_point t3 = std::chrono::steady_clock::now(); 
std::chrono::steady_clock::duration td = t3.time_since_epoch();
double secs = td.count() * std::chrono::steady_clock::period::num / std::chrono::steady_clock::period::den;
RCLCPP_INFO(nodePtr_->get_logger(), " time 3: %ld ",secs);

auto t4 = nodePtr_->get_clock()->now();
double t4_s = t4.seconds();
double t4_n = t4.nanoseconds();
RCLCPP_INFO(nodePtr_->get_logger(), " time 4: %ld  %ld ", t4_s,t4_n);

auto t5 = nodePtr_->now();
double t5_s = t5.seconds();
double t5_n = t5.nanoseconds();
RCLCPP_INFO(nodePtr_->get_logger(), " time 5: %ld  %ld ", t5_s,t5_n);

ros2延时

#include <iostream>       // std::cout, std::endl
#include <thread>         // std::this_thread::sleep_for
#include <chrono>         // std::chrono::seconds

int main()
{
	std::cout << "start sleep"<<std::endl;
	std::this_thread::sleep_for(std::chrono::seconds(1));
	std::cout << "stop sleep"<<std::endl;
	return 0;
}

ros2运行频率控制

int main(int argc, char** argv){
    rclcpp::init(argc, argv);

    rclcpp::WallRate loop_rate(1.0);//1HZ
    while (rclcpp::ok())
    {
        /* code */
        loop_rate.sleep();
    }
}

spin()和spin_some()用法总结:
1)程序执行到了rclcpp::spin()或者rclcpp::spin_some(),才能真正使回调函数生效。

2)rclcpp::spin():遇到spin,会一直等待话题消息。队列中如果有数据,则处理回调函数;否则,继续查看并且等待。也就是说遇到spin后,在其后面的代码不执行了。

3)当程序执行到rclcpp::spin_some()时,会去话题订阅缓冲区中查看有没有回调函数。如果有,就马上处理一个回调函数并退出;否则,就退出这个指令,执行后续的代码。

  1. rclcpp::spin_some比rclcpp::spin()更加灵活,常用于手动写循环,可以放在程序的任何位置下,但是需要考虑spinOnce执行频率与所订阅话题的发布频率之间的关系。而spin()就比较粗暴,反正一直在等话题产生,只要注意回调函数不持续超时,或者确保订阅缓冲区足够大就好。

用法:rclcpp::spin(nodePtr);
rclcpp::spin_some(nodePtr);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值