如何从ros启动文件中获取参数并在Qt中使用它?

时间:2014-07-16 02:32:05

标签: c++ qt launch ros

我正在使用ROS Fuerte和qt_ros,因此可以在Qt GUI中集成ROS。我想用

我的Qt GUI中ROS启动文件中的一些参数。在GUI Im的main.cpp文件中 使用ROS启动文件启动这样的过程:

int main(int argc, char **argv) {
    //Roslaunch
    QProcess process;
    process.start("roslaunch", QStringList() << "/home/launch/pow.launch");
    //GUI
    QApplication app(argc, argv);
    pow_gui::MainWindow w(argc,argv);
       w.show();
    app.connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit()));
    int result = app.exec();
    std::cout << "q application finished" << std::endl;
    return result;
}

所以在我的pow.launch中

<launch>
    <param name="/use_sim_time" value="true"/>
    <node name="hector_mapping" pkg="hector_mapping" type="hector_mapping" output="screen">
 <param name="pub_map_odom_transform" value="false"/>
    <remap from="scan" to="scan_2"/>
 <param name="map_frame" value="map"/>

 </node>

    <node name="foo_throttler" type="throttle" pkg="topic_tools" args="messages /scan 10/scan_throttle" /> 
    <node name="foo_throttler1" type="throttle" pkg="topic_tools" args="messages /raw_imu 10/raw_imu_throttle" /> 

    <node name="rosplay" pkg="rosbag" type="play" args="/home/10m_forward5.bag --clock"/>
    <node pkg="tf" type="static_transform_publisher" name="corner_duhhu" args="-0.17 -0.2 0 0 0 0 base_link laser 20"/> 

    <node pkg="tf" type="static_transform_publisher" name="raw_tf" args="0 0 0 0 0 0 /map /raw_frame 10"/> 

    <!--node pkg="analyzer" type="parking"  name="parking" output="screen"/>  -->
    <node pkg="analyzer" type="wst_forward10m"  name="wst_forward10m" output="screen"/> 
    <!--node pkg="analyzer" type="wst_turn"  name="wst_turn" output="screen"/>  -->

</launch>

当我使用节点pkg =“analyzer”type =“wst_forward10m”name =“wst_forward10m”时我想在QT中有一个标签,说我正在使用该节点并且在使用节点时pkg =“analyzer”type =“ wst_turn“name =”wst_turn“希望在QT中显示。

任何帮助?

2 个答案:

答案 0 :(得分:1)

这样做的方法是向QT应用程序添加两个参数,例如argv[1]指定节点类型,argv[2]获取节点名称。 然后通过

启动ros节点
std::string node_type("node_type:=");
std::string node_name("node_name:=");
node_type += argv[1];
node_name += argv[2];
process.start("roslaunch", QStringList() << "/home/launch/pow.launch" 
                                         << node_type 
                                         << node_name);

并且启动文件中的节点如下所示

...
<arg name="node_type" default="wst_forward10m" />
<arg name="node_name" default="wst_forward10m" /> 
<node pkg="analyzer" type="$(arg node_type)" name="$(arg node_type)" output="screen"/> 
...

最后,您在QT应用程序中使用argv [1]和argv [2]的参数值来创建相应的标签。

答案 1 :(得分:1)

正如您在qt_ros中看到的那样,有一个在后台工作的线程ROS节点。因此,使用该节点在参数服务器中存储参数将更加清晰,如此ROS Parameter Server Overview中所做的那样,之后所有已启动的节点都需要来自此服务器的参数。 (我已经很长时间没有找到源代码了:\)