`rclcpp::Clock(RCL_ROS_TIME).now()` vs. `node_->get_clock()->now()`
Is rclcpp::Clock(RCL_ROS_TIME).now()
always the same as node_->get_clock()->now()
?
Is rclcpp::Clock(RCL_ROS_TIME).now()
always the same as node_->get_clock()->now()
?
Well, it looks that the answer is NO. I had some issues with this and wasn't satisfied with the answer so I wrote a small node to test these clocks. The test is carried out with Galactic. The complete code can be found at https://github.com/galou/test_clock and the source is below
#include <chrono>
#include <string>
#include <rclcpp/rclcpp.hpp>
using namespace std::chrono_literals;
class TestClockNode : public rclcpp::Node
{
public:
TestClockNode(
const std::string & node_name,
const rclcpp::NodeOptions & options = rclcpp::NodeOptions()) :
rclcpp::Node{node_name, options}
{
timer_ = create_wall_timer(1s, [this] () {timerCallback();});
}
private:
rclcpp::TimerBase::SharedPtr timer_;
void timerCallback()
{
RCLCPP_INFO_STREAM(get_logger(), "now(): " << now().seconds());
RCLCPP_INFO_STREAM(get_logger(), " rclcpp::Clock{}.now(): " << rclcpp::Clock{}.now().seconds());
RCLCPP_INFO_STREAM(get_logger(), " rclcpp::Clock{RCL_ROS_TIME}.now(): " << rclcpp::Clock{RCL_ROS_TIME}.now().seconds());
RCLCPP_INFO_STREAM(get_logger(), " rclcpp::Clock{RCL_SYSTEM_TIME}.now(): " << rclcpp::Clock{RCL_SYSTEM_TIME}.now().seconds());
RCLCPP_INFO_STREAM(get_logger(), " rclcpp::Clock{RCL_STEADY_TIME}.now(): " << rclcpp::Clock{RCL_STEADY_TIME}.now().seconds());
}
};
int
main(int argc, char * argv[])
{
rclcpp::init(argc, argv);
auto node = std::make_shared<TestClockNode>("test_clock");
if (node == nullptr)
{
return 1;
}
auto executor = rclcpp::executors::SingleThreadedExecutor{};
executor.add_node(node);
executor.spin();
rclcpp::shutdown();
return 0;
}
You need a running simulated time provider (i.e. a simulator) to test and you need to launch with
ros2 run test_clock test_clock --ros-args --param use_sim_time:=true --
Example of output:
[INFO] [1645622804.092181382] [test_clock]: now(): 2216.74
[INFO] [1645622804.092376229] [test_clock]: rclcpp::Clock{}.now(): 1.64562e+09
[INFO] [1645622804.092445844] [test_clock]: rclcpp::Clock{RCL_ROS_TIME}.now(): 1.64562e+09
[INFO] [1645622804.092512516] [test_clock]: rclcpp::Clock{RCL_SYSTEM_TIME}.now(): 1.64562e+09
[INFO] [1645622804.092567862] [test_clock]: rclcpp::Clock{RCL_STEADY_TIME}.now(): 199532
Well, if the rclcpp::Clock
object on which you'll call now()
refers to the clock belonging to the rclcpp::Node
object, then yes, they are the same. These can semantically mean different things if you're talking about different clocks.
Looking at the source code for both, I believe they are the same:
For rcrclcpp::Clock(RCL_ROS_TIME).now()
source code:
https://docs.ros2.y org/foxy/api/rclcpp/clock_8hpp_source.html
And for node_->get_clock()->now()
source code:
https://docs.ros2.org/dashing/api/rcl...
Both are declared the same way:
RCLCPP_PUBLIC
Time
now()
The only difference I see is the first one is more direct method .
Please start posting anonymously - your entry will be published after you log in or create a new account.
Asked: 2021-12-02 04:11:19 -0500
Seen: 91 times
Last updated: Feb 23
Scope Resolution problem in the ROS2 migration guide
ros2 run turtlesim symbol lookup error
Building ROS2 Dashing Base from Source
[ROS2] eloquent subscriber with rti DDS native application
ROS2 Multicast not working between remote pc's?
Message files for Autoware.Auto
Ros2 service String providing unexpected Result �2���