这是一个基于QT5的、用于ROS环境下的交互软件。
注:这是我本科毕业设计的一部分
在ROS程序开发中,很多情况下会遇到编写图形界面程序的需求。有几种方法可以在ROS中开发图形界面程序,若基于Python语言,
可以使用pyqt、thinker等图形界面库。若基于C++,最好的选择是Qt。作者存在通过点云库处理点云的需求,但是点云库缺乏一个稳定、高效的
Python接口。因此,这里选择C++而不是Python开发交互程序,选择Qt作为开发框架。
虽然ROS官方支持Qt,比如可以使用 catkin_create_qt_pkg命令创建Qt功能包,而且ROS中很多基本工具也都是基于Qt的。但是ROS Kinect
版本只支持Qt4库,无法有效兼容当前流行的程序。因此,这里使用Levi-Armstrong开发的Qt Creator插件:ros_qtc_plugin,使用Qt5开发交互程序。
本程序基于Qt5 进行开发,程序的启动界面如下图所示。
交互程序主界面
如上图所示,左上角的黑框是交互终端,用于显示文本交互的结果。左边中间是输入区域,可以通过文本输入,也可以通过语音进行输入。 左下角用于显示原始的RGB-D帧。中间四个显示区域分别用于显示实例分割的结果、稠密的三维点云、稀疏的三维特征点、导航地图。 其中稠密三维点云和稀疏三维特征点均使用点云控件显示,在点云控件中还可以显示实例包围框和移动机器人的运动轨迹。右侧是配置选项, 比如可以设置程序监听的话题(Topic)、设置显示的点云大小等。
上面提到的用于渲染点云的控件是图形渲染库vtk编译生成的QVTKWidget组件。最著名的图形渲染库是OpenGL和VTK,这里选择后者 用于渲染点云。这是因为点云库的可视化类CloudViewer和PCLVisualizer是基于vtk图形库的,这里使用vtk可以兼容PCL提供的相关程序接口。
节点需要轮循接收ROS话题消息,而Qt库也需要轮循监听交互事件,要解决这两者的冲突,一个可选的办法是构造两个线程:一个用于 接收ROS消息,另一个用于监听事件。但是在这里,ROS操作与Qt库的交互十分频繁,如果按照这种思路实现将非常复杂,也会造成性能下降。 解决办法是通过定时器轮循ROS消息,而把代码都放在同一个线程中,这样编写的代码更加清晰、高效。
运行中的交互界面
上图是正在运行的交互节点程序,由图可知交互节点可以完美的监测系统各个部分的运行结果。此外,用户还可以在图 4.10左侧的命令 输入框或语音输入命令中输入命令,接着交互节点会将输入的命令通过服务机制调用命令节点执行,然后显示命令执行的结果。