這里只介紹使用roslaunch指令運行l(wèi)aunch文件時進行參數(shù)傳遞的情況
0. 常見launch文件寫法
//launch文件寫法
<launch>
<node pkg="camera_driver" type="robot_detector" name="cama_detector" launch-prefix="xterm-e" output="screen"/>
</launch>
- pkg:功能包名
- type:可執(zhí)行文件名稱
- name:節(jié)點名字
- launch-prefix:rosrun命令的啟動前綴头镊,輸出信息在另一個獨立終端
- output:輸出到屏幕上
1. 使用參數(shù)服務(wù)器進行參數(shù)傳遞
//launch文件寫法
<launch>
<param name="file_name" type="string" value="/home/nvidia/camera_parameters.yml" />
<node pkg="camera_driver" type="robot_detector" name="camera_detector" launch-prefix="xterm-e" output="screen">
<param name="camera_name" type="string" value="/camera" />
</node>
<node pkg="camera_driver" type="robot_detector" name="camerab_detector" launch-prefix="xterm-e" output="screen" />
</launch>
//CPP文件中的調(diào)用方法
std::string camera_name; //如果該變量為全局變量灌曙,將該變量的聲明放到全局范圍內(nèi)
ros::param::get("~camera_name", camera_name); //"~camera_name"表私有參數(shù),在launch文件中,將<param.../>寫到<node.../>里面,那么參數(shù)就是私有參數(shù)
ros::param::get("file_name", filename); //"filename"這里使用全局參數(shù),即其他節(jié)點也可以使用
2. 使用mian參數(shù)進行參數(shù)傳遞
//launch文件寫法
<launch>
<param name="file_name" type="string" value="/home/nvidia/camera_parameters.yml" />
<node pkg="camera_driver" type="robot_detector" name="camera_detector" args="filename" launch-prefix="xterm-e" output="screen" />
</launch>
//CPP文件中的調(diào)用方法
ros::init(argc, argv, "robot_detector");
if (argc != 2)
{
ROS_ERROR("need turtle name as argument");
return -1;
};
camera_name = argv[1];
3. 具體案例解析之main參數(shù)傳遞
- launch文件
<launch>
<node pkg="camera_driver" type="camera_sub" name="cameraa_shower" args=" /cameraa" launch-prefix="xterm -e" output="screen" />
<node pkg="camera_driver" type="camera_sub" name="camerab_shower" args=" /camerab" launch-prefix="xterm -e" output="screen" />
<node pkg="camera_driver" type="camera_sub" name="camerac_shower" args=" /camerac" launch-prefix="xterm -e" output="screen" />
<node pkg="camera_driver" type="camera_sub" name="camerad_shower" args=" /camerad" launch-prefix="xterm -e" output="screen" />
</launch>
// args文件之前有一個空格,一定不要忘記了
// pkg是包名,type是可執(zhí)行文件名稱次屠,name是節(jié)點名
- CPP文件
#include <ros/ros.h>
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <image_transport/image_transport.h>
#include <cv_bridge/cv_bridge.h>
using namespace cv;
using namespace std;
std::string camera_name; //全局變量
void imageCallback(const sensor_msgs::ImageConstPtr &msg)
{
try
{
cout << camera_name << " : all is ok!!!" << endl;
imshow(camera_name, cv_bridge::toCvShare(msg, "bgr8")->image);
waitKey(5);
cout << "================================================================" << endl;
}
catch (cv_bridge::Exception &e)
{
ROS_ERROR("Could not convert from '%s' to 'bgr8'.", msg->encoding.c_str());
}
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "image_shower");
if (argc != 2) //對輸入?yún)?shù)數(shù)量進行判斷
{
ROS_ERROR("need turtle name as argument");
return -1;
};
camera_name = argv[1];
ros::NodeHandle nh;
namedWindow(camera_name, CV_WINDOW_NORMAL);
image_transport::ImageTransport it(nh);
image_transport::Subscriber sub = it.subscribe(camera_name + "/image", 1, imageCallback);
ros::spin();
cv::destroyWindow(camera_name);
}
4. 具體案例解析之參數(shù)服務(wù)器參數(shù)傳遞
- launch文件
<launch>
<node pkg="video_driver" type="camera_sub" name="camera_shower" launch-prefix="xterm -e" output="screen">
<param name="camera_name" type="string" value="/camera" />
</node>
</launch>
- CPP文件
#include <ros/ros.h>
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <image_transport/image_transport.h>
#include <cv_bridge/cv_bridge.h>
using namespace cv;
using namespace std;
std::string camera_name;
void imageCallback(const sensor_msgs::ImageConstPtr &msg)
{
try
{
cout << camera_name << " : all is ok!!!" << endl;
imshow(camera_name, cv_bridge::toCvShare(msg, "bgr8")->image);
waitKey(5);
cout << "================================================================" << endl;
}
catch (cv_bridge::Exception &e)
{
ROS_ERROR("Could not convert from '%s' to 'bgr8'.", msg->encoding.c_str());
}
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "image_shower");
ros::param::get("~camera_name", camera_name); //私有參數(shù)解析,也可以通過ros::param::set("~camera_name", camera_name)進行參數(shù)設(shè)置
ros::NodeHandle nh;
namedWindow(camera_name, CV_WINDOW_NORMAL);
image_transport::ImageTransport it(nh);
image_transport::Subscriber sub = it.subscribe(camera_name + "/image", 1, imageCallback);
ros::spin();
cv::destroyWindow(camera_name);
}