QT配置ROS一些小问题(1)中我发现!!!
如果你是用的ros2做开发,我建议你还是用colcon吧
但是我会有个问题:一旦使用QT自己的package去创建包的话大概率会创建失败(我没找到解决办法)
我的解决思路:
我不使用QT自带的包创建工具去创建,还是使用原本的ROS2的创建包工具在该工作空间的src目录下自己创建。(QT只不过是个载体,无所谓用什么方法去创建包,大家不要纠结用什么办法去创建包)
ros2 pkg create village_wang --build-type ament_cmake --dependencies rclcpp
然后我们的包就创建完毕了!!!
接着我们在village_wang/src
下创建一个wang2.cpp
文件,创建完成后的目录结构如下:
红框里面是下面的步骤加进去的。
写一下wang2.cpp文件(细心的大家已经发现了我看的教程是鱼香ROS的哈哈哈)
#include "rclcpp/rclcpp.hpp"
/*
创建一个类节点,名字叫做SingleDogNode,继承自Node.
*/
class SingleDogNode : public rclcpp::Node
{
public:
// 构造函数,有一个参数为节点名称
SingleDogNode(std::string name) : Node(name)
{
// 打印一句自我介绍
RCLCPP_INFO(this->get_logger(), "大家好,我是单身狗%s.",name.c_str());
}
private:
};
我们在这里只写的是一个类并把打印信息写到了构造函数里面。(为了演示我只写了cpp文件,如果是自己项目的话,建议大家还是吧.h和.cpp分开写)
下一步我们就需要对界面进行设置了:
加入这个之后出现三个文件。
但是我们不要以为这就完事了!!还有main没写!在自己创一个main.cpp函数
至此各个文件创好了。然后我们看下代码是咋样的
首先是Cmake文件:在原有基础上我们增加了
main.cpp文件
#include <QApplication>
#include <rclcpp/rclcpp.hpp>
#include <src/wang2.cpp>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
//FDILink::ahrsBringup bp;
QApplication a(argc,argv);
rclcpp::init(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <rclcpp/rclcpp.hpp>
#include <src/wang2.cpp>
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
/*产生一个Wang2的节点*/
auto node = std::make_shared<SingleDogNode>("wang2");
/* 运行节点,并检测退出信号*/
connect(ui->pushButton, &QPushButton::clicked, this, [=]() {rclcpp::spin(node);;});
connect(ui->pushButton, &QPushButton::clicked, this, [=]() {rclcpp::shutdown();;});
}
MainWindow::~MainWindow()
{
delete ui;
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
好啦!我们先用colcon编译一下:
编译成功!but,大部分小伙伴会问了:我点这里为啥不行嘞?
我们需要在项目构建里面选择王二节点运行:
分别用两种方式测试一下首先是Terminal方法:
source install/setup.bash
ros2 run village_wang wang2_node
第二种方法点击也会成功: