1.5 ROS2体系框架

1.5.1 ROS2文件系统

立足系统架构,如下图所示,ROS2可以划分为三层:

  • 操作系统层(OS Layer)

    如前所述,ROS虽然称之为机器人操作系统,但实质只是构建机器人应用程序的软件开发工具包,ROS必须依赖于传统意义的操作系统,目前ROS2可以运行在Linux、Windows、Mac或RTOS上。

  • 中间层(Middleware Layer)

    主要由数据分发服务DDS与ROS2封装的关于机器人开发的中间件组成。DDS是一种去中心化的数据通讯方式,ROS2还引入了服务质量管理 (Quality of Service)机制,借助该机制可以保证在某些较差网络环境下也可以具备良好的通讯效果。ROS2中间件则主要由客户端库、DDS抽象层与进程内通讯API构成。

  • 应用层(Application Layer)

    是指开发者构建的应用程序,在应用程序中是以功能包为核心的,在功能包中可以包含源码、数据定义、接口等内容。

对于一般开发者而言,工作内容主要集中在应用层,开发者一般通过实现具有某一特定功能的功能包来构建机器人应用程序。对应的我们所介绍的ROS2文件系统主要是指在硬盘上以功能包为核心的目录与文件的组织形式。

1.概览

功能包是ROS2应用程序的核心,但是功能包不能直接构建,必须依赖于工作空间,一个ROS2工作空间的目录结构如下:

WorkSpace --- 自定义的工作空间。
    |--- build:存储中间文件的目录,该目录下会为每一个功能包创建一个单独子目录。
    |--- install:安装目录,该目录下会为每一个功能包创建一个单独子目录。
    |--- log:日志目录,用于存储日志文件。
    |--- src:用于存储功能包源码的目录。
        |-- C++功能包
            |-- package.xml:包信息,比如:包名、版本、作者、依赖项。
            |-- CMakeLists.txt:配置编译规则,比如源文件、依赖项、目标文件。
            |-- src:C++源文件目录。
            |-- include:头文件目录。
            |-- msg:消息接口文件目录。
            |-- srv:服务接口文件目录。
            |-- action:动作接口文件目录。
        |-- Python功能包
            |-- package.xml:包信息,比如:包名、版本、作者、依赖项。
            |-- setup.py:与C++功能包的CMakeLists.txt类似。
            |-- setup.cfg:功能包基本配置文件。
            |-- resource:资源目录。
            |-- test:存储测试相关文件。
            |-- 功能包同名目录:Python源文件目录。

另外,无论是Python功能包还是C++功能包,都可以自定义一些配置文件相关的目录。

|-- C++或Python功能包
    |-- launch:存储launch文件。
    |-- rviz:存储rviz2配置相关文件。
    |-- urdf:存储机器人建模文件。
    |-- params:存储参数文件。
    |-- world:存储仿真环境相关文件。
    |-- map:存储导航所需地图文件。
    |-- ......

上述这些目录也可以定义为其他名称,或者根据需要创建其他一些目录。

2.源文件说明

1.3 ROS2快速体验中,实现第一个ROS2程序时,都需要创建节点,无论是C++实现还是Python实现,都是直接实例化的Node对象。

C++实例化Node示例如下:

#include "rclcpp/rclcpp.hpp"

int main(int argc, char ** argv)
{
  rclcpp::init(argc,argv);
  auto node = rclcpp::Node::make_shared("helloworld_node");
  RCLCPP_INFO(node->get_logger(),"hello world!");
  rclcpp::shutdown();
  return 0;
}

Python实例化Node示例如下:

import rclpy

def main():
    rclpy.init()
    node = rclpy.create_node("helloworld_py_node")
    node.get_logger().info("hello world!")
    rclpy.shutdown()

if __name__ == '__main__':
    main()

但是在ROS2中,上述编码风格是不被推荐的,更推荐以继承Node的方式来创建节点对象。

C++继承Node实现示例如下:

#include "rclcpp/rclcpp.hpp"

class MyNode: public rclcpp::Node{
public:
    MyNode():Node("node_name"){
        RCLCPP_INFO(this->get_logger(),"hello world!");
    }

};

int main(int argc, char *argv[])
{
    rclcpp::init(argc,argv);
    auto node = std::make_shared<MyNode>();
    rclcpp::shutdown();
    return 0;
}

Python继承Node实现示例如下:

<think>好的,用户现在问的是“前面就学习C++和Linux系统编程就可以了吗”。根据之前的对话历史,我之前给用户提供了一个详细的学习路线,分为三个阶段:基础阶段(C++和Linux)、分化阶段(机器人或嵌入式专项)以及融合阶段的项目实战。用户现在可能是在确认是否只需要完成前两个部分的基础阶段就足够,或者是否需要更多的内容。 首先,我需要理解用户的疑问点。用户可能担心只学C++和Linux是否足够找到工作,或者是否还需要其他技能。可能用户看到第一阶段是3个月,然后进入分化阶段,但不确定是否必须继续后面的内容。也有可能用户的时间有限,希望知道是否能够通过基础阶段就达到一定的就业能力。 接下来,我需要回顾之前提供的学习路线,确保回答的一致性。之前的路线中,基础阶段确实包括C++和Linux系统编程,但后续还有分化的专项学习和项目实战。因此,用户的问题可能是在确认是否只学基础就能满足需求,或者是否需要继续后续阶段。 然后,我需要分析用户的潜在需求。用户可能是在寻求高效的学习路径,希望以最短时间达到就业水平,或者可能对学习压力感到担忧,想确认是否可以分阶段进行。也有可能用户对后续的专项学习内容不太了解,需要进一步解释其必要性。 接下来,我应该明确回答用户的问题:仅学习C++和Linux是不够的,因为它们是基础,但实际工作中需要更专业的技能,如机器人或嵌入式的专项知识。因此,后续的分化阶段和项目实战是必要的。同时,需要解释为什么这些后续内容重要,比如实际项目需要ROS2、嵌入式开发等技能。 另外,用户可能需要了解如果不继续学习后续内容会有哪些不足。例如,仅掌握C++和Linux可能只能应聘基础岗位,而结合专项技能才能提升竞争力。因此,回答中需要强调后续阶段的重要性,并提供具体例子,比如项目实战如何整合不同技能。 还要注意用户的背景,可能是在校生或在职转行者,时间安排不同。需要根据他们的实际情况,调整建议,比如如果时间紧张,如何平衡学习内容,或者如何优先学习关键技能。 最后,确保回答结构清晰,分点说明,并给出实际案例,帮助用户理解后续学习内容的重要性。同时,提供鼓励,说明持续学习的必要性,并给出资源建议,帮助用户继续前进。</think>### 一、基础技能的必要性与局限性 #### (基础技能的必要性) C++与Linux系统编程是**技术栈的地基**,但并非全部。其价值主要体现在: 1. **理解现代计算机体系**:通过内存管理(如`mmap`系统调用)理解硬件-软件交互 ```cpp // 使用mmap实现共享内存 void* shared_mem = mmap(NULL, SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); ``` 2. **构建工程思维**:CMake多模块管理(`add_subdirectory()`)、单元测试覆盖率(`gcov/lcov`) 3. **跨领域通用能力**:线程同步(`pthread_cond_t`)、网络通信(`epoll`事件驱动) #### (纯基础的局限性) 仅有基础技能将面临以下瓶颈: - **无法承接实际项目**:工业级开发需结合领域框架(如ROS2的`rclcpp`或嵌入式RTOS) - **缺乏垂直领域认知**:机器人需要运动学建模(如D-H参数法),嵌入式需要硬件接口开发(如SPI时序配置) - **薪资天花板低**:仅掌握基础薪资范围约8-12K,复合型人才可达15-25K --- ### 二、进阶技能的必要组成 #### (技能组合价值) ```mermaid pie title 企业招聘需求技能分布(机器人/嵌入式方向) "C++核心能力" : 25 "Linux系统编程" : 20 "领域专项技能" : 40 "项目经验" : 15 ``` #### (关键进阶模块) 1. **机器人开发必学**: - ROS2核心架构:节点生命周期管理(`rclcpp::LifecycleNode`) - 运动控制算法实现(代码示例): ```cpp // 使用Eigen库计算齐次变换矩阵 Eigen::Matrix4d createHTM(double theta, double a, double d, double alpha) { Eigen::Matrix4d mat; mat << cos(theta), -sin(theta)*cos(alpha), sin(theta)*sin(alpha), a*cos(theta), sin(theta), cos(theta)*cos(alpha), -cos(theta)*sin(alpha), a*sin(theta), 0, sin(alpha), cos(alpha), d, 0, 0, 0, 1; return mat; } ``` 2. **嵌入式开发必学**: - 硬件抽象层开发(如STM32 HAL库使用) - 实时系统优化(使用`cyclictest`测试系统延迟): ```bash # 测试嵌入式Linux实时性 cyclictest -l 100000 -m -n -p 99 -t 5 ``` --- ### 三、分场景学习策略 #### (时间有限的情况) 若仅有3个月学习时间,建议采用**最小可行技能组合**: 1. **基础强化**(1个月): - 重点掌握:C++11/14核心特性(移动语义、lambda)、Linux进程间通信(命名管道`mkfifo`) 2. **领域速成**(1.5个月): - 机器人方向:ROS2基础通信(话题/服务/动作)、Gazebo仿真 - 嵌入式方向:Buildroot定制系统、设备树(DTS)解析 3. **项目包装**(0.5个月): - 开发小型演示系统(如ROS2控制STM32机械臂) #### (完整学习路径) 推荐完整学习流程(含关键里程碑): ``` [第1月] C++模板特化 → 实现泛型数据结构 → Git管理代码 [第3月] 开发多线程日志系统 → 部署到树莓派 → 性能分析(perf工具) [第6月] 完成AGV控制系统 → 集成SLAM算法 → 输出设计文档 ``` --- ### 四、技术栈组合方案 #### (高性价比组合) 1. **机器人+嵌入式**: - 开发自主导航机器人: ```mermaid flowchart LR A[STM32电机驱动] --> B[ROS2导航栈] B --> C[激光雷达数据处理] C --> D[上位机监控系统] ``` - 技术亮点: - 嵌入式端:PWM精确控制(使用定时器`TIM_OCInitTypeDef`) - 机器人端:TF2坐标变换(`tf2_ros::Buffer`) 2. **工业物联网方向**: - 实现PLC数据采集网关: - 使用C++开发Modbus TCP主站 - 通过MQTT协议上传数据到云平台 --- ### 五、持续学习建议 1. **代码训练法**: - 每日完成1个LeetCode中等题(侧重算法实现) - 每周复现1个开源项目模块(如ROS2的`tf2`库) 2. **知识体系构建**: - 建立Markdown知识库(分类整理常用命令) - 使用Anki进行碎片知识记忆(如GDB调试命令) 3. **技术视野拓展**: - 关注Rust在嵌入式领域的应用(如`embassy`框架) - 学习ROS2与自动驾驶结合案例(Apollo系统架构) 仅掌握C++和Linux相当于学会写字但不会写文章。建议至少完成一个完整领域专项(机器人或嵌入式),才能形成有效的技术竞争力。实际工程中,企业更看重**垂直领域深度+跨领域协作能力**的结合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值