项目团队使用Qt开发了一个集通讯接口、数据接收/下发/显示、算法运行等集大成的一个机械臂软件界面程序,同时想在软件界面上实时显示机械臂运动状态。Rviz是ROS的一个可视化工具,用于可视化传感器的数据和状态信息, 但它是一个独立的窗口,集成性不好,因此需要将Rviz嵌入到Qt工程中来,并在软件界面中实时显示真实机械臂对应的运动状态。
linux: Ubantu 18.04
ros: Melodic
Qt Creator: 5.12
(1)首先创建QWidget工程
(2)在.pro文件中增加ROS头文件及动态链接库
#ros for qt
INCLUDEPATH += /opt/ros/melodic/include
DEPENDPATH += /opt/ros/melodic/include
LIBS += -L/opt/ros/melodic/lib -lroscpp -lroslib -lrosconsole -lroscpp_serialization -lrostime -lrviz
LIBS += /opt/ros/melodic/lib/libroscpp.so
LIBS += /opt/ros/melodic/lib/libroslib.so
INCLUDEPATH += /usr/include/OGRE
LIBS +=-lboost_system -ljsoncpp -lboost_thread -lboost_filesystem -lboost_regex -lconsole_bridge
(3)为Qt添加环境变量
通过图标启动Qt Creator无法加载ros的环境变量,即使在.pro文件中加入了ros库文件也无法编译通过,因此需要为其加入ros环境变量。首先找到桌面图标Qt Creator 对应的启动文件,我的位置在:
/usr/local/share/applications/org.qt-project.qtcreator.desktop
然后打开.desktop文件
sudo gedit /usr/local/share/applications/org.qt-project.qtcreator.desktop
在其中加入:
bash -i -c
[Desktop Entry]
Type=Application
Exec=bash -i -c "/opt/Qt5.12.12/Tools/QtCreator/bin/qtcreator" %F
Name=Qt Creator
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;
(4)在main文件中初始化ros节点
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
ros::init(argc,argv,"robotshow");
ros::NodeHandle nh;
Widget w;
w.show();
return a.exec();
}
(5)在Widget.cpp中调用Rviz库的相关接口
//创建rviz容器,其本质是一个qwidget容器
rviz::RenderPanel *render_panel = new rviz::RenderPanel;
//设置布局
ui->verticalLayout->addWidget(render_panel);
//初始化rviz控制对象
rviz::VisualizationManager *manager = new rviz::VisualizationManager(render_panel);
render_panel->initialize(manager->getSceneManager(),manager); //实现camera放大,缩小和平移
//显示
manager->initialize();
manager->removeAllDisplays();
manager->startUpdate();
//添加网格图层
manager->setFixedFrame("/base");
rviz::Display *grid = manager->createDisplay("rviz/Grid","adjustable grid",true);
grid->subProp("Line Style")->setValue("Billboards");
grid->subProp("Color")->setValue(QColor(125,125,125));
//添加机器人图层(根据原Rviz左侧的参数设置即可)
rviz::Display *rot = manager->createDisplay("rviz/RobotModel","cobot",true);
rot->subProp("Visual Enabled")->setValue("true");
rot->subProp("Collision Enabled")->setValue("false");
rot->subProp("Robot Description")->setValue("robot_description");
rot->subProp("Alpha")->setValue("1");
(6)启动ROS,加载机器人参数
首先建立一个的.launch文件
<launch>
<param name "robot_description" textfile = "$(find cobot_urdf).urdf/cobot_urdf.urdf">
<node
name = "robot_state_publisher"
pkg = "robot_state_publisher"
type = "robot_state_publisher"
</launch>
在运行Qt之前,先运行roscore,并运行.launch文件将机器人模型参数加载到ros的参数服务器中(推荐在Qt中使用system()函数运行终端指令,这样系统集成度高)
roscore
roslaunch cobot_urdf qtlaunch.urdf
(7)启动Qt Creator 显示机器人模型
运行工程,此时rviz已将机器人加载进来。由于删除了 joint_state_publisher 节点,在一开始加载的时候会发现Rviz中的模型不对,但是没关系,可以在窗体初始化的同时加载一个joint_states的话题,就可以让机械臂模型正常显示:
rostopic pub -1 /joint_states sensor_msgs/JointState '{header: auto, name:['jont2','joint3','joint4','joint5','joint6','joint7'], position:[0,0,0,0,0,0,0]}'
最终效果如下图所示: