41#include <gmock/gmock.h>
42#include <gtest/gtest.h>
45#include <rclcpp/rclcpp.hpp>
46#include <rclcpp/version.h>
48#if RCLCPP_VERSION_GTE(29, 6, 0)
49#include <tf2_ros/buffer.hpp>
52#include <tf2_ros/buffer.h>
71TEST(CurrentStateMonitorTests, StartCreateSubscriptionTest)
73 auto mock_middleware_handle = std::make_unique<MockMiddlewareHandle>();
75 EXPECT_CALL(*mock_middleware_handle, createJointStateSubscription);
80 std::make_shared<tf2_ros::Buffer>(std::make_shared<rclcpp::Clock>()),
false
87TEST(CurrentStateMonitorTests, StartActiveTest)
92 std::make_shared<tf2_ros::Buffer>(std::make_shared<rclcpp::Clock>()),
false
99 EXPECT_TRUE(current_state_monitor.
isActive());
102TEST(CurrentStateMonitorTests, StopResetSubscriptionTest)
104 auto mock_middleware_handle = std::make_unique<MockMiddlewareHandle>();
107 EXPECT_CALL(*mock_middleware_handle, resetJointStateSubscription);
108 EXPECT_CALL(*mock_middleware_handle, now);
113 std::make_shared<tf2_ros::Buffer>(std::make_shared<rclcpp::Clock>()),
false
121TEST(CurrentStateMonitorTests, StopNotActiveTest)
123 auto mock_middleware_handle = std::make_unique<MockMiddlewareHandle>();
128 std::make_shared<tf2_ros::Buffer>(std::make_shared<rclcpp::Clock>()),
false
136 EXPECT_FALSE(current_state_monitor.
isActive());
139TEST(CurrentStateMonitorTests, DestructStopTest)
141 auto mock_middleware_handle = std::make_unique<MockMiddlewareHandle>();
144 EXPECT_CALL(*mock_middleware_handle, resetJointStateSubscription);
145 EXPECT_CALL(*mock_middleware_handle, now);
151 std::make_shared<tf2_ros::Buffer>(std::make_shared<rclcpp::Clock>()),
false
154 EXPECT_TRUE(current_state_monitor.
isActive());
159TEST(CurrentStateMonitorTests, NoModelTest)
162 moveit::core::RobotModelPtr robot_model =
nullptr;
167 std::make_unique<MockMiddlewareHandle>(), robot_model,
168 std::make_shared<tf2_ros::Buffer>(std::make_shared<rclcpp::Clock>()),
false),
169 std::invalid_argument);
172TEST(CurrentStateMonitorTests, HaveCompleteStateConstructFalse)
177 std::make_shared<tf2_ros::Buffer>(std::make_shared<rclcpp::Clock>()),
false
185TEST(CurrentStateMonitorTests, WaitForCompleteStateWaits)
187 auto mock_middleware_handle = std::make_unique<MockMiddlewareHandle>();
189 auto nanoseconds_slept = std::chrono::nanoseconds(0);
190 ON_CALL(*mock_middleware_handle, sleepFor)
191 .WillByDefault(testing::Invoke([&](
const std::chrono::nanoseconds& nanoseconds) {
192 nanoseconds_slept += nanoseconds;
199 std::make_shared<tf2_ros::Buffer>(std::make_shared<rclcpp::Clock>()),
false
206 EXPECT_NEAR(nanoseconds_slept.count(), 1e+9, 1e3);
211 ::testing::InitGoogleTest(&argc, argv);
212 return RUN_ALL_TESTS();
Dependency injection class for testing the CurrentStateMonitor.
virtual std::string getJointStateTopicName() const =0
Get the joint state topic name.
virtual void createStaticTfSubscription(TfCallback callback)=0
Creates a static transform message subscription.
virtual void resetTfSubscriptions()=0
Reset the static & dynamic transform subscriptions.
virtual void resetJointStateSubscription()=0
Reset the joint state subscription.
virtual bool sleepFor(const std::chrono::nanoseconds &nanoseconds) const =0
Block for the specified amount of time.
virtual void createJointStateSubscription(const std::string &topic, JointStateUpdateCallback callback)=0
Creates a joint state subscription.
std::function< void(const tf2_msgs::msg::TFMessage::ConstSharedPtr)> TfCallback
virtual std::string getDynamicTfTopicName() const =0
Get the dynamic transform topic name.
virtual rclcpp::Time now() const =0
Get the current time.
virtual void createDynamicTfSubscription(TfCallback callback)=0
Creates a dynamic transform message subscription.
virtual bool ok() const =0
Uses rclcpp::ok to check the context status.
virtual std::string getStaticTfTopicName() const =0
Get the static transform topic name.
Monitors the joint_states topic and tf to maintain the current state of the robot.
void startStateMonitor(const std::string &joint_states_topic="joint_states")
Start monitoring joint states on a particular topic.
bool isActive() const
Check if the state monitor is started.
bool haveCompleteState() const
Query whether we have joint state information for all DOFs in the kinematic model.
void stopStateMonitor()
Stop monitoring the "joint_states" topic.
bool waitForCompleteState(double wait_time_s) const
Wait for at most wait_time_s seconds until the complete robot state is known.
int main(int argc, char **argv)
TEST(CurrentStateMonitorTests, StartCreateSubscriptionTest)
moveit::core::RobotModelPtr loadTestingRobotModel(const std::string &package_name, const std::string &urdf_relative_path, const std::string &srdf_relative_path)
Loads a robot model given a URDF and SRDF file in a package.
std::function< void(sensor_msgs::msg::JointState::ConstSharedPtr)> JointStateUpdateCallback
MOCK_METHOD(void, resetTfSubscriptions,(),(override))
MOCK_METHOD(std::string, getDynamicTfTopicName,(),(const, override))
MOCK_METHOD(bool, ok,(),(const, override))
MOCK_METHOD(void, resetJointStateSubscription,(),(override))
MOCK_METHOD(rclcpp::Time, now,(),(const, override))
MOCK_METHOD(void, createJointStateSubscription,(const std::string &topic, planning_scene_monitor::JointStateUpdateCallback callback),(override))
MOCK_METHOD(bool, sleepFor,(const std::chrono::nanoseconds &nanoseconds),(const, override))
MOCK_METHOD(void, createStaticTfSubscription,(TfCallback callback),(override))
MOCK_METHOD(std::string, getJointStateTopicName,(),(const, override))
MOCK_METHOD(void, createDynamicTfSubscription,(TfCallback callback),(override))
MOCK_METHOD(std::string, getStaticTfTopicName,(),(const, override))