[ros-users] ROSTest: Verify Publications

Vedhæftede filer:
Indlæg som e-mail
+ (text/plain)
+ smime.p7s (application/pkcs7-signature)
+ (text/plain)
Slet denne besked
Besvar denne besked
Skribent: Fazzari, Kyle R CIV NSWCDD, G82
Til: ros-users@lists.ros.org
Emne: [ros-users] ROSTest: Verify Publications
I have several pieces of software in ROS, all of which are pretty thoroughly unit and integration tested. However, there's one aspect of testing within ROS that I have yet to accomplish with much success: Verifying publications.

Note that I'm still stuck in the dark ages of Fuerte, but I believe my question is relevant to more recent releases as well.

I currently have several tests within rostest, which looks like this in my CMakeLists.txt:

    rosbuild_add_executable(my_tests EXCLUDE_FROM_ALL ${MY_TESTS})

Running this with `make test` also runs a roscore (since node.test is a launch file), so these tests can make use of classes that require a connection to roscore. I'd like to use this to verify publications, but it's not working reliably, which makes me think I'm doing something wrong. As an example:

class TestSubscriber
        TestSubscriber() : receivedMessage(false) {}

        void callback(const std_msgs::Int32ConstPtr &newMessage)
            receivedMessage = true;
            message = newMessage;

        bool receivedMessage;
        std_msgs::Int32ConstPtr message;

TEST(MyTest, TestPublication)
    // This class is the one that will publish on the "output" topic. It will create a node handle
    // and advertise in its constructor.
    MyPublishingClass publishingClass;

    ros::NodeHandle nodeHandle;

    TestSubscriber subscriber;
    ros::Subscriber rosSubscriber = nodeHandle.subscribe("output", 1, &TestSubscriber::callback, &subscriber);
    ASSERT_EQ(1, rosSubscriber.getNumPublishers()); // This passes


    ros::spinOnce(); // Spin so that publication can get to subscription

    EXPECT_TRUE(subscriber.receivedMessage); // This may or may not be true

Depending on how the MyPublishingClass is written, this test may pass or fail due to that last line. To give a specific example, I have a class that reads through a bagfile and publishes specific topics. If that class publishes topics with:


the test passes. If instead the class publishes with:


the test fails (even though the node still runs normally outside of the test, so I know that publication is actually happening). I have more examples of similar weirdness, but I'm hoping this is enough to describe my problem.

So, down to my questions:

1) Why is this so finicky? I realize that it's basically a node subscribing to its own publication, but that shouldn't be a problem. Should it?
2) Am I doing this wrong? Is there a better way to test ROS publications? Note that the class in question is _not_ a complete ROS node, and cannot be tested as such.

Thank you for your help!

Kyle Fazzari
Computer Engineer

ros-users mailing list