Я использую ROS Fuerte и qt_ros, поэтому могу интегрировать ROS в Qt GUI. Я хотел бы использовать
некоторые параметры из файла запуска ROS в моем Qt GUI. в файле main.cpp графического интерфейса Im
используя файл запуска ROS для запуска prcess, вот так:
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.
Любая помощь?
Один из способов сделать это — добавить два параметра в ваше приложение 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"/>
...
наконец, вы используете значения параметров argv [1] и argv [2] в вашем приложении QT для создания соответствующих вкладок.
Как вы могли видеть в qt_ros, в фоновом режиме работает многопоточный узел ROS. поэтому будет удобнее использовать этот узел для хранения параметров на сервере параметров, как это сделано в этом Обзор сервера параметров ROS и все запущенные узлы впоследствии требуют свои параметры с этого сервера. (Прошло много времени с тех пор, как я это сделал, и я не мог найти исходные коды: \)