1.Ubuntu22.04 安装 Ros1 Noetic
2.tf2系列教程(十三):在ROS 2中编写tf2侦听者节点(C++)
3.ROS2的码下学习经验
4.学习笔记ROS2纯小白 - Beginner:Client libraries(一):工作空间与包
5.ROS2 Nav2 [Navigation 2 Stack] –SLAM导航教程
6.ROS 2中级教程——8 使用colcon构建软件包
Ubuntu22.04 安装 Ros1 Noetic
在Ubuntu .系统上安装Ros1 Noetic并不直接支持apt安装,因为Ros官方已停止对Ros1的码下官方适配。不过,码下可以通过源码编译的码下方式在Ubuntu 上运行。以下是码下具体步骤:
1. **添加Ros2源**:首先,你需要通过Ros2 Humble的码下openwrt内核源码下载官方指南添加Ros2的官方源,尽管这不是码下安装Ros1的直接步骤。
2. **内核版本考虑**:Ubuntu 的码下内核版本5.已相对过时,可能不适用于年后的码下硬件,因此在安装时需要考虑升级或选择其他方式。码下
3. **安装引导程序依赖**:安装rosdep和vcstools等源码安装工具,码下初始化rosdep时,码下可能需要手动解决hddtemp包的码下问题。
4. **修改base.yaml和-default.list**:下载base.yaml并编辑,码下添加适用于Ubuntu 的码下内容。同时,更新-default.list以引用本地的base.yaml。
5. **连接问题**:更新rosdep时可能遇到Github连接问题,可尝试修改hosts文件或其他连接方法。
6. **catkin工作区与安装**:创建catkin工作区,使用vcstools下载Desktop版本的Ros包。推荐安装Desktop full版本以确保功能全面。
7. **兼容性处理**:在构建Ros1 Noetic前,需要对src文件夹中的两个包进行手动修补以适应Ubuntu .。
8. **源码安装依赖**:使用rosdep自动检测并安装缺失的依赖。
9. **包文件生成和下载**:生成包文件并下载依赖,注意包的顺序和完整性,避免因依赖问题导致的编译失败。
. **替换rosconsole和urdf**:新生成的包可能需要替换rosconsole和urdf,参照依赖问题部分进行操作。
. **构建和安装Ros1 Noetic**:使用catkin_make_isolated构建并安装Ros1,将其源码安装到指定工作区的install_isolated文件夹,然后将source命令添加到bashrc中。
. **额外安装**:Ros1 Desktop full版本可能不包含所有需要的包,如octomap和mavros,需要单独安装。
总的来说,虽然在Ubuntu .上安装Ros1 Noetic的过程较为复杂,但通过源码编译并遵循上述步骤,可以实现系统的兼容和功能的正常使用。
tf2系列教程(十三):在ROS 2中编写tf2侦听者节点(C++)
. 编写tf2侦听者节点(C++)
描述:本教程将介绍如何使用C++编写一个能够通过tf2获取坐标系变换消息的tf2侦听者节点。
教程级别:入门
在前一个教程中,我们创建了tf2广播者节点来发布小乌龟的位姿到tf2。本教程将创建tf2侦听者节点以开始使用tf2坐标变换消息。
.1 如何创建tf2侦听者节点
使用前两个教程中创建的learning_tf2_cpp软件包,首先进入存放C++源代码的~/dev_ws/src/learning_tf2_cpp/src子目录,运行以下命令创建tf2侦听者节点的源代码文件turtle_tf2_listener.cpp:
在文本编辑器中,将以下代码复制到该文件中,并保存:
.1.1 代码说明
首先导入需要用到的库/模块:
tf2发布的坐标变换信息带有时间戳,因此需要包含geometry_msgs的TransformStamped消息类型头文件transform_stamped.hpp。本节点需要计算turtle1和turtle2两个坐标系的坐标差值,因此需要使用Twist消息类型,包含geometry_msgs的Twist消息头文件twist.hpp。ROS 2中,ament_cmake软件包都依赖C++客户端库rclcpp,因此需要包含该库的github网页浏览源码头文件。本节点需要侦听turtle1的坐标消息,因此需要导入tf2_ros软件包中的TransformListener类和Buffer类,包含这两个类的头文件。此外,还需要处理坐标变换异常的Exception类,包含其头文件。由于本节点需要生成新的小乌龟turtle2,需要调用turtlesim软件包的Spawn服务,导入spawn.hpp模块。上述库/模块/类的导入也代表了该节点的依赖关系,需要将这些依赖包添加到package.xml和CMakeLists.txt文件中。
接着创建了用于侦听turtle1位姿消息的FrameListener节点类,该类继承自rclcpp客户端库的Node类。在FrameListener类中定义了两个函数:一个是公共构造函数,指定节点名称turtle_tf2_frame_listener;申明和获取target_frame参数;创建TransformListener类对象transform_listener_;创建用于生成新小乌龟服务的客户端,并检查服务是否可用;创建turtle2的速度指令发布者对象变量publisher_;以1hz的频率调用on_timer()回调函数。
回调函数on_timer()负责执行turtle1和turtle2两个坐标系之间的坐标变换,并据此向turtle2发布速度指令以对turtle1进行跟随。在该函数中,获取要进行坐标变换的两个坐标系,调用lookupTransform()方法查找坐标变换,根据坐标变换结果计算turtle2的线速度和角速度,然后向turtle2发布速度指令消息。此回调函数的调用频率为1hz,意味着每秒进行一次坐标变换和计算、发布turtle2的速度指令。
最后是定义main()函数。初始化rclcpp客户端库,实例化FrameListener节点对象,旋转节点以调用回调函数,关闭rclcpp客户端库。
.2 构建软件包并运行tf2侦听者节点
编写好C++代码后,在构建和编译该软件包之前,需要编辑learning_tf2_cpp软件包的package.xml和CMakeLists.txt文件,填写软件包描述、许可证、作者等信息,添加相应依赖包和可执行文件等。具体步骤请参考相关教程。
如果已完成前面的教程“在ROS 2中编写tf2静态广播者节点(C++)”,则package.xml文件不用修改;在CMakeLists.txt文件中,添加本教程的可执行文件,并在install(target下面添加一行。
由于需要同时运行turtlesim软件包的turtlesim_node、learning_tf2_cpp软件包的turtle_tf2_broadcaster和turtle_tf2_listener等多个节点,需要通过启动文件组合运行这些节点。在上一教程中创建的launch子目录下为本教程创建learning_tf2_demo.launch.py启动文件,具体命令如下。
将以下代码复制到启动文件中,并保存:
完成上述工作后,构建编译软件包。进入工作空间dev_ws的根目录,并运行以下命令:
编译成功后,需要对该工作空间的安装脚本进行source,命令为:
现在可以运行刚才创建的wg34源码learning_tf2_demo.launch.py启动文件了,具体命令为:
这样就会打开一个名为Turtlesim的窗口,里面有两只小乌龟。小乌龟turtle2会沿着一条弧形路径靠近小乌龟turtle1。
.3 检查运行结果
要查看本节点是否成功运行或有效,只需要在新终端中运行turtlesim软件包的turtle_teleop_key可执行文件,通过键盘上F键周围的8个字母键和箭头键控制小乌龟的旋转和移动,命令为:
确保运行turtle_teleop_key节点的终端窗口处于活动状态,并通过相应字母键和箭头键移动第一只小乌龟turtle1,这样就会看到第二只小乌龟turtle2会跟随turtle1。
现在可以使用tf2_ros软件包的tf2_echo可执行文件来检查两只小乌龟的位姿是否正在真实地被广播到tf2,命令分别为:
应该会显示第一只乌龟的位姿,如下所示:
此时继续移动turtle1,小乌龟turtle2正在跟随,turtle2的位姿信息也会一直发生变化。
还可以对turtle1和turtle2两个坐标系的坐标变换进行回显,请运行以下命令:
在驱使turtle1移动而turtle2在进行跟随的过程中,会获得如下所示的输出:
这说明已经成功地将两只小乌龟的位姿都广播到了tf2,并实现了对turtle1坐标系的侦听,使用了两只小乌龟坐标系变换信息以让turtle2对turtle1进行跟随。
ROS2的学习经验
ROS2广泛应用于工业自动化、服务机器人、智能交通、医疗保健和农业机器人等领域。相较于ROS,ROS2去除了部分缺点,并被认为是未来的趋势。尽管ROS2发展时间不长,生态系统尚未完善,学习资源较少,但学习它并推动生态发展是明智之举。个人学习经验表明,应具备编程语言(C++和Python)、Ubuntu系统命令使用、C++智能指针(如make_ptr和共享指针)、命名空间、VSCode使用、多线程编程、数学知识(坐标转换、pnp解算、旋转度RPY、四元素等)、CmakeLists.txt语法等基础。
初学者应从视频资源入手学习ROS2基础,推荐赵虚左老师的视频课程,使用鱼香ROS工具进行实践。首先,通过赵虚左老师的视频学习ROS2基础,然后进一步使用鱼香ROS文档深入学习导航2(Navigation2)部分。面对导航2框架资料较少、难以理解的挑战,建议仔细积累并参考官方文档的英文版本与鱼香ROS的翻译文档。遇到文档中错误的代码时,不要怀疑,可以尝试使用AI解决问题。
进阶阶段,wp源码资源下载学习导航2(Navigation2)框架,特别关注官方文档与鱼香ROS翻译文档的结合使用。理解框架原理后,通过实际项目实践,如使用鱼香ROS的开源项目,让机器人在仿真环境中运行起来。在实践过程中,会遇到手动初始化位姿与标点导航的问题,通过代码自动导航可简化流程。使用nav2框架提供的Python API,可以方便地实现决策功能,如使用c++编写可能较为复杂。理解nav2源码,如复制和修改src avigation av2_simple_commander中的代码,或使用nav2_simple_commander\launch文件启动特定节点。
为了构建和导航,需准备机器人模型(urdf)、仿真环境(world)等,放入description功能包中。启动仿真环境后,建图并获取地图信息。在实车或仿真导航中,确保定位准确,避免机器人在接近目标时徘徊。当到达目标距离0.5米时开始计时,若5秒内未到达目标,则取消当前导航并转向下一个目标。理解nav2框架参数的含义,根据项目需求进行调整。
构建ROS2项目时,需要新建navigation2功能包,管理nav2框架的启动与配置。地图、参数文件(如av2_params.yaml)应放入相应文件夹中,根据需要调整参数,例如使用仿真时间、定位方法和控制器。启动nav2框架后,通过手动初始化位姿进行仿真导航,或结合雷达、IMU等设备数据构建完整tf图,实现机器人导航。精准导航需要长时间的学习和实践,确保定位准确,避免机器人到达目标时的徘徊问题。
学习笔记ROS2纯小白 - Beginner:Client libraries(一):工作空间与包
在学校的实验课上,我遇到了关于ROS2项目结构的困惑。原本以为修改源代码并重构后,小车应运行新的CV程序,但实际上并非如此。这让我意识到基础知识的重要性,尤其是在理论课程与实验课程之间需要平衡,或者提供更易学习的教程。查阅官方文档后,我终于理解了ROS2项目的mtk8665 源码基本结构,比如工作空间和包的组织方式。
工作空间由src目录作为核心,colcon会在其周围创建build、install和log子目录。build存储中间文件,install用于安装包,log记录colcon调用的日志。不同于catkin,colcon的工作目录不包含devel路径。使用colcon构建工作空间时,首先创建名为ros2_ws的目录,接着添加源代码,如从GitHub克隆。
源代码时,需要区分underlay(已有的ROS2依赖)和overlay(新创建的工作空间)。通过source命令配置环境,colcon允许在source空间修改非编译资源,如Python文件,以加快迭代。每次开发调试,都会执行colcon build来构建工作空间。
运行测试时,部分包出现stderr输出,这可能源于Python包中的setuptools库,尽管有警告但不影响正常使用。为了运行示例程序,需要正确配置环境并执行相应的publisher和subscriber。
对于开发自己的包,colcon支持ament_cmake、ament_python和纯CMake。ament_cmake和ament_python示例展示了如何创建和使用这些包。colcon_cd工具可以帮助快速切换到特定包的目录,而colcon tab completion支持命令补全。
在ROS2开发中,统一的构建工具ament_tools替代了ROS 1中的catkin工具,简化了团队协作。rosdep则用于管理和识别依赖项,便于安装和构建。需要注意的是,rosdep的使用可能会因为网络问题而遇到问题,可通过特定方法解决。
创建工作空间时,理解包的结构和许可证信息至关重要。包是代码共享的基本单元,包含package.xml和CMakeLists.txt,可以是CMake、Python或其他编写方式。工作空间中包含多个包,它们独立但共存,推荐在src目录下存放所有包。
ROS2 Nav2 [Navigation 2 Stack] –SLAM导航教程
ROS2 Nav2 [Navigation 2 Stack] –SLAM导航教程
在本课程中,您将踏上一段学习旅程,从实验开始,构建直观的导航理解。首先,通过实践操作,您将获得初步体验。接下来,理论与实践相结合,解释和理论将增强您的学习体验,随后是更多实践环节。
课程内容包括:
每个章节紧密相连,知识递进式学习。您将通过附加挑战巩固所学,并获得更多实践机会。
立即注册课程,开始您的导航堆栈学习之旅,节省大量宝贵时间。课程承诺,不满意可享受天全额退款,无需任何问题。
注意:本课程不适用于以下情况:
面向所有计算机科学爱好者,本教程涵盖计算机学科的多个领域,如人工智能、机器学习、编程语言、游戏开发、网络安全、云计算、Linux运维、面试技巧等。所有教程均配备中英双语字幕、练习源码及补充资料。
ROS 2中级教程——8 使用colcon构建软件包
本教程旨在向读者展示如何使用colcon工具来创建并构建ROS 2工作空间。尽管本教程是实践性的,并不替代核心文档,但建议在学习过程中参考相关文档以获取更全面的知识。
首先,了解colcon工具,它代表了ROS构建工具catkin_make,catkin_make_isolated,catkin_tools和ament_tools的改进版本。更多关于colcon设计的信息可查阅指定文档。
要开始使用colcon,请访问GitHub上的colcon组织,下载并安装源代码。具体而言,Linux用户可以通过命令行使用sudo apt install python3-colcon-common-extensions,macOS用户则使用python3 -m pip install colcon-common-extensions,而Windows用户应执行pip install -U colcon-common-extensions。
在安装完colcon和ROS 2后,需要创建一个用于存放软件包的ROS工作空间。Linux和macOS用户可使用mkdir -p ~/ros2_example_ws/src cd ~/ros2_example_ws,而Windows用户则执行md \dev\ros2_example_ws\src cd \dev\ros2_example_ws命令。此时工作空间内仅包含一个名为src的空目录。
接下来,将ROS 2示例源代码存储库克隆到src目录中,通过git clone github.com/ros2/example... src/examples操作完成。确保检出与已安装ROS版本兼容的分支。然后,在工作空间根目录中运行colcon build命令以构建软件包。在Windows操作系统上构建时,请参考“构建ROS 2代码”以获取详细信息。
构建完成后,可以在install目录中找到已安装的软件包。为了使用这些安装好的可执行文件或库,需要将它们添加到路径和库路径中。colcon会在install目录中生成bash / bat文件,通过source这些文件即可完成环境设置。
之后,可以通过ros2 run命令运行colcon构建的可执行文件。以ros2 run examples_rclcpp_minimal_subscriber subscriber_member_function为例,运行订阅者节点。同时,可以在另一个终端中运行发布者节点(别忘了source安装脚本),以确保消息正确传输。
对于创建自己的软件包,colcon使用REP 中定义的package.xml规范(也支持format 2)。它支持多种构建类型,包括ament_cmake、ament_python和纯cmake软件包。ament_python构建中,setup.py文件作为构建的主要入口点。例如,demo_nodes_cpp软件包使用ament_cmake构建类型,并利用CMake作为构建工具。
为了简化创建软件包的过程,ros2 pkg create工具可以用于基于模板创建新的软件包,这相当于catkin用户中的catkin_create_package。
在使用colcon时,读者可以参考一些提示来提高工作效率。例如,如果不想构建特定的软件包,可以将其目录中放置一个名为COLCON_IGNORE的空文件。另外,若要避免在CMake软件包中配置和构建测试,可以传递参数--cmake-args -DBUILD_TESTING=0。此外,可以通过colcon test命令运行单个特定测试,只需指定软件包和测试名称即可。
学习笔记ROS2纯小白 - MoveIt!(humble)安装、初识与C++实现运动规划
文章内容
前言
在本系列第四篇学习笔记中,我们重点介绍如何安装MoveIt、如何在RViz中使用MoveIt,以及如何通过C++程序加入障碍物并进行运动规划。经过一番波折,终于开始与机器人相关任务,尤其是RViz的可视化功能,让这一过程变得更为直观。在尝试配置环境时,由于系统误操作导致Ubuntu无法正常开机,最终花费半天时间重装系统,尽管过程坎坷,但这一经历让我们的技术积累更加坚实。
前作后续
在安装ROS 2和Colcon后,确保系统为最新版本并安装mixin Colcon和vsctool。接下来,创建一个Colcon工作空间并下载教程和剩余MoveIt源代码。由于网络环境因素,这一过程可能较为不稳定,需要反复尝试和优化配置。完成依赖项的控制后,使用Concol工作空间并进行相应的build和setup操作。将默认ROS 2中间件(RMW)更改为Cyclone DDS,以确保环境的兼容性。
使用Docker容器快速建立MoveIt环境,为后续机器人开发提供方便。
在RViz中使用MoveIt插件进行运动规划,通过交互设置机器人状态,测试规划器并进行可视化输出。在RViz中引入机器人模型,配置固定坐标系,进行机器人插件的详细配置。
在模拟环境中,与可视化机器人交互,调整姿态和运动轨迹。演示如何通过规划实现机器人从起始到目标位姿的运动,同时利用RViz工具可视化路径和操作流程。
通过C++程序实现MoveIt的运动规划功能,首先创建一个ROS节点和执行器,实现机器人运动控制。插入代码段,完成规划与执行,并在RViz中实时反馈。
进一步,实现视觉化功能,通过moveit_visual_tools插件增强机器人开发的可视化体验。在程序中添加依赖项,构建并初始化MoveItVisualTools,实现与RViz的交互。
在RViz中实现路径的可视化,通过封装函数处理视觉化信息,确保代码的简洁和高效。最后,通过配置和运行程序,观察RViz中的实时反馈,完成整个工作流程。
总结
通过本系列的学习笔记,我们系统地掌握了ROS 2环境的搭建、MoveIt的安装与使用、C++实现运动规划以及RViz的可视化技巧。尽管过程中遇到了挑战,如系统配置问题和网络环境的不稳定,但通过坚持不懈的努力,成功实现了从理论到实践的转变。这不仅加深了对机器人开发技术的理解,也锻炼了问题解决和调试能力。未来,我们将在实践中继续深化对这些技术的理解,为更复杂的机器人应用奠定坚实的基础。
ROS2日志时间戳转换成时分秒
ROS2的日志时间无法直接转换成时分秒形式,这在调试过程中确实不太方便。最近在鱼香ROS大大论坛里找到了一种解决方案,感谢大佬的分享,以下是我整理的关键步骤。
1. 基本配置
要将时间戳转换成打印时分秒格式的时间,需要修改源代码。
注:比如我的本地工作空间是catkin_ws,那么应该将源码放在catkin_ws/src中,与自己的代码一起编译。
2. 下载源码和依赖
2.1 打开文件:rcutils/include/rcutils/time.h,添加代码
2.2 打开文件:rcutils/src/time.c,添加代码
2.3 打开文件:rcutils/src/time.c,添加代码
2.4 打开文件:rcutils/src/logging.c,修改代码
2.5 编译代码
然后source后运行日志打印就可以了,也可以直接替换系统库里的头文件和库,具体如何替换还需要自己探索。
ROS2测试源码编译安装cartographer
Cartographer是一个跨平台、传感器配置提供实时同步定位和绘图(SLAM)的系统,具有回环检测优势,资源占用适中。
选择源码编译安装方式,以适应后期项目修改和移植需求。首先,使用Ubuntu虚拟机测试验证。
若国内访问github受限,可选择Gitee上的备份仓库进行下载。尝试多个版本,确认在Ubuntu humble版本下能够成功下载和安装。
在安装过程中,需要下载依赖项。在Ubuntu上,首先安装libabsl-dev、libceres-dev以及liblua5.3-dev等包。对于ceres-solver,需确保CUDA、显卡加速和TBB指令集优化选项已配置。
在开发板上,通过源码编译安装三方依赖。确保所有依赖包均正确安装,包括protobuf版本为v3.4.1分支。
完成所有依赖安装后,开始编译Cartographer源码。首先下载官方数据集,注意ROS2格式的rosbag转换,使用rosbags工具进行转换。
介绍ROSbag格式,ROS1的.rosbag文件为二进制存储格式,而ROS2使用SQLite数据库格式,支持跨平台和扩展性。两种格式转换方法,推荐使用rosbags工具,无需依赖ROS环境。
测试Cartographer时,使用ros2命令启动示例launch文件,输入特定的bag文件名以加载数据集。测试3D数据集时,使用相应的launch文件和bag文件名。
资源占用情况分析将后续进行。
tf2系列教程(十六):了解ROS 2中的tf2和时间(C++)
在ROS 2中,tf2是一个核心组件,用于管理坐标系变换树,跟踪和传播不同坐标系之间的变换信息。在本教程中,我们将探讨如何在lookupTransform()函数中使用超时设置以等待tf2坐标变换树上的坐标变换可用。
理解tf2的时间机制非常重要。每个坐标系变换都保存了一个时间快照,默认最多秒。使用lookupTransform()函数时,我们获取最新的坐标变换,但并不知道该变换的确切时间。本教程将指导你如何获取特定时间的坐标变换。
具体步骤如下:
1. 打开学习tf2的C++软件包中的src/turtle_tf2_listener.cpp源代码文件。在回调函数on_timer()中,我们关注to_frame_rel参数的定义,即在FrameListener类的构造函数中。将to_frame_rel参数设置为turtle1,让第二只小乌龟跟随第一只小乌龟。
2. 移除或注释掉启动文件中设置target_frame参数的代码行,这将让turtle2跟随turtle1,而不是固定坐标系“胡萝卜(carrot1)”。
3. 更改tf2::TimePoint()为this->now(),这指定了查找当前时刻的坐标变换,并移除超时参数。这导致lookupTransform()函数失败,输出消息提示坐标变换不可用。
4. 使用tf2提供的等待工具,通过在lookupTransform()函数中添加Duration参数来解决此问题。在本例中,等待ms,或者使用以下代码。该函数有四个参数:目标坐标系、源坐标系、查找的时刻以及可选的等待超时时长。设置超时时长后,lookupTransform()将阻塞直到坐标变换可用,或在超时时长内无法获取时引发异常。
5. 超时参数的设置至关重要。如果未设置,系统可能会报错坐标系不存在或坐标变换消息在将来。但也不能设置过长,否则会导致系统阻塞。
6. 重新编译并运行软件包,现在可以正常运行了。
通过本教程,你将了解到如何在ROS 2环境中通过设置超时等待来确保tf2坐标变换的可用性,从而在实时系统中实现稳定的坐标系跟踪。