使用在 Web 浏览器中运行的 VSCode 实现 ROS2 测程法

一、说明

                Hadabot是软件工程师学习ROS2和机器人技术的机器人套件。我们距离Hadabot套件的测试版还有一周左右的时间。我们将在本文末尾披露有关如何注册的更多信息。

        新的Hadabot套件完全支持ROS2。除了硬件套件外,Hadabot软件环境将主要基于Web浏览器,以最大程度地减少用户体验的跨平台差异。为了大大减少用户在设置和库管理方面的挫败感,我们使用 Docker 将 ROS2 系统创建为一堆 Docker 容器,从单个命令轻松启动。Docker还将帮助我们从您的主机系统对所有ROS2库进行沙盒处理,并使您的Hadabot可以从主机系统移植到主机系统。

        在这篇文章中,我们将通过实施和学习我们的 Hadabot 的机器人里程计来开始深入研究机器人导航的概念,Hadabot 是一种差速器驱动机器人。我们将使用在Web浏览器中运行的Visual Studio Code(VSCode)将测程图编程为ROS2组件(即ROS2节点)。

        由于整个ROS2系统,Hadabot模块,甚至VSCode都在Hadabot的Docker容器堆栈中运行,因此您无需设置或安装VSCode或ROS2。只需启动 Docker 堆栈并开始黑客攻击!

您        需要了解一些C++但您不需要物理 Hadabot 套件来跟随这篇文章。具体而言,我们将:

  1. 了解差速驱动机器人测程法。

  2. 了解 ROS 和 ROS2 如何处理计量数据。

  3. 设置基于哈达机器人浏览器的VSCode。

  4. 使用我们基于浏览器的 VSCode 编译和调试 ROS2 C++里程计节点。

  5. 了解ROS2项目(即工作区)结构和ROS包数据文件。

  6. 一起浏览里程计C++代码。

        除了实现里程计的示例代码外,我们还将提供一个半实现的变体,供您尝试自己实现里程计代码。

        按照示例阅读这篇文章应该需要 30 到 45 分钟。


二、 差速驱动机器人测程法

        机器人测程法是估计机器人状态和姿势的过程。对于像我们的哈达机器人这样的差速驱动机器人,我们使用车轮如何转动的知识来估计哈达机器人的运动和姿势 - 稍后会详细介绍为什么它是估计

        运动需要我们的哈达机器人前进的速度,即速度(我们将使用米每秒)以及我们的哈达机器人转动的速度(以弧度每秒为单位) - 由这对表示(v,\omega ) .

        ROS2 使用右手坐标系。在 2D 空间中只考虑轮式机器人是相当常见的,其中绘制的 x 轴指向右,y 轴指向上方,(通常未使用的)z 轴指向我们的脸。因此,正旋转意味着在从上到下(即沿着 z 轴向下)观察我们的 Hadabot 时逆时针旋转。

        姿势是(x,y) 我们的 Hadabot 的 2D 位置以及 (即航向角) 表示θ 在某些坐标空间中。

        当机器人第一次通电时,将其初始姿势视为(x_0,y_0)=( 0,0)\theta _0=0 .机器人指向某个坐标图的原点的右侧。

        对于我们的差速器驱动 Hadabot,测程法成为估算的一种练习(v, \omega ), (x,y) 和θ 根据我们对每个轮子旋转速度的测量。

        我们用车轮编码器传感器测量哈达机器人的车轮旋转速度(弧度每秒)。用尺子物理测量车轮的半径(以米/弧度为单位)后,我们可以轻松计算出每个车轮的距离速度(米/秒)v_{left}  和v_{right}  - 用用简单的数学。

        在连续的时间里,里程计变成了一个整合过程,这可能是非常讨厌的。但对我们来说幸运的是,我们可以在小的离散时间块中采样,即:Δt,这使得数学变得更加简单。我不太擅长微分方程,但我很擅长总结数字!

        一旦你拥有v_{left} 和v_{right},您可以计算每个车轮行进的距离(以米为单位):

        测程练习变为使用以下输入:

  •  d_{left}, d_{right} 
  • 机器人的前瞬位置(x,y) 和前瞬取向θ

        ...要计算这些输出,请执行以下操作:

  • 新的线性和角速度(v′,ω′)
  • 新姿势(x′,y′)和θ′

        我们将自由地跳过一些推导,但最重要的中间计算是:

 2.1 什么是d_{WHEELBASE} ?

        它是左右车轮中心之间的测量距离,以米为单位。下图——

         .但实际上,你可以用使用尺子的物理哈达机器人来衡量这一点。

        2.2 什么是d_center?

        如果左右轮以相同的速度旋转,哈达机器人就会沿着一条直线移动。但是,如果一个轮子碰巧比另一个轮子旋转得快,那么每个轮子的路径就会变成围绕某个旋转中心的弧形。P 在我们的坐标图中。每个弧的距离为d_{left}d_{right}分别针对每个车轮。和 d_{center}是车轮之间弧形路径的长度。

        2.3 什么φ?

             我们知道哈达博特以前的定位是θ 在我们的坐标图中。我们正在尝试计算新的方向θ′ .

        直观 φ=θ′−θ  新方向和以前方向之间的差异。在数学上,您可以计算φ 使用上面的推导方程。

        上述方程的推导在本篇关于差分驱动里程计的论文中有明确的描述。推导是直截了当的,依于找出旋转中心,P ,并使用一些基本的三角函数来推导其余部分。

        通过中间计算和我们的当前状态,特别是φ , d_{center},(x,y,θ) ,我们可以计算新的姿势,(x′,y′,θ′) ,我们的机器人具有以下等式:

        我们的哈达机器人的新线性和角速度是:

