写在最前面的话
为什么做该博客?该博客的特点是什么?
随着DeepSeek、ChatGPT等AI技术的崛起,促使机器人技术发展到了新的高度,诞生了宇树科技、特斯拉为代表的人形机器人,四足机器人等等,越来越多的科技巨头涌入机器人赛道,行业对于相关人才的需求也随之达到了顶峰。本博客的内容是替你阅读所有关于机器人的经典书籍,采用书籍瘦身计划,帮你提炼出核心内容,采用最通俗易懂的语言来解释原理,将书读薄。大大缩短学习时间,助你快速成为机器人时代的佼佼者。


文章目录
一、书籍介绍
《ROS2机器人开发 从入门到实践》是一本从零基础到实战落地的机器人开发指南,通过"基础理论+工具详解+项目实战"的三阶学习路径,带你掌握机器人操作系统ROS2核心架构。书中不仅包含通信机制、URDF建模等必备知识,更有SLAM导航、机械臂控制等12个工业级案例,配合Git代码库和仿真环境配置指南,帮助开发者快速实现从算法仿真到真机部署的完整闭环。无论是学生、工程师还是科研人员,都能通过本书构建系统的ROS2开发能力,抢占机器人技术前沿阵地。
二、第2章 ROS2基础入门—从第一个节点开始(提炼总结)
2.1节 编写你的第一个节点(提炼总结)
2.1.1节 Python示例(提炼总结)
1、在ubuntu主目录下创建chapt2文件夹,用vscode打开这个文件夹,创建ros2_python_node.py文件
2、文件编写如下代码
import rclpy
from rclpy.node import Node
def main():
rclpy.init()
node = Node("python_node")
node.get_logger().info("你好 python 节点!")
rclpy.spin(node)
rclpy.shutdown()
if __name__ == "__main__":
main()
3、在vscode按ctrl+shift+~快速打开集成终端,输入如下命令
python3 ros2_python_node.py
4、写代码添加提示,需要安装python插件,在扩展中搜索安装即可
2.1.2节 C++示例(提炼总结)
1、在ubuntu主目录下创建chapt2文件夹,用vscode打开这个文件夹,创建ros2_cpp_node.cpp文件
2、文件编写如下代码
#include "rclcpp/rclcpp.hpp"
int main(int argc , char **argv)
{
rclcpp::init(argc,argv);
auto node = std::make_shared<rclcpp::Node>("cpp_node");
RCLCPP_INFO(node -> get_logger(),"你好 c++ 节点!");
rclcpp::spin(node);
rclcpp::shutdown();
return 0;
}
3、在chapt2文件夹下新建CMakeLists.txt文件,输入如下内容:
cmake_minimum_required(VERSION 3.8)
project(ros2_cpp)
add_executable(ros2_cpp_node ros2_cpp_node.cpp)
find_package(rclcpp REQUIRED)
target_include_directories(ros2_cpp_node PUBLIC ${rclcpp_INCLUDE_DIRS})
target_link_libraries(ros2_cpp_node ${rclcpp_LIBRARIES})
4、在vscode按ctrl+shift+~快速打开集成终端,输入如下命令
cmake .
make
./ros2_cpp_node
5、再打开另外一个终端,输入如下命令
列举所有node节点
ros2 node list
查看节点信息
ros2 node info /cpp_node
6、写代码添加提示,需要安装C++插件,在扩展中搜索安装即可
2.2节 使用功能包组织Python节点(提炼总结)
- 功能包:Package是ROS2用于组织和管理节点的工具,在功能包内编写代码后,只需要配置几句指令,就可以使用ROS2提供的构建指令对节点进行编译和安装,还可以将功能相关的节点放在同一个功能包下,方便分享和使用
2.2.1节 在功能包中编写Python节点(提炼总结)
1、在vscode打开主目录chapt2文件,打开集成终端,输入如下命令
ros2 pkg create demo_python_pkg --build-type ament_python --license Apache-2.0
创建了一个功能包,demo_python_pkg是功能包的名字,功能包有如下内容:
2、在demo_python_pkg/demo_python_pkg目录下新建python_node.py,在文件中输入如下代码:
import rclpy
from rclpy.node import Node
def main():
rclpy.init()
node = Node("python_node")
node.get_logger().info("你好 python 节点!")
rclpy.spin(node)
rclpy.shutdown()
3、打开demo_python_pkg/setup.py,添加如下内容:
entry_points={
'console_scripts': [
'python_node = demo_python_pkg.python_node:main',
],
解析:setup.py是构建配置文件,当执行python_node时,就相当于执行demo_python_pkg目录下python_node文件中的main函数
4、打开demo_python_pkg/package.xml,添加如下信息:
<license>Aqache-2.0---</license>
<depend>rclpy</depend>
<test_depend>ament_copyright</test_depend>
解析:package.xml是ROS2功能包的清单文件,添加用到的rclpy库
5、在集成终端,输入如下命令
colcon build
会在chapt2文件夹多出build、install和log三个文件夹,其中:
bulid里面是构建过程中产生的中间文件
install是放置构建结果的文件夹,打开install文件夹可以看到demo_python_pkg功能包,python_node等可执行文件就放在目录的特定文件夹下
log放置构建过程中产生的各种日志信息
6、在集成终端,输入如下命令
source install/setup.bash
用来修改环境变量,在install目录下有一个setup.bash脚本,直接运行它姐可以自动修改AMENT_PREFIX_PATH环境变量
7、在集成终端,输入如下命令
ros2 run demo_python_pkg python_node
2.2.2节 功能包结构分析(提炼总结)
- demo_python_pkg:默认和功能包名字保持一致,是放置节点代码的目录。该文件夹下_init_.py是python包的标识文件,表示该文件夹是一个python的包
- resource:该目录放置一些资源,无需关心,不用手动修改
- test:测试代码文件夹,用于放置代码单元测试文件,目前用处不大,了解即可
- LICENSE:是功能包的许可证,是Apache-2.0的协议内容,是一种灵活的开源许可证
- package.xml:是功能包的清单文件,在文件内声明功能包的名称、版本编号、功能包管理者、构建类型、许可证和依赖等信息
- setup.cfg:用于配置构建python包时的配置选项
- setup.py:是python包的构建脚本文件,其中包含一个setup()函数,用于指定如何构建和安装python包,在添加节点时,就需要在该文件中声明可执行文件名称及对应函数
- 注意:
ros node list:命令的作用是显示正在运行的节点
节点名称:在python文件中声明
功能包名称:在package.xml文件中声明
2.3节 使用功能包组织C++节点(提炼总结)
2.3.1节 在功能包中编写C++节点(提炼总结)
1、打开vscode的集成终端,进入chapt2目录下,输入如下命令:
ros2 pkg create demo_cpp_pkg --build-type ament_cmake --license Apache-2.0
创建了一个功能包,其目录结构如下:
2、在src目录下,新建cpp_node.cpp,输入如下代码:
#include "rclcpp/rclcpp.hpp"
int main(int argc , char **argv)
{
rclcpp::init(argc,argv);
auto node = std::make_shared<rclcpp::Node>("cpp_node");
RCLCPP_INFO(node -> get_logger(),"你好 c++ 节点!");
rclcpp::spin(node);
rclcpp::shutdown();
return 0;
}
3、编辑CMakeLists.txt文件,添加如下内容:
# 1.查找rclcpp头文件和库
find_package(rclcpp REQUIRED)
# 2.添加可执行文件 cpp_node
add_executable(cpp_node src/cpp_node.cpp)
# 3.为cpp_node添加依赖
ament_target_dependencies(cpp_node rclcpp)
# 4.将cpp_node复制到install目录
install(TARGETS cpp_node DESTINATION lib/${PROJECT_NAME})
4、编辑packages.xml,添加如下内容:
<depend>rclcpp</depend>
添加对rclcpp的依赖声明
5、在集成终端,输入如下命令
colcon build
会自动创建build、install和log这三个目录,并将构建中间文件、结果和日志放入对应目录中,在chapt2/install/demo_cpp_pkg/lib/demo_cpp_pkg/目录下就可以看到cpp_node可执行文件了
6、在集成终端,输入如下命令
source install/setup.bash
添加环境变量,即让ros2能够找到demo_cpp_pkg和其下的节点,当关闭窗口后,每次都要重新运行
7、在集成终端,输入如下命令
ros2 run demo_cpp_pkg cpp_node
2.3.2节 功能包结构分析(提炼总结)
- include:用于存放C++的头文件
- src:代码资源目录,可以放置节点或其他相关代码
- CMakeLists.txt:是C/C++构建系统CMake的配置文件,在该文件添加指令,即可完成依赖查找、可执行文件添加、安装等工作
- LICENSE:是功能包的许可证
- package.xml:是功能包的清单文件
- 在实际开发中还可以添加其他目录和文件,比如用于放置地图的map目录,用于放置参数的config目录等
2.4节 多功能包的最佳实践Workspace(提炼总结)
- 当前目录下有多个功能包时,明明只需要构建一个功能包,使用构建指令时却会将所有功能包都进行构建,功能包和编译产生的临时文件都在同一个目录,一旦功能包数量增加,就会变得十分混杂,本节来解决这个问题
- 一个完整的机器人由多个不同的功能模块组成,ros2开发者约定了Workspace(工作空间)这一概念,操作如下:
1、用vscode打开chapt2文件夹
2、在集成终端,输入如下命令:
mkdir -p chapt2_ws/src
会创建chapt2_ws后,并在该目录下创建src文件夹,这样就得到了一个工作空间
3、将所有的功能包放到src目录下
4、集成终端,输入如下命令:
colcon bulid
扫描并构建当前工作空间下所有的功能包
5、单独构建指定的功能包demo_cpp_pkg,输入如下命令:
colcon bulid --packages-select demo_cpp_pkg
6、同一工作空间下,不同功能包存在依赖的情况,比如demo_python_pkg依赖demo_cpp_pkg的构建结果,只需要在功能包的清单文件中声明依赖关系即可,打开demo_python_pkg/package.xml,添加对demo_cpp_pkg的依赖
<depend>demo_cpp_pkg</depend>
2.5节 ROS2基础之编程(提炼总结)
- ros2使用humble版本时,采用的就是python3.10版本,C++使用了11、14、17等新特性
2.5.1节 面向对象编程(提炼总结)
面向对象编程:创建类,类就是对事物的一种封装,类有自己的属性和方法。通过类的封装,在需要使用时便可以实例化一个类的对象。除了将类实例化成一个具体的对象进行调用外,类还能被继承
2.5.2节 用得到的C++新特性(提炼总结)
1、自动类型推导:auto,再给变量赋值时根据等号右边的类型自动推导变量的类型
2、智能指针:可以管理动态分配内存
3、Kambda表达式:(匿名函数)是一种简洁的函数定义方式,通常用于简化代码,特别是在需要短小函数作为参数传递时(如排序、过滤等场景)。以下是详细介绍:
- 基本语法
lambda 参数列表: 表达式
- 无参数:
lambda: 3.14
- 单参数:
lambda x: x * 2
- 多参数:
lambda x, y: x + y
- 核心特性
- 匿名性:没有函数名,直接通过变量接收或作为参数传递。
- 单表达式:函数体只能包含一个表达式(不能写
return
或复杂逻辑)。 - 即用性:通常用于临时函数场景。
4、函数包装器std::function ,它可以存储任意可调用对象,并提供统一的调用接口
5、多线程与回调函数:多线程可以让程序并行运行,回调函数是指将一个函数作为参数传递给另一个函数,并在特定条件满足或事件发生时被调用的函数。
2.6节 小结与点评(提炼总结)
- 掌握了使用python和c++编写ros2节点
- 使用功能包组织节点
- 使用工作空间组织节点
- 各种编程知识