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>
・
・デフォルトは「"data/table_scene_lms400.pcd"」
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
# argumentを代入 roslaunch pcl_execution loading.launch in:=data/from_depth.pcd
launchファイルから引数がc++に渡されてるのがわかる。