三. ROS,ROS2上的里程计

        ROS机器人系统由许多ROS节点组成,通过发布和订阅主题消息与每个节点进行通信。

        在计算Hadabot的新姿势和速度后,我们将使用nav_msgs/msg/Odomemeter消息将这些新估计发布到ROS系统。

        在里程计消息中,有 4 个主要字段 - 标题、child_frame_id、姿势和扭转。

        我们将在扭曲字段中发布新的速度估计值,并在姿势字段中发布新的姿势估计值:

  • odometry.twist.twist.linear.x = v′ 
  • odometry.twist.twist.angular.z = ω′ 
  • odometry.pose.pose.position.x = x′ 
  • odometry.pose.pose.position.y = y′ 
  • odometry.pose.pose.orientation = quaternion_from_roll_pitch_yaw(0, 0, ω′ )

        由于 Hadabot 差速器驱动机器人在具有 2 个自由度的 3D 平面地图空间上运行 - 沿 x、沿 y 移动并沿 z 旋转(即偏航旋转)——完整 3D 地图的许多字段,6 个自由度被忽略。对于偏航方向        ω′ ,ROS 将角方向表示为四元数。所以在我们存储方向之前,我们需要转换偏航方向角        ω′ ,连同零滚动角和俯仰角,形成四元数。

        此外,测程法消息中还有许多其他字段被我们忽略了 - 标题、child_frame_id以及姿势和扭曲中的协方差子字段。

  • 标题字段包含此消息的时间戳数据,以及一个地图框字段,用于指定姿势数据的坐标地图框 - 即(x,y) 在地球上、局部区域地图上坐标等?

  • 该child_frame_id与header.frame_id字段类似,将数据与地图框相关联,即速度。

  • 协方差场表示我们对各自扭曲和姿势测量的不确定性。请记住,我们说过我们的里程计只是估计值。这是因为车轮可能会打滑,编码器传感器有噪音并且不准确,并且还可能存在采样误差(当机器人连续移动时,我们仅在 Δ t间隙采样一次)。所有这些都会导致误差,这些误差应该以某种方式在协方差字段中表示。

        对于当前的测程示例,为了简单起见,我们可以安全地忽略时间戳、frame_id和协方差。但是为了稳健地执行机器人导航,我们将需要它们,并且肯定会在以后的帖子中涉及它们。


四、 在浏览器上使用VSCode编译、运行测程ROS2节点

        你们中的许多人可能听说过一个名为Visual Studio Code(VSCode)的IDE。Hadabot将广泛使用VSCode来指导、编译和展示我们共同实现的各种ROS2代码和机器人概念。

我        们的VSCode将作为Hadabot Docker堆栈中的本地Docker容器运行。此外,我们将从 Web 浏览器使用 VSCode,以获得独立于主机系统操作系统的一致用户体验。

        除了编辑代码外,VSCode 还支持基于浏览器的集成界面,以便:

  • 文件系统
  • 一个bash终端 - 我们偶尔称之为web-bash。
  • 查看渲染的降价以阅读指导说明

        注意:对于那些关注过去帖子的人来说,Hadabot web-bash是从Hadabot Docker堆栈中的Portainer容器启动的。由于VSCode还提供了具有更简单界面的web-bash功能,因此我们消除了对Portainer的需求,并将其从堆栈中完全删除。

4.1 设置哈达机器人在线开发环境

在运行示例之前,我们需要按照步骤 2a 更新您的 Hadabot Git 存储库,重新启动 Hadabot Docker 堆栈。

4.2 通过测程 ROS2 节点编译运行调试器

        请按照以下步骤操作:

  1. 启动特定于本文的基于浏览器的VSCode工作区(此链接指向您的本地主机,因此一切都在本地系统上安全运行)。

  2. 在“VSCode 资源管理器”面板中,右键单击 README.md 文件 ->“打开预览”。

  3. 按照自述文件中的说明编译、运行和调试 ROS2 测程代码。


五、 源代码的结构 - ROS2 工作区、包和节点

        ROS2使用工作区和包的概念来组织实现机器人系统的各种架构模块。工作区由一组包组成。一个包通常实现一个功能模块,如导航或机器人控制,所以它由源代码组成,实现可以作为可执行文件启动的ROS节点。

        我们不会详细介绍如何创建 ROS2 工作区或包,因为在线上有关于如何创建 ROS2 工作区以及如何在工作区中创建 ROS2 包的教程。

        为了简化这篇文章,我们预先创建了一个hadabot_ws ROS2工作区。在其中,我们创建了一个 ROS2 包 hadabot_driver,它有一个源文件hadabot_odom.cpp(2 个源文件 - hadabot_odom_diy.cpp我们现在将忽略它,稍后解释它的用法)。

        ROS2 使用一个名为 colcon 的工具在工作区中构建 ROS2 包。

        colcon 工具从我们的hadabot_driver包构建源文件,以创建一个hadabot_odom ROS2 节点。

        一旦我们获取了 ROS2 hadabot_ws/install/setup.bash 环境,我们就hadabot_odom可以使用命令 ros2 run 或专门 .通过采购 setup.bash,我们设置了终端环境以查找 ros2 工具,并能够自动按 Tab 键完成包中的包和节点名称。ros2 run hadabot_driver hadabot_hadabot_odom


六. 什么是ROS袋?

        ROS2有一个概念,称为“bags”,它是预先保存的ROS消息的目录结构。

        在我们的示例中,我们有一个名为 rosbag2_wheel_rotational_velocity_data 的文件夹,其中包含我们从正在运行的 Hadabot 机器人预先保存的大量 ROS2 消息。当 Hadabot 的车轮转动时,它发布了 /hadabot/wheel_radps_right 和 /hadabot/wheel_radps_left ROS2 主题的车轮旋转速度测量值,我们将其保存到rosbag2_data中。

        为了播放(以及保存)消息,我们调用 ros2 包 ,如果您已经浏览了示例,您已经完成了此操作。

        通过回放保存的袋子数据,我们可以测试我们的测程节点,而无需物理 Hadabot 在场。


七. 我们如何在 ROS2 中实现里程计

测程代码位于 hadabot_ws_/src/hadabot_driver/src/hadabot_odom.cpp 文件中。正如这个简单的 ROS2 C++ 节点教程中所解释的,cpp 文件包含一些必要的 ROS2 库并定义了一个 main(...) 函数。

在高级别上,会发生以下情况:

  • 我们创建了 2 个订阅者,radps_left_sub_ 和 radps_right_sub__,以捕获车轮旋转速度消息并保存相应车轮的当前旋转速度。

  • 我们创建一个触发回调的计时器,publish_odometry(...)_,每隔一段时间就发布出当前的里程计。

  • 我们创建了一个计时器,可以更频繁地触发回调update_odometry(...),以更新给定每个 Hadabot 轮子的最新旋转速度的当前测程法。

update_odometry(...) 函数是我们实现上面描述的测程方程的地方。计算结果存储在pose_变量中。

我们将更新与里程计的发布分开,因为我们可能希望更新里程计的速度比发布速度快。这使我们能够减少δ吨Δ�无需用测程消息淹没我们的 ROS2 系统。

7.1 使用 VSCode 调试器逐步执行 ROS2 C++代码

        通过使用内置的 GDB 调试器单步执行代码,可以更好地理解实现的更精细细节。有关如何启动调试器的所有易于遵循的说明都由您之前在基于浏览器的 VSCode 环境中打开的自述文件标记描述。

7.2 尝试自己实现里程计

        您可能还注意到hadabot_driver_包中另一个名为 hadabot_odom_diy.cpp 的C++源文件。此文件与_hadabot_odom.cpp文件几乎相同,只是它只有用于 update_odometry(...) 函数定义的基架代码。

        做比阅读更好,所以我们欢迎你自己实现测程方程,充实update_odometry(...)函数定义,并将你的结果与我们的结果进行比较。也许我们的代码中有一个错误。=)


八、结论

        感谢您关注这篇关于机器人测程法的文章。我们做了以下工作:

  1. 学习了如何计算差速驱动机器人(如 Hadabot)的测程。

  2. 运行一个示例来编译计算测程的 ROS2 节点。

  3. 使用我们基于浏览器的 VSCode 环境再次运行调试器,该节点针对 ROS2 包数据编译。

        我们将在以后的帖子中继续沿着机器人导航线程。

        至于哈达博特的进展 - 我们有测试版哈达博特套件的零件库存!!请注册以保持联系,以表明您对抢先体验我们套件的兴趣。当我们最终确定细节时,我们将有一个明确的成本,但它将在 100 到 120 美元左右。

        像往常一样,如果您有建议,有意见,或者只是想打个招呼,请随时与我们联系 - 你好AT hadabot DOT com。

        请与其他软件工程师黑客和机器人专家分享Hadabot。杰克“哈达机器人制造者”

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

macbook 加载模型报错:failed to load model

环境:macbook m1 conda python3.9 加载模型链接为:ggml-model-q4_0.bin 加载方式: from langchain.embeddings import LlamaCppEmbeddings embeddings LlamaCppEmbeddings(model_pathllama_path) 在linux上加载是正常的,但是…

读SQL学习指南(第3版)笔记02_数据类型

1. 命令行工具 1.1. mysql -u root -p; 1.2. mysql> show databases; 1.3. mysql> use sakila; 1.4. mysql> SELECT now(); 1.4.1. now()是MySQL的内建函数 1.4.2. 返回当前日期和时间 1.5. mysql> SELECT now() FROM dual…

wifi-RTL8723-RK3568

文章目录 前言一、RTL8723DU二、原理图三、设备树四、修改drivers/net/wireless/rockchip_wlan目录下文件五、修改RTL8723DU代码工程修改Makefile文件修改驱动入口函数其他说明效果前言 本文主要介绍如何在RK3568平台下,参考官方文档移植RTL8723DU这款wifi模块 提示:以下是本…

【数据结构入门指南】二叉树顺序结构: 堆及实现(全程配图,非常经典)

【数据结构入门指南】二叉树顺序结构: 堆及实现(全程配图,非常经典) 一、前言:二叉树的顺序结构二、堆的概念及结构三、堆的实现(本篇博客以实现小堆为例)3.1 准备工作3.2 初始化3.3 堆的插入3.3.1 向上调…

蓝凌OA custom.jsp 任意文件读取

