背景:
目前正在使用QT creator 开发界面等,因为需要用到ROS的订阅发布机制,订阅别的ROS模块的topic,但是本人的工程是qt的工程(.pro),使用的是qmake编译,是一个单独的应用程序,只能通过调用ros的库的形式调用ros函数。自己没有找到其他的方法把已经写好的大量代码直接加入到别的模块的ros工程中。
步骤:
(1)安装配置好QT: https://blog.csdn.net/ipfpm/article/details/80698659
(2)安装配置好ROS:https://blog.csdn.net/ipfpm/article/details/83504391
(3)特别重要,否则编译不过:
配置qt的启动文件。需要在qt启动时加载ros的环境变量
sudo gedit ~/.local/share/applications/DigiaQt-qtcreator-community.desktop
[Desktop Entry]
Type=Application
Exec=bash -i -c /home/ubuntu/Qt5.10.1/Tools/QtCreator/bin/qtcreator
Name=Qt Creator (Community)
GenericName=The IDE of choice for Qt development.
Icon=QtProject-qtcreator
StartupWMClass=qtcreator
Terminal=false
Categories=Development;IDE;Qt;
MimeType=text/x-c++src;text/x-c++hdr;text/x-xsrc;application/x-designer;application/vnd.qt.qmakeprofile;application/vnd.qt.xml.resource;text/x-qml;text/x-qt.qml;text/x-qt.qbs;
中加上:
bash -i -c
(4)在写的QT工程中加入:即在.pro文件中添加ros头文件路径和动态链接库。
INCLUDEPATH += /opt/ros/kinetic/include
DEPENDPATH += /opt/ros/kinetic/include
LIBS += -L/opt/ros/kinetic/lib -lroscpp -lroslib -lrosconsole -lroscpp_serialization -lrostime
(5)尝试例子:
(5.1)可以现在本地建立一个简单的订阅\发布的ros例子,网上很多.
见:
https://www.cnblogs.com/xuanxiaochen/p/6013886.html
这样就可以实现ros的订阅或者发布.
(4.2)在QT的程序上加上ROS函数:这是一个订阅的程序,但是该程序还是有问题的,因为在ros::spin();处于死循环,导致不能执行a.exec();界面没有显示.
#include "widget.h"
#include <QApplication>
#include "ros/ros.h"
#include "std_msgs/String.h"
//话题回调函数
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO("node_b is receiving [%s]", msg->data.c_str());
qDebug("node_b is receiving [%s]", msg->data.c_str());
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
ros::init(argc, argv, "listener");
ros::NodeHandle node;
ros::Subscriber sub = node.subscribe("message", 1000, chatterCallback);
ros::spin();
return a.exec();
}
在终端运行roscore;
新开终端运行发布程序:
rosrun test1_tutorials test1_a
运行QT,得到:Qt上可以收到发布的信息.
代码实例:
https://download.csdn.net/download/ipfpm/10751251
借鉴自: