【开源】基于Qt5的ROS1/ROS2人机交互软件(支持地图编辑/多点导航)

news2025/2/22 7:15:12

本项目基于Qt5开发,基于CMake进行构建,可以实现一套代码同时在ROS1/ROS2系统中使用(本项目已接入CI,保证多ROS版本/系统版本可用性)
项目地址:
https://github.com/chengyangkj/Ros_Qt5_Gui_App

软件在编译时会自动识别环境变量中的ROS1/ROS2环境并进行构建,实现ROS通信与界面隔离

软件所有功能均为自行绘制实现,因此可以轻松运行在一些性能比较低的边缘设备
在这里插入图片描述
在这里插入图片描述

功能/TODO:

功能状态备注
ROS1/ROS2通信
全局/局部地图显示
机器人实时位置显示
机器人速度仪表盘
机器人手动控制
机器人重定位
机器人单点/多点导航
机器人全局/局部规划轨迹显示
机器人拓扑地图功能
电池电量显示
地图编辑功能
机器人导航任务链
地图加载
地图保存
基于protobuf的通信🏷️
鹰眼视图🏷️
3D图层显示🏷️
相机图像显示🏷️
拓扑点位的路径规划🏷️

大家如果有什么有意思的界面/功能性需求,可以提在此处,如有Bug请提在issues,必将尽快修复!请在也欢迎大家发起Merge Request一起参与项目建设~

此仓库国内加速镜像链接:gitee

Star History Chart

目录

文章目录

    • 目录
  • 一,Release 版本下载使用
  • 二,编译
    • 1,环境安装
    • 2,克隆/下载本项目:
    • 3,编译项目
    • 4,运行项目
  • 三,IDE配置说明(QtCreator/Vscode)
      • 3.1 QtCreator打开项目教程
  • 四,使用说明
      • 4.1,多机通信配置
      • 4.2,配置文件
      • 4.3,重定位位姿态发布
      • 4.4,地图编辑
        • 4.4.1 拓扑地图(机器人导航点设置)
        • 4.4.2 橡皮擦
        • 4.4.3 画笔
        • 4.4.4 线段绘制
        • 4.4.5 地图保存
        • 4.4.6 地图加载
      • 4.5,手动控制机器人
      • 4.6,速度仪表盘
      • 4.7,电池电量显示
      • 4.8 多点连续导航

一,Release 版本下载使用

如果您只想使用本软件,并不想了解具体的代码实现,用户可以选择下载编译好的Release版本,不用自行手动编译,下载即用

使用Release版本的前提:系统ROS环境已安装,并且source到环境变量中

本仓库使用CI自动生成各平台的Release版本(目前只有X86_64版本,Arm环境需要自行编译),在项目的Release页面下载最新对应ROS版本的Release版本,理论上解压后即可使用。
使用方法:
在终端进入解压后的文件夹路径,执行如下命令:

sudo chmod a+x ./ros_qt5_gui_app
./ros_qt5_gui_app

如果Release版本下载后使用不了,可以参考二,编译进行自行编译使用

二,编译

注意,为了保证此项目同时兼容ROS1与ROS2,此项目不使用ROS1/ROS2的catkin_make/colcon构建系统进行够建,而是使用标准CMake进行构建,这也就意味着,本项目不会被ROS自动识别为功能包
可以参考以下教程从0开始构建/运行此项目:

1,环境安装

理论上只需要安装如下基础包就可以编译此项目:

sudo apt-get update
sudo apt-get install qtbase5-private-dev libqt5svg5-dev -y

如果以上安装后还不行,可以执行如下指令安装全部依赖:

sudo apt-get install qtbase5-dev qt5-qmake qtbase5-dev-tools libqt5svg5-dev qtbase5-private-dev libeigen3-dev libgtest-dev -y

2,克隆/下载本项目:

mkdir -p ~/qt_ws
cd ~/qt_ws
git clone https://github.com/chengyangkj/Ros_Qt5_Gui_App

note:如果github下载过慢,可以使用以下指令从gitee拉取

git clone https://gitee.com/chengyangkj/Ros_Qt5_Gui_App

3,编译项目

可以手动执行如下命令进行编译(会根据环境变量自动识别ROS1还是ROS2环境):

cd ~/qt_ws/ROS2_Qt5_Gui_App
mkdir -p build
cd build
cmake ..
make

或者执行如下脚本手动指定ROS版本并进行一键编译:

cd ~/qt_ws/ROS2_Qt5_Gui_App

ROS1:

sh ./build_ros1.sh

ROS2

sh ./build_ros2.sh

4,运行项目

cd ~/qt_ws/ROS2_Qt5_Gui_App/build
./ros_qt5_gui_app

软件配置文件路径(运行一次软件后会自动生成在可执行程序相对路径下):


~/qt_ws/ROS2_Qt5_Gui_App/build/config.json

三,IDE配置说明(QtCreator/Vscode)

此部分为针对新手做的温馨提示,如果你已经是一个ROS/C++/Qt老手,可以跳过此部分

很多ROS初学者学习Qt都存在一个误区:拼命的去下载QtCreator,如果QtCreator有问题安装失败,就卡在这,影响学习进度,但是其实QtCreator与Vscode一样,可以把他当作一个纯文本编辑器.
实际上Ubuntu系统默认都自带的有Qt库,就比如前面的3,编译项目,并没有要求安装QtCreator,只需要使用apt-get安装一些系统缺失的,没有默认安装的qt库,就能正常编译通过

当然安装QtCreator时也会同时下载一些Qt库,但是他仅仅是下载,如果你没有将下载的库添加到环境变量中(通常也不建议自己将下载的qt库添加到环境变量中,这样需要处理系统默认的qt库与你添加的qt库的冲突问题),所以,在没有额外配置的情况下,虽然下载了QtCreator,但是在编译代码时用的还是系统默认的库.

那么,我们为什么还要去额外下载QtCreator呢?
因为我们需要使用QtCreator去编辑我们的(.ui),(.resource)文件

本项目所有的界面,都是在代码中去手动创建,如果打开代码中的mainwindow.ui可以发现什么都没有,因为所有界面都是代码动态创建添加上去的.

本人在开发本项目的流程为:

  • 使用系统的Qt库,如果需要使用的qt库不存在,则使用apt-get安装即可
  • 所有ui界面均使用代码动态创建,并添加到主窗口中,没有使用qtcreator拖拽生成
  • 项目的开发IDE使用vscode,仅安装了基础的c/c++插件做代码提示
  • 如果需要编辑资源文件(.qrc),手动打开qtcreator,再打开qrc文件进行编辑保存
  • 编译时在终端使用make指令进行编译
  • 运行时在终端使用./ros_qt5_gui_app指令进行运行

可以发现,开发此项目只有需要编辑资源文件时才会用到QtCreator(一般图片添加上去后也不会做频繁的编辑)

虽然本人开发使用的Vscode,但是为了方便部分习惯使用QtCreator做开发的用户,这里介绍下如果使用QtCreator作为IDE开发此项目:

3.1 QtCreator打开项目教程

首先需要按照3,编译项目将项目成功编译,如果编译失败,则QtCreator打开后项目不会正常展开

本项目为标准CMake项目,因此按照在QtCreator中打开CMake项目的方式,打开本项目的根目录Cmakelist.txt即可(不区分ROS1/ROS2)

  • 1.安装QtCreator
sudo apt-get install qtcreator

  • 2.打开qtcreator

终端输入(必须终端打开):

qtcretor

打开后选择文件->打开文件或项目:

在这里插入图片描述

接着选择项目根目录下的Cmakelist.txt文件,点击打开即可:
在这里插入图片描述

接着会自动识别我们前面编译的build目录,选择config:
在这里插入图片描述

项目成功展开,点击绿色三角形编译并运行:

在这里插入图片描述

四,使用说明

4.1,多机通信配置

针对于ROS新手的温馨提示:此项配置,如果是单机使用即本软件运行在机器人身上,没有跨机器使用就不用配置,直接跳过即可.如果需要将本软件运行在自己的笔记本上,去连接远程的机器人的情况下需要进行配置

ROS1/ROS2的多机通信完全依赖ROS原生(环境变量添加ROS_MASTER_URI与ROS_IP/ROS_DOMAINID),不再由用户手动指定,减轻新手使用负担

ROS1:

配置参考:多机通讯教程csdn 博客

ROS2:

环境变量多机配置相同的ROS_DOMAINID

4.2,配置文件

第一次运行后,会在可执行程序同级目录生成config.json,修改此配置文件即可(需要注意Json格式),修改后重启生效,具体配置说明详见配置文件说明

4.3,重定位位姿态发布

程序可以拖动式的设置机器人初始位置(重定位),相对于Rviz,拖动时可以实时查看激光匹配情况,重定位更加精准(左键按住拖动,右键旋转方向)

在这里插入图片描述
注意:如果设置无效,需要检查config.json中设置:

{
      "display_name": "Reloc",
      "topic": "/initialpose",
      "enable": true
}

为自己机器人监听的重定位Topic名称