​曾子曰:“慎终追远,民德归厚矣。” 漏洞复现 访问漏洞url: 出现漏洞的文件为 custom.jsp,构造payload: /sys/ui/extend/varkind/custom.jsp var{"body":{"file":"file:///etc/passwd&q…

代码随想录打卡—day24—【回溯】— 基础,最新820 8.21 todo

1 理论基础 回溯法也可以叫做回溯搜索法,它是一种搜索的方式。回溯算法——回溯和递归是相辅相成的。回溯法的效率,回溯法其实就是暴力查找,并不是什么高效的算法。回溯法解决的问题都可以抽象为树形结构(N叉树) 1.1…

《HeadFirst设计模式(第二版)》第九章代码——组合模式

上一章链接: 《HeadFirst设计模式(第二版)》第九章代码——迭代器模式_轩下小酌的博客-CSDN博客 前面说到,当一个菜单里面出现了子菜单的时候,前面的迭代器模式得换成组合模式。 组合模式: 允许将对象组合成树形结构来表现部分-整…

Ohio主题 - 创意组合和代理机构WordPress主题

Ohio主题是一个精心制作的多用途、简约、华丽、多功能的组合和创意展示主题,具有敏锐的用户体验,您需要构建一个现代且实用的网站,并开始销售您的产品和服务。它配备了最流行的WordPress页面构建器 WPBakery Page Builder(以前称为…

部署问题集合(十九)linux设置Tomcat、Docker,以及使用脚本开机自启(亲测)

前言 因为不想每次启动虚拟机都要手动启动一遍这些东西,所以想要设置成开机自启的状态 设置Tomcat开机自启 创建service文件 vi /etc/systemd/system/tomcat.service添加如下内容,注意修改启动脚本和关闭脚本的地址 [Unit] DescriptionTomcat9068 A…

无涯教程-PHP - File 函数

文件系统功能用于访问和操纵文件系统&#xff0c;PHP为您提供了操纵文件的所有功能。 运行时配置 这些功能的行为受php.ini中的设置影响。 NameDefaultChangeableChangelogallow_url_fopen"1"PHP_INI_ALLPHP_INI_ALL in PHP < 4.3.4. PHP_INI_SYSTEM in PHP &l…

测试框架pytest教程(6)钩子函数hook

在pytest中&#xff0c;"hook"是用于自定义和扩展测试流程的机制。它允许你在特定时间点插入自己的代码&#xff0c;以便对测试进行修改、补充或拦截。 pytest的hook是基于Python的插件系统实现的&#xff0c;使用特定的命名规范和装饰器来定义钩子函数。你可以在py…

qt中窗口的布局

qt中窗口的布局 常用的窗口布局方式使用拖拽控件的方式调用窗口布局使用Widget控件完成窗口布局布局中嵌套布局demo&#xff08;制作登录页面&#xff09; 如果不使用窗口布局&#xff0c;会带来的后果&#xff1a; 控件可能显示不出来不能按照期望的大小显示不能跟随窗口进行…

linux-进程

文章目录 1.先谈硬件冯诺依曼体系结构 2.再谈软件操作系统什么是操作系统&#xff1f;为什么要有操作系统&#xff1f;如何管理&#xff1f;系统调用 3.再谈进程那么具体Linux是怎么做的?指令 ps ajx 查看所有进程 非实时top 实时查看进程 相当于任务管理器ls /proc 内存级进程…

leetcode 322. 零钱兑换

本题属于完全背包问题&#xff0c;但要求最少的硬币个数。于是设定dp数组的含义dp[i]:总金额为i时&#xff0c;能凑成i的最少硬币个数。 需要注意初始化dp数组时&#xff0c;除0以外的其他地方需要初始化为INT_MAX以保证在递推过程中能被正确的覆盖。 代码如下&#xff1a; …

Nacos

Nacos介绍 Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的⾸字⺟简称&#xff0c;⼀个更易于构 建云原⽣应⽤的动态服务发现、配置管理和服务管理平台。 在这个介绍中&#xff0c;可以看出Nacos⾄少有三个核⼼功能&#xff1a; 1. 动态服务发现 2. 配…

R包开发一:R与Git版本控制

目录 1.安装Git 2-配置Git&#xff08;只需配置一次&#xff09; 3-用SSH连接GitHub(只需配置一次) 4-创建Github远程仓库 5-克隆仓库到本地 目标&#xff1a;创建的R包&#xff0c;包含Git版本控制&#xff0c;并且能在远程Github仓库同步&#xff0c;相当于发布在Github。…

redis Windows版本安装过程(5.0.14)

官网不提供Windows版本的redis安装包&#xff0c;但可以在GitHub网站上找到redis的安装包&#xff1a; Releases tporadowski/redis GitHub &#xff08;相比较Linux其他版本的Redis,Windows版的redis的缺点是版本比较老&#xff0c;官方不提供且不更新&#xff09; 1、zip…

cuda gdb调试

如果cudaDeviceEnablePeerAccess函数不支持或不起作用&#xff0c;您仍然可以尝试其他方法来实现GPU之间的数据交换和通信。以下是一些替代方法&#xff1a; 通过主机内存进行数据传输&#xff1a; 如果GPU之间的数据交换不是非常频繁&#xff0c;您可以将数据从一个GPU复制到…

【笔记】Spark3 AQE(Adaptive Query Execution)

提效 7 倍&#xff0c;Apache Spark 自适应查询优化在网易的深度实践及改进 Performance Tuning 配置Spark SQL开启Adaptive Execution特性 How To Use Spark Adaptive Query Execution (AQE) in Kyuubi 【spark系列3】spark 3.0.1 AQE(Adaptive Query Exection)分析 玩转Spark…

开源全球地理空间数据可视化框架——Cesium学习(2023.8.21)

Cesium学习 2023.8.21 1、Cesium简介1.1 Github上的Cesium 2、Cesium下载安装使用2.1 方式一&#xff1a;页面在线引用2.2 方式二&#xff1a;页面离线使用2.3 方式三&#xff1a;完整项目使用 3、CesiumJS学习教程&#xff08;快速上手 API文档&#xff09;3、Cesium官方示例…