1.ROS入门笔记(七):详解ROS文件系统
2.rosbag相关源码解析
3.ROS2测试源码编译安装cartographer
4.ROS中MPC局部路径规划器使用方法及源码流程解读
5.Cartographer源码详解|(2)Cartographer_ros
ROS入门笔记(七):详解ROS文件系统
本章节详述ROS的码分工程结构,特别是码分其文件系统组织。理解并熟悉ROS工程的码分构建方式是编程和开发的基础。
首先,码分我们深入理解catkin编译系统,码分它是码分用户管理源码layuiROS工程的核心工具。早期的码分Makefile编译方式效率不高,CMake作为高级编译工具引入,码分而ROS的码分Catkin系统在此基础上做了扩展。Catkin在groovy版本后替代了rosbuild,码分提供更简洁、码分高效和可移植的码分编译体验,适用于大型项目,码分如ROS。码分
学习Catkin,码分首先了解其特点:基于CMake,每个软件包包含CMakeLists.txt和package.xml两个关键文件。编译流程由catkin_make命令控制,它封装了cmake和make,便于大型项目的构建。编译前务必在工作空间目录下操作,完成后需刷新环境以加载新生成的App会员付费源码可执行文件。
接着,我们探索catkin工作空间,类比为一个项目仓库,包含src、build和devel三个主要路径,src存放源代码,build进行编译,devel则用于设置环境。通过catkin_create_pkg创建和管理软件包,rospack、roscd和rosls等工具则方便包的查找和内容浏览。
在CMakeLists.txt中,我们定义包的依赖、目标构建规则,这是构建流程的核心。package.xml则是包的元数据,记录了包的名称、版本、依赖等信息。ROS中的Metapackage则是功能模块的集合,通过CMakeLists.txt和package.xml定义。疫苗溯源码查询
最后,介绍了其他常见的文件类型,如launch文件用于程序启动配置,msg/srv/action定义自定义数据结构,urdf/xacro描述机器人模型,yaml文件存储参数,dae/stl文件是3D模型,rviz文件配置可视化工具。这些文件共同构建了完整的ROS开发环境。
深入理解这些细节,将有助于你更高效地在ROS环境中开发和管理项目。
rosbag相关源码解析
rosbag核心功能解析
rosbag主要由rosbag包和rosbag_storage包构成,其常用功能包括play、record和view。下面逐一探讨它们的实现流程。Record功能
记录过程如下:指定要订阅的topic,通过subscribe函数进行订阅。
subscribe函数关联doQueue回调,关键代码如下:
... (doQueue函数内容省略)执行doRecord函数保存数据,涉及doWrite函数,主要调用writeMessageDataRecord:
... (doWrite和writeMessageDataRecord函数内容省略)Play功能
播放过程包括:通过Bag类打开并解析.bag文件。樱桃发卡网源码
初始化view对象,用于有条件地显示数据。
发布bag内消息并进行广告。
消息的发布。
Bag类与View类
Bag类用于打开并解析.bag文件,解析工作主要在startReadingVersion函数内进行。而View类在Bag类的基础上,对解析结果进行筛选和展示,它负责迭代bag内消息数据,流程如下:构造View类时,通过updateQueries函数处理消息迭代器。
初始化iters_,根据消息时间进行排序。
每次输出时间最早的message_instance_并补充后续消息,保持时间顺序。
对iters_内的实体持续更新并排序。
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文件名。
资源占用情况分析将后续进行。
ROS中MPC局部路径规划器使用方法及源码流程解读
本文主要解析ROS Navigation框架中的MPC局部路径规划器mpc_local_planner的使用方法和源码流程。MPC模型预测控制算法是关键环节,它处理复杂环境,优化性能,但计算复杂度较高。以下是mpc_local_planner的详细步骤:
1. 首先,将mpc_local_planner从GitHub或其他源代码库下载至ROS工作空间的src文件夹。
2. 环境配置需安装依赖和环境,可通过rosdep或参考相关博客解决安装问题。链接:[ROS Noetic版本 rosdep找不到命令 不能使用的解决方法]。
3. 通过catkin_make编译mpc_local_planner包,并通过其自带示例测试其功能,如阿克曼模型小车的动态演示。
4. 在move_base的launch文件中,将局部路径规划器设置为mpc_local_planner/MpcLocalPlannerROS,并根据机器人特性调整clearing_rotation_allowed参数,如阿克曼车型机器人禁止原地旋转。
5. 配置参数文件mpc_local_planner_params.yaml,确保路径符合机器人实际情况。
6. 完成配置后,进行实际路径规划测试,并根据测试结果调整参数,以优化路径规划性能。
以上步骤详尽介绍了在ROS中使用MPC局部路径规划器mpc_local_planner的步骤,通过这些操作,你将能更好地将其应用到你的机器人项目中。详情请参考《ROS中MPC局部路径规划器使用方法及源码流程解读》。
Cartographer源码详解|(2)Cartographer_ros
上一篇文章深入分析了传感器数据的流向,接下来让我们继续探讨传感器格式的转换与类型变换。这部分内容在sensor_bridge.cc文件中。在处理传感器的坐标变换时,我们需要运用三维空间刚体运动的知识,先进行简要回顾,以助于理解代码。
三维空间刚体运动涉及向量内积与外积。向量内积的计算公式如下,表示两个向量的点乘。向量外积则是一个向量,其方向垂直于两个向量,大小为两向量张成四边形的有向面积,计算公式如下。
旋转和平移是欧氏变换的两个关键部分。旋转涉及单位正交基的变换,形成旋转矩阵(Rotation matrix),该矩阵的各分量由两组基之间的内积组成,反映了旋转前后同一向量坐标的变化关系。平移则通过向旋转后的坐标中加入平移向量t实现。通过旋转矩阵R和平移向量t,我们可以完整描述欧氏空间中的坐标变换关系。
为了简化变换过程,引入齐次坐标和变换矩阵。在三维向量末尾添加1形成四维向量,进行线性变换。变换矩阵T能够将两次变换叠加简化为一个操作,便于后续计算。
Cartographer的坐标转换程序位于transform文件夹下的rigid_transform中,用于求解变换矩阵的逆。
在sensor_bridge类中,构造函数将传入配置参数,对里程计数据进行处理。首先将ros时间转换为ICU时间,然后利用tf_bridge_.LookupToTracking函数找到tracking坐标系与里程计child_frame_id之间的坐标变换。在ToOdometryData函数中,将里程计的footprint的pose转换为tracking_frame的pose,并最终将结果转换为carto::sensor::OdometryData的数据类型。
HandleOdometryMessage函数将传感器数据类型与坐标系转换完成后,调用trajectory_builder_->AddSensorData进行数据处理。对于雷达数据,首先转换为点云格式,然后对点云进行坐标变换,并调用trajectory_builder_->AddSensorData进行数据处理。
IMU数据处理中,要求平移分量小于1e-5,然后调用trajectory_builder_->AddSensorData对数据进行处理。
在雷达数据处理部分,首先将点云数据分段,然后传给HandleRangefinder处理,将点云坐标变换到tracking_frame坐标系下,调用trajectory_builder_->AddSensorData函数进行数据处理。
总结本章内容,我们详细解析了SensorBridge类,对传感器数据进行了转换和传输。通过Node类、MapBuilderBridge类和SensorBridge类,我们对Cartographer_ros部分的代码有了基本了解。接下来,我们将深入学习cartographer。