对于在QT下进行ROS的开发也是一个不错的选择,兼容性很好,开发很方便。这篇博客总结一下ROS经典入门程序:节点的发布和订阅。
(1)新建一个工作空间:
$ mkdir qtros_ws
(2)打开qt_ros,方式有多种,最直接的方式如下:
$ qtcreator-ros
打开后的界面如下:
(3)File->New File or Project...->Other Project->ROS Workspace,点击choose,如下图所示:
(4) Name处填写工程名,这里取qtros;Distribution和Build System默认不变;Workspace Path选择Browse,选中刚才新建的qtros_ws,点击choose,如下图:
(5)点击Next和Finish,界面如下:
另外该工程下的文件如下:
在后面的使用过程中会发现.workspace为后缀的文件很重要,它是在QT下打开工程的关键文件。此时src文件夹内没有什么文件,接下来就要新建ROS包。
(6)选中src文件夹右键点击Add New...,在弹出的框中选择ROS->Package,点击choose,如下图:
(7) Package Details中填写包名Name,如beginner_tutorials,在Catkin一栏填写需要用到的依赖,如roscpp;其他的选项可以不填,保持默认不动;
(8)点击Next和Finish,完成在qt下ROS包的创建,如下图所示:
如果看不见include和src文件夹,可以点击工程上面的漏斗形的图标,取消勾选Hide Empty Directories即可。这种方法还是不行的话可能重启一下$ qtcreator-ros就OK了!(滑稽~~~)
(9)开始添加文件(即开始编写ros中最基本的节点node),选中beginner_tutorials包下面的src文件,右键点击点击Add New...,在弹出的框中选择ROS->Basic Node,点击choose,如下图:
(10) Name处填写talker,Path保持不变,然后点击Next和Finish:
(11)可以看到在beginner_tutorials/src下新建了一个talker.cpp的文件,如下图:
可以看到talker.cpp文件中有一段默认的代码,现将talker.cpp的代码修改如下:
#include
#include
#include
int main(int argc, char *argv[])
{
ros::init(argc, argv, "talker");
ros::NodeHandle nh;
ros::Publisher pub_ = nh.advertise("chatter", 1000);
ros::Rate loop_rate(10);
int count = 0;
while (ros::ok())
{
std_msgs::String msg;
std::stringstream ss;
ss << "Hello ros!" << count;
msg.data = ss.str();
ROS_INFO("%s", msg.data.c_str());
pub_.publish(msg);
ros::spinOnce();
loop_rate.sleep();
++count;
}
return 0;
}
这段代码就是完成节点的发布。
(12) 和添加talker.cpp节点相同的步骤,添加listener.cpp节点,listener.cpp的代码如下:
#include
#include
void chatter_Callback(const std_msgs::StringConstPtr& msg)
{
ROS_INFO("Listener has receive the message: %s", msg->data.c_str());
}
int main(int argc, char *argv[])
{
ros::init(argc, argv, "listener");
ros::NodeHandle nh;
ros::Subscriber sub_ = nh.subscribe("chatter", 1000, &chatter_Callback);
ros::spin();
return 0;
}
这段代码就是完成节点的订阅。
(13)代码添加完成之后,需要修改CMakeLists.txt文件,主要代码如下(其余代码为注释部分,略过):
cmake_minimum_required(VERSION 2.8.3)
project(beginner_tutorials)
find_package(catkin REQUIRED COMPONENTS
roscpp
)
include_directories(
# include
${catkin_INCLUDE_DIRS}
)
include_directories(include ${catkin_INCLUDE_DIRS})
add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
add_dependencies(talker beginner_tutorials_generate_messages_cpp)
add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
add_dependencies(listener beginner_tutorials_generate_messages_cpp)
(14)选中qtros,右键点击Build进行编译,也可以选择左下角的小锤子进行编译(如果有多个ROS包,那么需要将要编译的工程设为Active Project,在Projects中进行设置);
(15)切换到Projects界面下,选中Build & Run下面的Desktop/Run,即Run Settings,如下图所示:
(16)选择Add Run Step下面的ROS Run Step,在Arguments一栏填写beginner_tutorials talker,前面为包名,后面为节点名;或者直接在Package和Target下分别找到包名和节点,如下图所示:
按照同样的方式添加listener节点,完成后如下图所示:
(17) 开启$ roscore;
(18)选中qtros,右键点击Run运行(或者左下角的绿色三角),便可以在ROS Terminals下看到两个节点运行的结果,如下图所示:
ubuntu16.04版本中QT的ros_qtc_plugin插件的例子