环境: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消息类型,请参考我的下一篇文章。