4.4,地图编辑

程序支持地图编辑功能:

在这里插入图片描述
在这里插入图片描述

4.4.1 拓扑地图(机器人导航点设置)

并且程序支持拓扑地图功能,可以拖动式的设置机器人导航目标点(导航)使用gif说明如下:

在这里插入图片描述

注意:如果导航点位发布无响应设置无效,需要检查config.json中设置:

{
      "display_name": "NavGoal",
      "topic": "/move_base_simple/goal",
      "enable": true
}

为自己机器人监听的导航目标点Topic名称

4.4.2 橡皮擦

点击橡皮擦后,可以擦除地图中的障碍物,使用gif说明如下:
在这里插入图片描述

4.4.3 画笔

画笔功能
在这里插入图片描述

4.4.4 线段绘制

线段绘制
在这里插入图片描述

4.4.5 地图保存

地图编辑完成后并不会自动保存,需要点击保存按钮,保存地图到指定文件夹,如果需要在ROS中使用,需要将该地图替换到自己对应导航包的map中

目前保存地图有如下:

  • *.pgm 图片数据
  • *.yaml 地图描述文件
  • *.topology 程序自定义的拓扑地图 保存了点位等信息

在这里插入图片描述

4.4.6 地图加载

地图加载同理 用户选择对应的PGM地图文件即可加载,并进行编辑

4.5,手动控制机器人

软件支持发布实时速度到底盘
在这里插入图片描述

对应按钮上的文字,可以由键盘对应按钮同步调用

注意:如果设置无效,需要检查config.json中设置:

{
      "display_name": "Speed",
      "topic": "/cmd_vel",
      "enable": true
}

为实际机器人监听的速度控制话题

4.6,速度仪表盘

软件支持实时显示机器人速度

注意:如果设置无效,需要检查config.json中设置:

{
      "display_name": "Odometry",
      "topic": "/odom",
      "enable": true
}

为机器人时机发布的里程计话题

4.7,电池电量显示

软件支持实时显示机器人电量,在配置中配置话题名,电池电量的Topic类型为:sensor_msgs::BatteryState

{
      "display_name": "Battery",
      "topic": "/battery",
      "enable": true
}

4.8 多点连续导航

软件支持多点连续导航,使用方法如下:

在这里插入图片描述

点击Start Task Chain即可开始任务

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1424785.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Halcon 22.11语言修改

[编辑]> [设定偏好] [使用者界面]> [语言] 修改为zh_CN 重启程序, 修改为中文简体

C# .Net Framework Swagger

