在C ++中像roslaunch一样:使用特定类型启动NodeHandle

时间:2017-09-08 10:20:00

标签: c++ ros

我是ROS的新手,我正在寻找以编程方式启动'video_stream_opencv'节点。

以下链接: http://wiki.ros.org/video_stream_opencv

启动文件与命令roslaunch一起运行良好                                                                                                  

<!-- images will be published at /camera_name/image with the image transports plugins (e.g.: compressed) installed -->
<group ns="$(arg camera_name)">
    <node pkg="video_stream_opencv" type="video_stream" name="$(arg camera_name)_stream" output="screen"> 
        <remap from="camera" to="image_raw" />
        <param name="camera_name" type="string" value="$(arg camera_name)" />
        <param name="video_stream_provider" type="string" value="$(arg video_stream_provider)" />
        <param name="fps" type="int" value="$(arg fps)" />
        <param name="frame_id" type="string" value="$(arg frame_id)" />
        <param name="camera_info_url" type="string" value="$(arg camera_info_url)" />
        <param name="flip_horizontal" type="bool" value="$(arg flip_horizontal)" />
        <param name="flip_vertical" type="bool" value="$(arg flip_vertical)" />
        <param name="width" type="int" value="$(arg width)" />
        <param name="height" type="int" value="$(arg height)" />
    </node>

    <node if="$(arg visualize)" name="$(arg camera_name)_image_view" pkg="image_view" type="image_view">
        <remap from="image" to="image_raw" />
    </node>
</group>

但是现在我正在尝试用C ++代码做同样的事情但是我没有看到如何在我的节点中设置'type'属性......

printf("Started ROS thread\n");

//glutInit(&argc, argv);

ros::init(argc, argv, "camera_name);
ROS_INFO("camera_name started");


// MY params to set
std::string camera_name = "toto";
std::string video_stream_provider = "toto";
int  fps  = 30;
std::string  frame_id= "toto";
std::string  camera_info_url= "toto";
bool flip_horizontal= false;
bool flip_vertical= false;
int width = 30;
int height = 30;

ros::NodeHandle nh;
ros::M_string remappings;
remappings.insert(std::make_pair("camera", "image_raw"));
ros::NodeHandle node_handle(nh, "camera_name",remappings);

node_handle.setParam("type",video_stream);
node_handle.setParam("camera_name",camera_name);
node_handle.setParam("video_stream_provider",video_stream_provider );
node_handle.setParam("fps",fps);
node_handle.setParam("frame_id",frame_id);
node_handle.setParam("camera_info_url", camera_info_url);
node_handle.setParam("flip_horizontal", flip_horizontal);
node_handle.setParam("flip_vertical",flip_vertical);
node_handle.setParam("width", width);
node_handle.setParam("height", height);

2 个答案:

答案 0 :(得分:0)

我知道启动rosnode的唯一两种方法是使用rosrun的终端或启动文件。

https://answers.ros.org/question/198279/how-to-start-a-ros-node/

答案 1 :(得分:0)

我假设您是在询问为rosnode设置参数类型的问题。

在roscpp中,包括/ros/node_handle.h, setParam()确实有多个变体,每个变体旨在处理特定类型的参数。

 void setParam(const std::string& key, const std::string& s) const;

 void setParam(const std::string& key, const char* s) const;

 void setParam(const std::string& key, double d) const;

以此类推。

您已经在代码中完成了此操作。