ROS学习之 cpp时间

wiki链接: http://wiki.ros.org/roscpp/Overview/Time

    1.时刻和时间间隔

        ROS有内建的时间和时间间隔原始类型,rsolib程序包提供了ros::Time和ros::Duration类
        time是一个具体的时刻(上午9:30)而duration是一段时间(5个小时)duration可以是负值.
        Time和duration有相同的表示。
            int32 sec
            int32 nsec
        ros可以为节点提供一个模拟的时钟。用户应该使用roscpp的时间函数获取当前时间。
        1)获取当前时间
        ros::Time::now() 返回一个ros::Time实例。
        
        2)创建Time和Duration实例
        通过给定具体的浮点数,来初始化实例对象:
            ros::Time a_little_after_the_beginning(0.001);
            ros::Duration five_seconds(5.0);
        或者通过两个整数:
            ros::Time a_little_after_the_beginning(0, 1000000);
            ros::Duration five_seconds(5, 0);

        3)转化Time和Duration实例
        Time和Duration对象可以被转化成相应的浮点秒数:
            double secs =ros::Time::now().toSec();

            ros::Duration d(0.5);
            secs = d.toSec();
        4)Time和Duration计算
        与其它原始数据类型一样,可以对time和duration进行算术操作。
        几个小例子:
            1 hour + 1 hour = 2 hours (duration + duration = duration)
            2 hours - 1 hour = 1 hour (duration - duration = duration)
            Today + 1 day = tomorrow (time + duration = time)
            Today - tomorrow = -1 day (time - time = duration)
            Today + tomorrow = error (time + time is undefined)
        在ros代码中的表示:
            ros::Duration two_hours = ros::Duration(60*60) + ros::Duration(60*60);
            ros::Duration one_hour = ros::Duration(2*60*60) - ros::Duration(60*60);
            ros::Time tomorrow = ros::Time::now() + ros::Duration(24*60*60);
            ros::Duration negative_one_day = ros::Time::now() - tomorrow;

    2.睡眠和比率

        bool ros::Duration::sleep()  睡眠一段具体的时间间隔

        ros::Duration(0.5).sleep(); // sleep for half a second

        ros::Rate roslib提供了ros::Rate类来保持一定的频率来控制循环
            ros::Rate r(10); // 10 hz
            while (ros::ok())
            {
              ... do some work ...
              r.sleep();
            }
        注:通常建议使用Timer来代替Rate

    3.壁钟时间

        如果在模拟时间中,想要获取实际的壁钟时间,roslib提供了Wall版本的time构造器。
        如:ros::WallTime  ros::WallDuration ros::WallRate
### ROS 学习教程入门指南 对于初学者来说,ROS(Robot Operating System)是一个功能强大且复杂的工具集,用于开发机器人应用。以下是关于如何通过现有资源学习 ROS 的详细介绍。 #### 资源推荐 古月居提供了一套全面的 ROS 入门课程,涵盖了从基础知识到实际操作的内容[^1]。这套视频教程适合希望快速掌握 ROS 基本概念的学习者。它不仅讲解理论知识,还提供了丰富的实践案例来帮助理解。 针对 ROS2 用户,有一份详尽的《ROS2 零基础入门到实战》指南可供参考[^2]。这份文档特别强调了节点重映射等功能的实际运用方法,例如 `ros2 run demo_nodes_cpp talker --ros-args --remap __node:=my_talker` 这样的命令行技巧可以有效提升工作效率并加深对系统的认识。 另外,《ROS1/ROS2 机器人编程光速入门指南》也是一篇值得阅读的文章[^3]。尽管其中部分内容涉及历史背景介绍如罗马城建设比喻说明复杂工程需时间积累外,更多聚焦于技术层面指导新用户熟悉两种版本间差异以及共同之处。 #### 实践建议 为了更好地巩固所学知识,在学习过程中应注重动手能力培养。尝试编写简单的发布订阅程序就是一个很好的起点: ```cpp #include "rclcpp/rclcpp.hpp" using namespace std::chrono_literals; class MinimalPublisher : public rclcpp::Node { public: MinimalPublisher() : Node("minimal_publisher") { publisher_ = this->create_publisher<std_msgs::msg::String>("topic", 10); timer_ = this->create_wall_timer(500ms, std::bind(&MinimalPublisher::timer_callback, this)); } private: void timer_callback(){ auto message = std_msgs::msg::String(); static uint8_t count=0; message.data="Hello World "+std::to_string(count++); RCLCPP_INFO(this->get_logger(), "Publishing: '%s'", message.data.c_str()); publisher_->publish(message); } rclcpp::TimerBase::SharedPtr timer_; rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_; }; int main(int argc, char * argv[]) { rclcpp::init(argc, argv); auto node = std::make_shared<MinimalPublisher>(); rclcpp::spin(node); rclcpp::shutdown(); } ``` 上述 C++ 示例展示了创建一个定时发送字符串消息至指定主题的 Publisher 方法。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值