アプリとサービスのすすめ

アプリやIT系のサービスを中心に書いていきます。たまに副業やビジネス関係の情報なども気ままにつづります

ROSでc++の引数(argv)をlaunchファイルで渡す方法

ROSでのc++のコードで引数argument (argv)をlaunchで渡す方法のまとめ。



c++スクリプトの用意

簡単なcppを準備。

cloud_loader.cpp

#include <ros/ros.h>
#include <sensor_msgs/PointCloud2.h>
#include <pcl_conversions/pcl_conversions.h>

#include <cloud_common.h>

class CloudLoadingHandler
{
public:
    CloudLoadingHandler(ros::NodeHandle &nh, const std::string &pcd_file_name):
        loader_(CloudLoader(nh, "cloud_raw", pcd_file_name))
    {}

    void operate()
    {
        loader_.load();
        loader_.convertPCLtoROS();
    }

    void publish()
    {
        loader_.publish();
    }

private:
    CloudLoader loader_;
};


int main(int argc, char **argv)
{
    ros::init(argc, argv, "cloud_loader");
    ros::NodeHandle nh;
    ros::NodeHandle pnh("~");
    std::string pcd_file_name = "data/table_scene_lms400.pcd";
    pnh.getParam("pcd", pcd_file_name);

    CloudLoadingHandler handler(nh, pcd_file_name);
    handler.operate();

    ros::Rate loop_rate(1);
    while (ros::ok())
    {
        handler.publish();
        ros::spinOnce();
        loop_rate.sleep();
    }

    return 0;
}

ros::NodeHandle pnh("~");は値をroslaunchから受け取るのに必要なパラメータ

pnh.getParam("pcd", pcd_file_name);はlaunchファイルの「pcd」という名前を受けて、その値をpcd_file_nameに代入する


起動用launchファイル(loading.launch)

<launch>
  <arg name="in" default="data/table_scene_lms400.pcd"/>
  <node name="cloud_loader" pkg="pcl_execution" type="cloud_loader">
      <param name="pcd" value="$(arg in)"/>
  </node>
  <node name="rviz" pkg="rviz" type="rviz" args="-d $(find pcl_execution)/rviz/loading.rviz" required="true" />
</launch>

param name="pcd" value="$(arg in)" で引数をlaunchファイルからc++スクリプトに渡す。
・デフォルトは「"data/table_scene_lms400.pcd"」


ROSでc++を実行

# コンパイル用にCMakeLists.txtに追記
$ roscd ros_start
$ vi CMakeLists.txt


CMakeLists.txtに以下の2行を追加

add_executable(cloud_loader src/cloud_loader.cpp)
target_link_libraries(cloud_loader
   ${catkin_LIBRARIES}
)
# プログラムで使うためにcatkin_make
cd ~/catkin_ws
catkin_make
>>>
〜〜
## [100%] Linking CXX executable /home/parallels/catkin_ws/devel/lib/pcl_execution/cloud_loader
## [100%] Built target cloud_loader

# 実行ファイルができてるか確認
$ ls devel/lib/pcl_execution
>>>
#### cloud_loader
# launchファイルで起動
roslaunch pcl_execution loading.launch

f:id:trafalbad:20220327123508p:plain

# argumentを代入
roslaunch pcl_execution loading.launch in:=data/from_depth.pcd

f:id:trafalbad:20220327123555p:plain


launchファイルから引数がc++に渡されてるのがわかる。


参考

ROS講座19 roslaunch2