0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ROS文件间的依赖关系

麦辣鸡腿堡 来源:古月居 作者:古月居 2023-09-14 18:17 次阅读

** TimeBase基类**

首先看time.h文件,它定义了一个叫TimeBase的类。注释中说,TimeBase是个基类,定义了两个成员变量uint32_t sec, nsec,还重载了+ ++、− -−、< <<、> >>、= ==等运算符。

成员变量uint32_t sec, nsec其实就是时间的秒和纳秒两部分,它们合起来构成一个完整的时刻。

至于为啥要分成两部分而不是用一个来定义,可能是考虑到整数表示精度的问题。

因为32位整数最大表示的数字是2147483647。如果我们要用纳秒这个范围估计是不够的。

你可能会问,机器人系统怎么会使用到纳秒这么高精度的时间分辨率,毕竟控制器定时器最高精度可能也只能到微秒?

如果你做过自动驾驶项目,有使用过GPS和激光雷达传感器的经验,就会发现GPS的时钟精度就是纳秒级的,它可以同步激光雷达每个激光点的时间戳。

还有,为什么定义TimeBase这个基类,原因大家很容易就能猜到。

因为在程序里,时间本质上就是一个数字而已,数字系统的序关系(能比较大小)和运算(加减乘除)也同样适用于时间这个东西。

当然,这里只有加减没有乘除,因为时间的乘除没有意义。

Time类

紧接着TimeBase类的是Time类,它是TimeBase的子类。我们做机器人应用程序开发时用不到TimeBase基类,但是Time类会经常使用。

now()函数

Time类比TimeBase类多了now()函数,它是我们的老熟人了。在开发应用的时候,我们直接用下面的代码就能得到当前的时间戳:

ros::Time begin = ros::Time::now(); //获取当前时间

now()函数的定义在rostimesrctime.cpp里,因为它很常用很重要,笔者就把代码粘贴在这里,如下。

函数很简单,可以看到,如果定义了使用仿真时间(g_use_sim_time为true),那就使用仿真时间,否则就使用墙上时间。

Time Time::now()
{
    if (!g_initialized)
        throw TimeNotInitializedException();
    if (g_use_sim_time)
      {
        boost::mutex::scoped_lock lock(g_sim_time_mutex);
        Time t = g_sim_time;
        return t;
      }
    Time t;
    ros_walltime(t.sec, t.nsec);
    return t;
  }

在ROS里,时间分成两类,一种叫仿真时间,一种叫墙上时间。

顾名思义,墙上时间就是实际的客观世界的时间,它一秒一秒地流逝,谁都不能改变它,让它快一点慢一点都不可能,除非你有超能力。

仿真时间则是可以由你控制的,让它快它就快。之所以多了一个仿真时间,是因为有时我们在仿真机器人希望可以自己控制时间,例如为了提高验证算法的效率,让它按我们的期望速度推进。

在使用墙上时间的情况下,now()函数调用了ros_walltime函数,这个函数也在rostimesrctime.cpp里。

剥开层层洋葱皮,最后发现,这个ros_walltime函数才是真正调用操作系统时间函数的地方,而且它还是个跨平台的实现(Windows和Linux)。

如果操作系统是Linux,那它会使用clock_gettime函数,在笔者使用的Ubuntu 18.04系统中这个函数在usrinclude路径下。

但是万一缺少这个函数,那么ROS会使用gettimeofday函数,但是gettimeofday没有clock_gettime精确,clock_gettime能提供纳秒的精确度。

如果操作系统是Windows,那它会使用标准库STL的chrono库获取当前的时刻,要用这个库只需要引用它的头文件,所以在time.cpp中引用了#include。

具体使用的函数就是

std::chrono::system_clock::now().time_since_epoch()。

当然,时间得是秒和纳秒的形式,所以用了count方法:

uint64_t now_ns = std::chrono::duration_cast< std::chrono::nanoseconds >
                  (std::chrono::system_clock::now().time_since_epoch()).count();

WallTime类

后面又接着声明了WallTime类和SteadyTime类。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 控制器
    +关注

    关注

    112

    文章

    16395

    浏览量

    178482
  • 定时器
    +关注

    关注

    23

    文章

    3251

    浏览量

    114996
  • 文件
    +关注

    关注

    1

    文章

    568

    浏览量

    24768
  • ROS
    ROS
    +关注

    关注

    1

    文章

    278

    浏览量

    17031
收藏 人收藏

    评论

    相关推荐

    如何在ROS中调用.so文件

    的是 liblibdaq-2.0.0.so这个文件,下面以ROS为例子怎么调用.so文件。 结合cmake的使用 新建工作空间,功能包等流程不再赘述,网上已经有很多教程了。着重讲cmakelist的配置
    发表于 07-02 14:44

    怎么解决依赖关系中vi冲突?

    冲突项是Error Cluster From Error Code.vi。如果不在依赖关系中可以放进项目库中来解决同名冲突。在依赖关系中怎么解决?大神指教
    发表于 09-25 21:14

    【Toybrick RK3399Pro AI开发板试用体验】Fedora系统安装ROS

    ; melodic-ros_comm.rosinstall$ wstool init -j8 src melodic-ros_comm.rosinstall解决依赖关系$ rosdep
    发表于 07-07 17:36

    ROS是否适用于工业?

    于主机,而是将消息层替换为依赖DDS(数据分发服务)。实时系统:我们希望在ROS中直接支持实时控制,包括进程和机器的通信(假设适当的操作系统和/或硬件支持)。虽然
    发表于 10-17 13:24

    在Android中使用ROS

    使用Android Studio. 其ROS相关的配置方式可以有两种。一种是在ROS环境中使用,另一种是给普通的Android App添加上ROS依赖库。第二种方式可以在开发机器没有
    发表于 05-16 19:16

    ROS与STM32之间的联系

    ROS与STM32之间的联系简介ROS主要实现的功能STM32主要实现的功能两者之间的关系两者之间的通信简介1、如何实现ROS与stm32之间的通信,
    发表于 06-28 07:49

    怎样去使用ROS中的launch启动文件

    怎样去使用ROS中的launch启动文件呢?ROS中的launch启动文件该怎样去使用呢?
    发表于 02-14 07:23

    在FirePrime开发板上编译安装ROS jade

    ,底层设备控制,常用功能实现,进程消息以及数据包管理。ROS是基于一种图状架构,从而不同节点的进程能接受,发布,聚合各种信息(例如传感,控制,状态,规划等等)。感兴趣的可以去ROS Wiki,那里有
    发表于 07-07 11:21

    ROS教程之ROS机器人操作系统基础知识概述资料免费下载

    ROS文件系统介绍 (1)快速了解ROS文件系统概念 • 软件包集(Stack):如果你将几个具有某些功能的软件包组织在一起,那么你将会获得一个软件包集。在
    发表于 10-15 08:00 20次下载
    <b class='flag-5'>ROS</b>教程之<b class='flag-5'>ROS</b>机器人操作系统基础知识概述资料免费下载

    如何在IDEA中查看依赖关系

    Maven提供了mvn dependency:tree来查看依赖关系,而IDE往往提供了更加便利的方式,比如Eclipse或者IDEA都有类似的功能,这篇文章简单说明一下如何在IDEA中查看依赖
    的头像 发表于 10-17 09:48 1.9w次阅读

    ROS是如何设计的 ROS客户端库

    实现通信的代码在ros_comm包中,如下。 其中clients文件夹一共有127个文件,看来是最大的包了。 现在我们来到了ROS最核心的地带。 客户端这个名词出现的有些突然,一个机器
    的头像 发表于 09-14 17:29 874次阅读
    <b class='flag-5'>ROS</b>是如何设计的 <b class='flag-5'>ROS</b>客户端库

    Unity与ROS链接介绍

    ROS链接 ROS方面的准备步骤如下,首先添加端口号“10000”“5005”,启动Docker镜像。 Unity和ROS之间的通信需要端口号“10000”“5005”。为了在Unity中导入消息
    的头像 发表于 11-17 17:22 1025次阅读
    Unity与<b class='flag-5'>ROS</b>链接介绍

    ROS Motion Planning运动规划库如何安装相关依赖

    工作空间的src文件夹下,并解压 安装相关依赖 (1)关于Python 关于Python推荐使用Python3,对于Ubuntu20.04对应的ROS Noetic一般默认使用的都是Python3,可以在终端执行python指令
    的头像 发表于 11-26 17:29 1195次阅读

    ros的基本概念是什么

    基本概念: ROS是一个用于在不同进程匿名的发布、订阅、传递信息的中间件。 ROS2系统的核心部分是ROS网络(ROS Graph)。
    的头像 发表于 11-27 11:21 1834次阅读

    ros怎么设置环境变量

    可以使用的动态的值,用于影响运行程序的行为。环境变量通常包含一些关键信息,如路径、用户名、颜色选项等。 在ROS中,环境变量是重要的,因为它们用于确定ROS如何运行和找到相关文件和程序。 为什么要设置
    的头像 发表于 12-28 13:52 2102次阅读