#QT实现UI界面控制小海龟
目录
1、启动终端(Ctrl+Alt+T),新建一个工作空间
lzw08@ubuntu:~$ mkdir -p ros_ws/src
说明:mkdir是新建一个文件夹/目录的命令,-p表示可以创建多级目录,即在文件夹”ros_ws“内再创建一个”src“文件夹。
2、进入工作空间并对其进行编译(catkin_make)
lzw08@ubuntu:~$ cd ros_ws
lzw08@ubuntu:~/ros_ws$ catkin_make
说明:编译完成后ros_ws里面会出现两个新的文件夹devel和build,这时ros_ws才称得上是真正意义上的工作空间。
3、进入src文件夹内创建工作包
lzw08@ubuntu:~/ros_ws$ cd src
lzw08@ubuntu:~/ros_ws/src$ catkin_create_pkg turtle roscpp rospy std_msgs
说明:所谓的工作包也是文件夹,它必须创建在工作空间内的src里面。catkin_create_pkg是创建工作包的命令,“turtle”是工作包的名字,后面跟的都是工作包的依赖。
创建完工作包后,它里面包含上图四个部分,其中,src是用来放置.cpp文件的,CMakeLists.txt里面写了很多内容,编译时根据其里面写的编译规则进行编译。
4、新建C++代码,实现UI界面
1)新建.cpp文件
lzw08@ubuntu:~/ros_ws/src/turtle$ cd src
lzw08@ubuntu:~/ros_ws/src/turtle/src$ touch turtle_qt.cpp
说明:.cpp 文件都是放在工作包里面的src目录下的,所以要先进入到工作包里面的src目录才能新建.cpp文件
2)打开.cpp文件并粘贴代码
lzw08@ubuntu:~/ros_ws/src/turtle/src$ gedit turtle_qt.cpp
#include <iostream>
#include "ros/ros.h"
#include "std_msgs/String.h"
#include "geometry_msgs/Twist.h"
#include <QtWidgets>
#include <QApplication>
using namespace std;
const ros::Publisher *publisherPtr;
QLineEdit *editLinear;
QLineEdit *editDegrees;
QPushButton *btnSend;
void btnClicked()
{
double linearX = editLinear->text().toDouble();
double angularZ = editDegrees->text().toDouble();
//创建消息
geometry_msgs::Twist twist;
//填充消息
twist.linear.x = linearX;
twist.angular.z = angularZ * M_PI / 180;
//发送消息
publisherPtr->publish(twist);
}
int main(int argc, char **argv)
{
// 创建节点
string nodeName = "turtle_qt";
ros::init(argc, argv, nodeName);
ros::NodeHandle node;
//通过节点创建发布者
string topicName = "/turtle1/cmd_vel";
const ros::Publisher &publisher = node.advertise<geometry_msgs::Twist>(topicName, 1000);
publisherPtr = &publisher;
//创建Qt Application
QApplication app(argc, argv);
QWidget window;
// 设置窗体样式
window.resize(400, 0);
window.setWindowTitle("智能机器⼈实验室——海⻳机器⼈控制UI界⾯");
// 设置布局
QFormLayout *layout = new QFormLayout();
window.setLayout(layout);
editLinear = new QLineEdit();
editLinear->setText("0.0");
layout->addRow("线速度", editLinear);
editDegrees = new QLineEdit();
editDegrees->setText("0.0");
layout->addRow("⻆速度", editDegrees);
btnSend = new QPushButton("发送");
layout->addRow(btnSend);
//显⽰窗体
window.show();
//点击事件
btnSend->connect(btnSend, &QPushButton::clicked, &window, btnClicked);
return app.exec();
}
5、点击右上角的保存,然后关闭.cpp文件
6、回到上级目录,即工作包里面,修改CMakeLists.txt文件
lzw08@ubuntu:~/ros_ws/src/turtle/src$ cd ..
lzw08@ubuntu:~/ros_ws/src/turtle$ gedit CMakeLists.txt
1) 把右下角的“显示行号”打开:
2)第24行敲回车,粘贴以下代码:
##############################################################################
# Qt Environment
##############################################################################
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
find_package(Qt5 COMPONENTS Core Gui Widgets PrintSupport)
##############################################################################
3)第144行注释打开,改成下图:
说明:turtle_qt是节点名,turtle_qt.cpp即步骤4新建的C++代码。
4)第157行~163行改为下图:
Qt5::Core
Qt5::Gui
Qt5::Widgets
Qt5::PrintSupport
改完之后点击右上角的保存,然后关闭。
7、回到工作空间下编译
lzw08@ubuntu:~/ros_ws/src/turtle$ cd ~
lzw08@ubuntu:~$ cd ros_ws
lzw08@ubuntu:~/ros_ws$ catkin_make
编译完成没错误就可以运行了。
8、配置环境,然后运行
运行前必须打开一个新的终端运行主节点(roscore),才能顺利运行(任何节点运行前都要先把主节点运行起来)
lzw08@ubuntu:~/ros_ws$ source devel/setup.bash
lzw08@ubuntu:~/ros_ws$ rosrun turtle turtle_qt
9、运行结果是一个UI界面
10、把小海龟运行起来,就可以利用UI界面控制它动起来
lzw08@ubuntu:~$ rosrun turtlesim turtlesim_node
11、给定一个线速度与角速度值,小海龟便能动起来
12、补充几个常用快捷键
1)Tab
用来补全命令或者文件夹名、节点名等
2)Ctrl+C
结束节点/命令的运行
3)Ctrl+L
清屏,相当于“clear”。但是不是删除,滑动鼠标滚轮还是可以找到之前输入的内容
4)Ctrl+Alt+T
打开一个新的终端