【问题标题】:How to get parameter from ros launch file and use it in Qt?如何从 ros 启动文件中获取参数并在 Qt 中使用它?
【发布时间】:2014-07-16 02:32:05
【问题描述】:

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

我的 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 中显示。

有什么帮助吗?

【问题讨论】:

    标签: c++ qt launch ros


    【解决方案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] 的参数值来创建相应的选项卡。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多