ROS2-QT合并编程(从环境搭建到UI界面编写,很详细)

该文章已生成可运行项目,

环境:Ubuntu20.04+ROS Foxy版本
ROS Foxy安装参考:
参考1:https://blog.youkuaiyun.com/shenliu128/article/details/127315280?spm=1001.2014.3001.5506
参考2:http://dev.ros2.fishros.com/doc/Installation/Ubuntu-Development-Setup.html#install-dependencies-using-rosdep

1.安装QT
参考文章
1)选择QtCreator的版本
ros2的ros-qtc-plugin插件只支持QtCreator 6.0以上的版本
这里选择QtCreator10.0.1
下载地址:https://mirrors.tuna.tsinghua.edu.cn/qt/official_releases/qtcreator/10.0/10.0.1/qt-creator-opensource-linux-x86_64-10.0.1.run

2)选择ros-qtc-plugin插件版本
ros-qtc-plugin插件是在0.5版本以后才支持ros2
这里选择与QtCreator10.0.1对应的10.0版本
下载地址:https://github.com/ros-industrial/ros_qtc_plugin/releases/download/10.0/ROSProjectManager-10.0-Linux-x86_64.zip

3)选择QT版本
这里选择的版本是qt-opensource-linux-x64-5.12.10.run
下载地址:https://download.qt.io/archive/
在这里插入图片描述4)对下载的.run文件先chmod +x .run文件名。
先安装QtCreator10.0.1,再安装Qt5.12.10。
打开QtCreator10.0.1,在界面上菜单栏点击“编辑→Preferences…”,在构建套件(Kit)中选择Qt版本,点击右侧Link with Qt…,将Qt5.12.10 与QtCreator10.0.1链接在一起,有重启提醒就重启。
在这里插入图片描述将ros-qtc-plugin插件的压缩包放进QtCreator10.0.1安装目录
在这里插入图片描述在QtCreator10.0.1,在界面上菜单栏点击“帮助→关于插件”
在这里插入图片描述弹出的界面点击Install Plugin…
在这里插入图片描述选择下载好的ROSProjectManager-10.0-Linux-x86_64.zip压缩包,一直下一步即可安装完成,有重启提醒就重启。

5)改变变量
终端输入:gedit ~/.local/share/applications/org.qt-project.qtcreator.desktop
在这里插入图片描述修改Exec变量一行,中间添加bash -i -c即改为 Exec=bash -i -c,并将原先连接的5.12.10的QtCreator改成QtCreator10.0.1的QtCreator路径,保存。

2.建立ros2-qt框架
1)在home路径下新建文件夹FDI_RTK/src
2)打开QtCreator10.0.1,选择创建项目
在这里插入图片描述切记build system选择colcon,否则创建功能包会失败在这里插入图片描述在这里插入图片描述

3)选中src,右击选择添加新文件,创建package
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

3.基于ros2创建编译FDI设备
1)安装ros2 serial串口包
ros2中还没有集成serial串口包,所以需要第三方下载对应serial串口包
下载网址:https://github.com/ZhaoXiangBox/serial
按照说明安装即可。
参考网址:https://blog.youkuaiyun.com/weixin_64184244/article/details/127623370

2)创建FDI设备ros2工作空间
在home文件夹下新建名为wheel_robot工作空间,并在工作空间中新建src文件夹,将fdilink_ahrs功能包放入src文件夹中。

3)编译ros2 FDI设备项目
打开终端,在工作空间路径下运行以下指令进行编译,等待显示[100%]编译
成功,因为只有一个功能包所以以下指令都可以:

colcon build --packages-select fdilink_ahrs

或者:

colcon build

都可以编译。
在这里插入图片描述在这里插入图片描述在主目录ctrl+H,打开.bashrc文件,添加该工作空间环境变量:

source /home/fei/wheel_robot/install/setup.bash
export PATH=$PATH:/home/fei/wheel_robot/

在这里插入图片描述保存,重启bashrc:

source ~/.bashrc

5)运行
进入工作空间终端:

ros2 launch fdilink_ahrs ahrs_driver.launch.py

在这里插入图片描述
4.合并ros2-qt
1)在之前创建的qt项目ros2功能包文件中,新建launch文件夹
在这里插入图片描述
2)将wheel_robot工作空间src/fdilink_ahrs/src中的相关.cpp文件复制粘贴到/FDI_RTK/src/rtk/src中
在这里插入图片描述在这里插入图片描述3)将wheel_robot工作空间src/fdilink_ahrs/include中的相关.h文件复制粘贴到/FDI_RTK/src/rtk/include中
在这里插入图片描述在这里插入图片描述
4)将wheel_robot工作空间src/fdilink_ahrs/launch中的相关.launch.py文件复制粘贴到/FDI_RTK/src/rtk/launch中
在这里插入图片描述在这里插入图片描述
此时,项目结构如下图所示:
在这里插入图片描述
5)修改CMakeLists.txt
增加内容:

find_package(Eigen3 REQUIRED)
set(Eigen3_INCLUDE_DIRS ${EIGEN3_INCLUDE_DIR})
find_package(rclcpp REQUIRED)
find_package(rclpy REQUIRED)
find_package(sensor_msgs REQUIRED)
find_package(std_msgs REQUIRED)
find_package(tf2 REQUIRED)
find_package(tf2_ros REQUIRED)
find_package(serial REQUIRED)
find_package(nav_msgs REQUIRED)
find_package(geometry_msgs REQUIRED)
find_package(tf2_geometry_msgs REQUIRED)
include_directories(
    include/ahrs_driver.h
    include/crc_table.h
    include/fdilink_data_struct.h
    include
    src
    ${catkin_INCLUDE_DIRS}
    ${Eigen3_INCLUDE_DIRS} 
)
add_executable(rtk_ahrs 
    src/ahrs_driver.cpp 
    src/crc_table.cpp)
ament_target_dependencies(rtk_ahrs rclcpp rclpy  std_msgs  sensor_msgs  serial tf2_ros tf2 nav_msgs geometry_msgs)
install(TARGETS
    rtk_ahrs
    DESTINATION lib/${PROJECT_NAME}
)
install(
    DIRECTORY launch 
    DESTINATION share/${PROJECT_NAME}
)

在这里插入图片描述在这里插入图片描述注意:节点这里我设置为:rtk_ahrs

6)修改package.xml
增加内容:

  <depend>rclcpp</depend>
  <depend>rclpy</depend>
  <depend>sensor_msgs</depend>
  <depend>std_msgs</depend>
  <depend>tf2</depend>
  <depend>tf2_ros</depend>
  <depend>nav_msgs</depend>
  <depend>geometry_msgs</depend>

在这里插入图片描述
7)修改ahrs_driver.launch.py
将package和executable修改为自己对应的功能包名和节点名

package="rtk"
executable="rtk_ahrs"

在这里插入图片描述
8)构建运行项目
先构建项目
运行设置:
运行配置为自定义执行档,执行档选择rtk_ahrs路径
在这里插入图片描述
9)运行
有输出,说明合并成功。
在这里插入图片描述
5.添加UI
1)选中功能包rtk中src,右击选择添加新文件,选Qt设计师界面类->根据需要选界面类型(以MainWindow为例),设置类名为rtk,FDI_RTK结构变更为
在这里插入图片描述
2)手动添加main.cpp
内容:

#include <ahrs_driver.h>
#include <Eigen/Eigen>
#include "rtk.h"
#include <QApplication>
#include <rclcpp/rclcpp.hpp>
int main(int argc, char *argv[])
{
    rclcpp::init(argc, argv);
    //FDILink::ahrsBringup bp;
    QApplication a(argc,argv);
    rtk w;
    w.show();
    return a.exec();
}

在这里插入图片描述
3)修改ahrs_driver.cpp
删除:蓝色部分
在这里插入图片描述
4)修改CMakeLists.txt
添加内容:

find_package(Qt5  REQUIRED COMPONENTS  Widgets)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
src/main.cpp
src/rtk.cpp
src/rtk.h
src/rtk.ui
target_link_libraries(rtk_ahrs Qt5::Widgets)

在这里插入图片描述
在这里插入图片描述
5)运行
成功
在这里插入图片描述
6)通过按钮“点击”、“释放”来开启或关闭FDI设备
6.1)点击rtk.ui,找到Push Buttons,将其拖拽至旁边的编辑界面,点击该按钮图标,右下的属性栏中,将Text改为:rtk,并勾选checkable
在这里插入图片描述记住该按钮的objectName: pushButton在这里插入图片描述6.2)点击左侧“编辑”
在这里插入图片描述双击rtk.h文件,添加#include <QtWidgets/QPushButton>,定义pushButton:QPushButton pushButton;
在这里插入图片描述添加槽函数:
在这里插入图片描述6.3)点击rtk.cpp文件,将槽函数On_allSelectBtnSlot与pushButton连接

connect(ui->pushButton,SIGNAL(clicked(bool)),this,SLOT(On_allSelectBtnSlot()));

在这里插入图片描述编写槽函数具体功能

void rtk::On_allSelectBtnSlot()
{
    if(ui->pushButton->isChecked())
    {
           //代码1  //这里写点击按钮时执行的功能代码
    }
    else
    {
          //代码2 //这里写释放按钮时执行的功能代码
    }
}

因为这里需要将设备运行写进线程里(线程写法网上一堆,这里就不写了),所以将线程开启代码写在代码1处,线程关闭写在代码2处。为了直观看到设备被开启,建了三个lineEdit来显示经度、纬度、和海拔,运行结果如下:
在这里插入图片描述

后续:如果想了解如何在ROS2-QT中创建并运用自己的ROS2消息类型,请参考我的下一篇文章。

本文章已经生成可运行项目
提供的引用内容中未提及RO2QT合并编程的相关内容,不过通常RO2ROS 2)和QT合并编程可按以下方法实现: ### 方法 - **环境配置**:确保系统中已经正确安装了ROS 2QT开发环境ROS 2有不同的发行版,如Foxy、Galactic等,需根据自己的系统和需求选择合适的版本进行安装。QT也需要安装对应的开发工具包,如Qt Creator。 - **创建ROS 2工作空间和功能包**:使用`ros2 pkg create`命令创建一个新的ROS 2功能包,指定依赖的ROS 2库和QT库。例如: ```bash ros2 pkg create --build-type ament_cmake my_qt_ros2_pkg --dependencies rclcpp rclcpp_action rclcpp_components Qt5Core Qt5Gui Qt5Widgets ``` - **编写QT界面代码**:在功能包的`src`目录下创建QT界面的源文件和头文件。可以使用Qt Creator的可视化设计工具来设计界面,然后生成对应的代码。 - **编写ROS 2节点代码**:在功能包中编写ROS 2节点的代码,实现与ROS 2系统的通信,如发布和订阅话题、调用服务等。 - **将QT界面ROS 2节点集成**:在QT界面的代码中调用ROS 2节点的功能,或者在ROS 2节点的代码中更新QT界面的显示内容。 - **编译和运行**:使用`colcon build`命令编译功能包,然后使用`ros2 run`命令运行节点。 ### 示例代码 以下是一个简单的ROS 2QT合并编程的示例,实现一个简单的QT界面显示ROS 2发布的消息: #### 1. 创建ROS 2功能包 ```bash ros2 pkg create --build-type ament_cmake my_qt_ros2_pkg --dependencies rclcpp rclcpp_action rclcpp_components Qt5Core Qt5Gui Qt5Widgets ``` #### 2. 编写QT界面代码(`mainwindow.h`) ```cpp #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QLabel> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); void updateMessage(const std::string &message); private: Ui::MainWindow *ui; QLabel *messageLabel; }; #endif // MAINWINDOW_H ``` #### 3. 编写QT界面代码(`mainwindow.cpp`) ```cpp #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); messageLabel = new QLabel(this); messageLabel->setGeometry(10, 10, 200, 30); } MainWindow::~MainWindow() { delete ui; } void MainWindow::updateMessage(const std::string &message) { messageLabel->setText(QString::fromStdString(message)); } ``` #### 4. 编写ROS 2节点代码(`my_qt_ros2_node.cpp`) ```cpp #include <rclcpp/rclcpp.hpp> #include <std_msgs/msg/string.hpp> #include "mainwindow.h" #include <QApplication> class MyQtROS2Node : public rclcpp::Node { public: MyQtROS2Node() : Node("my_qt_ros2_node") { subscription_ = this->create_subscription<std_msgs::msg::String>( "topic", 10, std::bind(&MyQtROS2Node::topic_callback, this, std::placeholders::_1)); } void setMainWindow(MainWindow *window) { mainWindow = window; } private: void topic_callback(const std_msgs::msg::String::SharedPtr msg) { if (mainWindow) { mainWindow->updateMessage(msg->data); } } rclcpp::Subscription<std_msgs::msg::String>::SharedPtr subscription_; MainWindow *mainWindow; }; int main(int argc, char * argv[]) { rclcpp::init(argc, argv); QApplication app(argc, argv); auto node = std::make_shared<MyQtROS2Node>(); MainWindow window; node->setMainWindow(&window); window.show(); rclcpp::executors::SingleThreadedExecutor executor; executor.add_node(node); std::thread([&executor]() { executor.spin(); }).detach(); return app.exec(); } ``` #### 5. 配置CMakeLists.txt 在`CMakeLists.txt`中添加以下内容: ```cmake find_package(Qt5 COMPONENTS Core Gui Widgets REQUIRED) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) add_executable(my_qt_ros2_node src/mainwindow.cpp src/my_qt_ros2_node.cpp) ament_target_dependencies(my_qt_ros2_node rclcpp std_msgs) target_link_libraries(my_qt_ros2_node Qt5::Core Qt5::Gui Qt5::Widgets) install(TARGETS my_qt_ros2_node DESTINATION lib/${PROJECT_NAME} ) ``` #### 6. 编译和运行 ```bash colcon build source install/setup.bash ros2 run my_qt_ros2_pkg my_qt_ros2_node ```
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值