ROS控制机械臂【3】:使用Qt Creator加载Rviz显示机械臂模型

文章目录

      • 背景
      • 实现平台
      • 实现过程

这篇笔记主要记录使用Qt加载Rviz的过程,用于实时控制和显示机械臂状态。实现原理是基于Qt的.pro工程加载Rviz,而不是通过Qt中的ROS插件。

背景

项目团队使用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]}'

最终效果如下图所示:

ROS控制机械臂【3】:使用Qt Creator加载Rviz显示机械臂模型_第1张图片

你可能感兴趣的:(ROS,机器人模型,Qt,ROS,Rviz)