1.安装 Swagger 在NuGet程序包中安装以下文件 Swashbuckle: Swagger: Swagger.Net: 2.在项目APP_Start 文件夹下面找到 SwaggerNet.cs文件 1.注释掉这两行代码 2.将PreStart方法的内容修改为以下 public static void PreStart() {RouteTable.Routes.MapHttpRoute(…

web项目部署,一篇就搞定!

web部署的方式有很多,根据开发方式不同,部署方式也不同。最通用是docker部署,这个想必大家都熟悉。我们今天说另外一种。 部署过程 1、验证Jdk是否安装成功 2、验证Tomcat是否安装成功 3、验证Navicat 是否能连上数据库 4、创建数据库并导入…

C语言进阶之自定义类型

一、结构体 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1)结构体的声明 struct tag {member - list; }variable - list;//变量列表 //例如描述一个学生 struct Stu {char name[20];//名字int age;//年龄char sex[5…

百无聊赖之JavaEE从入门到放弃(十五)包装类

目录 一.包装类概念 二.自动装箱和拆箱 三.包装类的缓存问题 一.包装类概念 基本数据类型的包装类 我们前面学习的八种基本数据类型并不是对象,为了将基本类型数据和对象之间实现互 相转化,Java 为每一个基本数据类型提供了相应的包装类。 Java 是…

树、二叉树、图

树 struct TreeNode {int val;TreeNode* left;TreeNode* right;TreeNode(int x): val(x), left(nullptr), right(nullptr) {} }二叉树的遍历 前序 Pre-Order:根 - 左子树 - 右子树:A BDHIEJCFG中序 In-Order:左子树 - 根 - 右子树&#xff1…

Docker进阶篇-DockerFile

一、简介 Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚 本。 构建步骤: 1、编写Dockerfile文件 2、docker build命令构建镜像 3、docker run依镜像运行容器实例 二、Docker构建过程解析 1、Dockerfile…

[Vue3] useRoute、useRouter

useRoute 返回当前路由地址。相当于在模板中使用 $route。必须在 setup() 中调用。用于在组件中获取当前路由的信息,返回一个包含路由信息的对象。这个函数适用于那些不需要监听路由变化的场景,只是获取当前路由信息的静态数据。 useRouter 返回 route…

高精度GNSS接收机尾矿库监测应用

高精度GNSS接收机在尾矿库监测中广泛应用,它能够提供位移精确测量,以及全面而详细多维度的数据监测。通过与其他监测设备的联动,可以实现了对尾矿库坝体位移、变形、坝体浸润线、库内水位、库区降雨量、安全视频的全面自动化监测及预警&#…

Django模型(九)

一、使用SQL语句 1.1、通过模型使用SQL 通过raw函数执行原始SQL语句进行查询,主键字段必须包含在查询的字段中,不然会引发错误 : # 定义个 Cook 模型 class Cook(models.Model):"""厨师"""name = models.CharField(max_length=32,verbose_n…

Mac如何设置一位数密码?

一、问题 Mac如何设置一位数密码? 二、解答 1、打开终端 2、清除全局账户策略 sudo pwpolicy -clearaccountpolicies 输入开机密码,这里是看不见的,输入完回车即可 3、重新设置密码 (1)打开设置-->用户和群组…

html,css,js速成

准备&#xff1a;vscode配好c&#xff0c;python&#xff0c;vue环境。 1. html hypertext markup language(超文本标记语言) 1. 基础语法 一个html元素由开始标签&#xff0c;填充文本&#xff0c;结束标签构成。 常见标签说明<b></b>粗体<i></i>…

浅谈安科瑞为数据中心领域提供能效管理解决方案

一、前言 推进工业能效提升&#xff0c;是产业提质升级、实现高质量发展的内在要求&#xff0c;是降低工业领域碳排放、实现碳达峰碳中和目标的重要途径&#xff0c;是培育形成绿色低碳发展新动能、促使工业经济增长的合理举措。为深入贯彻落实党国、国务院重大决策部署&#…

开阳630hv100的代码编译以及软件制作步骤

打开项目功能步骤&#xff1a; 编译awtk功能&#xff1a; 选中awtk工程&#xff0c;先编译一次awtk sdk&#xff08;如下图的3和4步骤&#xff09;&#xff1b; 编译项目代码&#xff08;如下图步骤5和6&#xff09;&#xff1b; 编译完成后&#xff0c;软件路径&#xff1a;…

Hugging Face: 拥开源模型社区

Hugging face是一个开源的模型社区&#xff0c;里边包含各种各样的模型。Hugging face在github上开源了一个Transformers库&#xff0c;这个库非常的好用&#xff0c;我们可以用这个库做模型的推理、微调。推荐这个库的另一个原因是简单好用&#xff0c;我们看一下huggingface的…

使用Postman做API自动化测试

Postman最基本的功能用来重放请求&#xff0c;并且配合良好的response格式化工具。 高级点的用法可以使用Postman生成各个语言的脚本&#xff0c;还可以抓包&#xff0c;认证&#xff0c;传输文件。 仅仅做到这些还不能够满足一个系统的开发&#xff0c;或者说过于琐碎&#…

空间算法:四叉树

更多精彩内容尽在数字孪生平台。 简要 我们首先想象一个场景&#xff0c;根据用户位置找出给定半径内有哪些咖啡店。最直接的做法是检查数据集中所有咖啡店的纬度/经度位置是否落在给定半径内。虽然我们可以轻松地做到这一点&#xff0c;但在 n 个位置的数组中&#xff0c;我们…

C语言第十五弹---操作符(上)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 操作符 1、操作符的分类 2、二进制和进制转换 2.1、2进制转10进制 2.1.1、10进制转2进制数字 2.2、2进制转8进制和16进制 2.2.2、2进制转16进制 3. 原码、反…

王道_数据结构 1.2_2_算法的时间复杂度

1.2_2_算法的时间复杂度 一、为什么要事先预估算法时间开销二、时间复杂度的计算与技巧1、化简“算法时间开销”的计算方式的依据2、常用技巧&#xff08;1&#xff09;加法、乘法规则&#xff08;2&#xff09;时间复杂度的数量级阶数排行 3、计算时间复杂度的结论与步骤&…

#{}和${}的区别

#{}和${}的区别 .本质区别:使用注意事项防止SQL注入排序like查询 . 在使用mybatis操作数据库的时候,我们在编写sql语言的时候,会遇到一个问题,就是在传参的时候,有两个符号#,$.这两个符号有什么异同呢,接下来,我就会带着大家对这个问题进行简单的探讨 本质区别: #执行的是预编…