diff --git a/ros_ign_bridge/README.md b/ros_ign_bridge/README.md index c59cc8ee..16d3665e 100644 --- a/ros_ign_bridge/README.md +++ b/ros_ign_bridge/README.md @@ -9,6 +9,7 @@ service calls. Its support is limited to only the following message types: | ROS type | Ignition Transport type | |--------------------------------|:--------------------------------:| | std_msgs/Bool | ignition::msgs::Boolean | +| std_msgs/Empty | ignition::msgs::Empty | | std_msgs/Float32 | ignition::msgs::Float | | std_msgs/Header | ignition::msgs::Header | | std_msgs/String | ignition::msgs::StringMsg | diff --git a/ros_ign_bridge/include/ros_ign_bridge/builtin_interfaces_factories.hpp b/ros_ign_bridge/include/ros_ign_bridge/builtin_interfaces_factories.hpp index 327e4216..682f445e 100644 --- a/ros_ign_bridge/include/ros_ign_bridge/builtin_interfaces_factories.hpp +++ b/ros_ign_bridge/include/ros_ign_bridge/builtin_interfaces_factories.hpp @@ -35,6 +35,7 @@ #include #include #include +#include #include #include @@ -80,6 +81,24 @@ Factory< const ignition::msgs::Boolean & ign_msg, std_msgs::msg::Bool & ros_msg); +template<> +void +Factory< + std_msgs::msg::Empty, + ignition::msgs::Empty +>::convert_ros_to_ign( + const std_msgs::msg::Empty & ros_msg, + ignition::msgs::Empty & ign_msg); + +template<> +void +Factory< + std_msgs::msg::Empty, + ignition::msgs::Empty +>::convert_ign_to_ros( + const ignition::msgs::Empty & ign_msg, + std_msgs::msg::Empty & ros_msg); + template<> void Factory< diff --git a/ros_ign_bridge/include/ros_ign_bridge/convert_builtin_interfaces.hpp b/ros_ign_bridge/include/ros_ign_bridge/convert_builtin_interfaces.hpp index dee68e7c..67a0200c 100644 --- a/ros_ign_bridge/include/ros_ign_bridge/convert_builtin_interfaces.hpp +++ b/ros_ign_bridge/include/ros_ign_bridge/convert_builtin_interfaces.hpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include @@ -61,6 +62,18 @@ convert_ign_to_ros( const ignition::msgs::Boolean & ign_msg, std_msgs::msg::Bool & ros_msg); +template<> +void +convert_ros_to_ign( + const std_msgs::msg::Empty & ros_msg, + ignition::msgs::Empty & ign_msg); + +template<> +void +convert_ign_to_ros( + const ignition::msgs::Empty & ign_msg, + std_msgs::msg::Empty & ros_msg); + template<> void convert_ros_to_ign( diff --git a/ros_ign_bridge/src/builtin_interfaces_factories.cpp b/ros_ign_bridge/src/builtin_interfaces_factories.cpp index 25c2038e..6ecd0f87 100644 --- a/ros_ign_bridge/src/builtin_interfaces_factories.cpp +++ b/ros_ign_bridge/src/builtin_interfaces_factories.cpp @@ -38,6 +38,16 @@ get_factory_builtin_interfaces( > >("std_msgs/msg/Bool", ign_type_name); } + if ((ros_type_name == "std_msgs/msg/Empty" || ros_type_name.empty()) && + ign_type_name == "ignition.msgs.Empty") + { + return std::make_shared< + Factory< + std_msgs::msg::Empty, + ignition::msgs::Empty + > + >("std_msgs/msg/Empty", ign_type_name); + } if ((ros_type_name == "std_msgs/msg/Float32" || ros_type_name.empty()) && ign_type_name == "ignition.msgs.Float") { @@ -314,6 +324,30 @@ Factory< ros_ign_bridge::convert_ign_to_ros(ign_msg, ros_msg); } +template<> +void +Factory< + std_msgs::msg::Empty, + ignition::msgs::Empty +>::convert_ros_to_ign( + const std_msgs::msg::Empty & ros_msg, + ignition::msgs::Empty & ign_msg) +{ + ros_ign_bridge::convert_ros_to_ign(ros_msg, ign_msg); +} + +template<> +void +Factory< + std_msgs::msg::Empty, + ignition::msgs::Empty +>::convert_ign_to_ros( + const ignition::msgs::Empty & ign_msg, + std_msgs::msg::Empty & ros_msg) +{ + ros_ign_bridge::convert_ign_to_ros(ign_msg, ros_msg); +} + template<> void Factory< diff --git a/ros_ign_bridge/src/convert_builtin_interfaces.cpp b/ros_ign_bridge/src/convert_builtin_interfaces.cpp index 10a5c2de..f23bae00 100644 --- a/ros_ign_bridge/src/convert_builtin_interfaces.cpp +++ b/ros_ign_bridge/src/convert_builtin_interfaces.cpp @@ -68,6 +68,22 @@ convert_ign_to_ros( ros_msg.data = ign_msg.data(); } +template<> +void +convert_ros_to_ign( + const std_msgs::msg::Empty &, + ignition::msgs::Empty &) +{ +} + +template<> +void +convert_ign_to_ros( + const ignition::msgs::Empty &, + std_msgs::msg::Empty &) +{ +} + template<> void convert_ros_to_ign( diff --git a/ros_ign_bridge/test/launch/test_ign_subscriber.launch b/ros_ign_bridge/test/launch/test_ign_subscriber.launch index f871b363..6076cef6 100644 --- a/ros_ign_bridge/test/launch/test_ign_subscriber.launch +++ b/ros_ign_bridge/test/launch/test_ign_subscriber.launch @@ -3,7 +3,9 @@ ("bool"); + ignition::msgs::Boolean bool_msg; + ros_ign_bridge::testing::createTestMsg(bool_msg); + + // ignition::msgs::Empty. + auto empty_pub = node.Advertise("empty"); + ignition::msgs::Empty empty_msg; + // ignition::msgs::Float. auto float_pub = node.Advertise("float"); ignition::msgs::Float float_msg; @@ -170,6 +179,8 @@ int main(int /*argc*/, char **/*argv*/) // Publish messages at 1Hz. while (!g_terminatePub) { + bool_pub.Publish(bool_msg); + empty_pub.Publish(empty_msg); float_pub.Publish(float_msg); header_pub.Publish(header_msg); string_pub.Publish(string_msg); diff --git a/ros_ign_bridge/test/publishers/ros_publisher.cpp b/ros_ign_bridge/test/publishers/ros_publisher.cpp index 846b03de..798e5b14 100644 --- a/ros_ign_bridge/test/publishers/ros_publisher.cpp +++ b/ros_ign_bridge/test/publishers/ros_publisher.cpp @@ -15,6 +15,7 @@ #include #include +#include #include #include #include @@ -46,6 +47,15 @@ int main(int argc, char ** argv) ros::NodeHandle n; ros::Rate loop_rate(1); + // std_msgs::Bool. + ros::Publisher bool_pub = n.advertise("bool", 1000); + std_msgs::Bool bool_msg; + ros_ign_bridge::testing::createTestMsg(bool_msg); + + // std_msgs::Empty. + ros::Publisher empty_pub = n.advertise("empty", 1000); + std_msgs::Empty empty_msg; + // std_msgs::Float32. ros::Publisher float_pub = n.advertise("float", 1000); std_msgs::Float32 float_msg; @@ -184,6 +194,8 @@ int main(int argc, char ** argv) while (ros::ok()) { // Publish all messages. + bool_pub.publish(bool_msg); + empty_pub.publish(empty_msg); float_pub.publish(float_msg); header_pub.publish(header_msg); string_pub.publish(string_msg); diff --git a/ros_ign_bridge/test/subscribers/ign_subscriber.cpp b/ros_ign_bridge/test/subscribers/ign_subscriber.cpp index cdf16c8d..2b0427a8 100644 --- a/ros_ign_bridge/test/subscribers/ign_subscriber.cpp +++ b/ros_ign_bridge/test/subscribers/ign_subscriber.cpp @@ -47,6 +47,30 @@ class MyTestClass private: ignition::transport::Node node; }; +///////////////////////////////////////////////// +TEST(IgnSubscriberTest, Boolean) +{ + MyTestClass client("bool"); + + using namespace std::chrono_literals; + ros_ign_bridge::testing::waitUntilBoolVar( + client.callbackExecuted, 10ms, 200); + + EXPECT_TRUE(client.callbackExecuted); +} + +///////////////////////////////////////////////// +TEST(IgnSubscriberTest, Empty) +{ + MyTestClass client("empty"); + + using namespace std::chrono_literals; + ros_ign_bridge::testing::waitUntilBoolVar( + client.callbackExecuted, 10ms, 200); + + EXPECT_TRUE(client.callbackExecuted); +} + ///////////////////////////////////////////////// TEST(IgnSubscriberTest, Float) { diff --git a/ros_ign_bridge/test/subscribers/ros_subscriber.cpp b/ros_ign_bridge/test/subscribers/ros_subscriber.cpp index 26ac5f00..c794b78a 100644 --- a/ros_ign_bridge/test/subscribers/ros_subscriber.cpp +++ b/ros_ign_bridge/test/subscribers/ros_subscriber.cpp @@ -17,6 +17,7 @@ #include #include +#include #include #include #include @@ -70,6 +71,30 @@ class MyTestClass private: ros::Subscriber sub; }; +///////////////////////////////////////////////// +TEST(ROSSubscriberTest, Bool) +{ + MyTestClass client("bool"); + + using namespace std::chrono_literals; + ros_ign_bridge::testing::waitUntilBoolVarAndSpin( + client.callbackExecuted, 10ms, 200); + + EXPECT_TRUE(client.callbackExecuted); +} + +///////////////////////////////////////////////// +TEST(ROSSubscriberTest, Empty) +{ + MyTestClass client("empty"); + + using namespace std::chrono_literals; + ros_ign_bridge::testing::waitUntilBoolVarAndSpin( + client.callbackExecuted, 10ms, 200); + + EXPECT_TRUE(client.callbackExecuted); +} + ///////////////////////////////////////////////// TEST(ROSSubscriberTest, Float) { diff --git a/ros_ign_bridge/test/test_utils.h b/ros_ign_bridge/test/test_utils.h index 13a71914..3b02e8bc 100644 --- a/ros_ign_bridge/test/test_utils.h +++ b/ros_ign_bridge/test/test_utils.h @@ -20,6 +20,8 @@ #include #include +#include +#include #include #include #include @@ -104,6 +106,29 @@ namespace testing /// ROS test utils ////////////////////////////////////////////////// + /// \brief Create a message used for testing. + /// \param[out] _msg The message populated. + void createTestMsg(std_msgs::Bool &_msg) + { + _msg.data = true; + } + + /// \brief Compare a message with the populated for testing. + /// \param[in] _msg The message to compare. + void compareTestMsg(const std_msgs::Bool &_msg) + { + std_msgs::Bool expected_msg; + createTestMsg(expected_msg); + + EXPECT_EQ(expected_msg.data, _msg.data); + } + + /// \brief Compare a message with the populated for testing. Noop for Empty + /// \param[in] _msg The message to compare. + void compareTestMsg(const std_msgs::Empty &) + { + } + /// \brief Create a message used for testing. /// \param[out] _msg The message populated. void createTestMsg(std_msgs::Float32 &_msg) @@ -772,6 +797,29 @@ namespace testing /// Ignition::msgs test utils ////////////////////////////////////////////////// + /// \brief Create a message used for testing. + /// \param[out] _msg The message populated. + void createTestMsg(ignition::msgs::Boolean &_msg) + { + _msg.set_data(true); + } + + /// \brief Compare a message with the populated for testing. + /// \param[in] _msg The message to compare. + void compareTestMsg(const ignition::msgs::Boolean &_msg) + { + ignition::msgs::Boolean expected_msg; + createTestMsg(expected_msg); + + EXPECT_EQ(expected_msg.data(), _msg.data()); + } + + /// \brief Compare a message with the populated for testing. Noop for Empty + /// \param[in] _msg The message to compare. + void compareTestMsg(const ignition::msgs::Empty &) + { + } + /// \brief Create a message used for testing. /// \param[out] _msg The message populated. void createTestMsg(ignition::msgs::Float &_msg)