とりあえず,以下のコードを見ていただきたい.

#include <ros/ros.h>

void get_params() {
    ros::NodeHandle np{"~"};
    float f;
    np.param("foobar", f, 4.2f);

    ROS_INFO_STREAM("exitting get_params with foobar == " << f);
}

int
main(int argc, char* argv[]) {
    ros::init(argc, argv, "sample_node");

    ROS_INFO_STREAM("before calling get_params");
    get_params();
    ROS_INFO_STREAM("after calling get_params");

    ros::spin();

    return 0;
}

一見なんら問題ないこのコードだが,実行するとおかしいことが起こる.

問題

コードを実行すると,出力が以下のようになる:

[ INFO] [/sample_node] [1536863298.820675562]: before calling get_params
[ INFO] [/sample_node] [1536863298.825877817]: exitting get_params with foobar == 42.42

最後の after calling get_params が出力されていない.

解決策

get_params に参照を投げるようにする.つまり,

#include <ros/ros.h>

void get_params(const ros::NodeHandle& np) {
    float f;
    np.param("foobar", f, 4.2f);

    ROS_INFO_STREAM("exitting get_params with foobar == " << f);
}

int
main(int argc, char* argv[]) {
    ros::init(argc, argv, "sample_node");

    auto np = ros::NodeHandle{"~"};
    ROS_INFO_STREAM("before calling get_params");
    get_params(np);
    ROS_INFO_STREAM("after calling get_params");

    ros::spin();

    return 0;
}

出力は以下のようになる:

[ INFO] [/sample_node] [1536863710.670982067]: before calling get_params
[ INFO] [/sample_node] [1536863710.672086878]: exitting get_params with foobar == 42.42
[ INFO] [/sample_node] [1536863710.672117960]: after calling get_params

なぜ起こるか?

正直,謎です.分かる方がいたら教えてください.おそらく ros::NodeHandle 内の参照カウンタ的なものの影響のような気がする.