惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
V2EX
C
Check Point Blog
博客园_首页
B
Blog
D
Docker
U
Unit 42
量子位
I
InfoQ
有赞技术团队
有赞技术团队
Martin Fowler
Martin Fowler
GbyAI
GbyAI
L
LangChain Blog
云风的 BLOG
云风的 BLOG
博客园 - Franky
美团技术团队
T
The Blog of Author Tim Ferriss
阮一峰的网络日志
阮一峰的网络日志
月光博客
月光博客
Vercel News
Vercel News
Recent Announcements
Recent Announcements
雷峰网
雷峰网
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
Google DeepMind News
Google DeepMind News

博客园 - Lucky帅小武

AI学习入门,超清晰AI知识图谱整理及核心概念解析 基于SSM的在线考试系统毕业设计论文【范文】 基于SSM的仓库进销存系统毕业设计论文【范文】 基于SSM的在线外卖订餐系统毕业设计论文【范文】 基于SSM的酒店管理系统毕业设计论文【范文】 基于SSM的校园论坛网站系统毕业设计论文【范文】 ROS2笔记6--ROS2常用命令工具 ROS2笔记5--动作通讯 ROS2笔记4--服务通讯 ROS2笔记3--话题通讯 ROS2笔记1--简介及开发环境搭建 基于SSM的网上商城系统毕业设计论文【范文】 软考笔记(1)--操作系统 软考笔记(9)--计算机组成原理4--总线系统 软考笔记(9)--计算机组成原理3--处理器 软考笔记(9)--计算机组成原理2--指令系统 软考笔记(8)--多媒体技术 软考笔记(7)--数据库关系代数 软考笔记(5)--系统安全性与保密性设计
ROS2笔记2--工作空间、功能包、节点
Lucky帅小武 · 2024-04-18 · via 博客园 - Lucky帅小武

一、工作空间(Workspace)

ROS工作空间是用于存放ros功能包的一个文件夹,通常以ws结尾。用于存放工程开发相关的所有文件,包括源代码、编译生成的文件以及配置我呢见等。在ROS中工作空间是使用Catkin编译系统来组织和管理代码的基础单元。每个工作空间通常包含一个或多个功能包,这些功能包包含了实现特定功能的代码和资源。

1.1、创建工作空间

# 选择指定目录
cd ~
# 创建工作空间
mkdir -p ros_ws/src

1.2、编译工作空间

0

这个ros_ws就是工作空间的根目录,里面包含4个子目录

src:代码空间,用于后续编写代码、脚本等文件

build:编译空间,保存编译过程中产生的中间文件

install:安装空间,放置编译得到的可执行文件和脚本

log:日志空间,编译和运行过程中保存各种警告、错误、信息等日志

1.3、设置环境变量

编译成功后,需要设置环境变量

方法1:仅当前终端有效

source install/setup.bash

方法2:所有终端均有效

echo "source ~/ros_ws/install/setup.bash" >> ~/.bashrc

二、功能包(Package)

功能包是ROS中的一个基础组织单元,包含了一组实现特定功能的源代码文件、脚本、数据文件和其他资源。功能包可以独立存在,也可以依赖于其他功能包。每个功能包都有自己的依赖关系和构建规则,这些信息通常在功能包的package.xml文件中定义。功能包的设计使得代码复用和维护更加方便。

每个机器人可能有很多功能,比如移动控制、视觉感知、自主导航等,功能包的作用就是把不同的功能划分到不同的功能包中,尽量降低各个功能模块之间的耦合关系,当需要以功能包为单位提供时比较方便,所以功能包是ROS提供软件复用率的方法。

1、创建功能包

命令格式如下:

ros2 pkg create <package_name> --build-type <build-type> --dependencies <dependencies> --node-name

命令中:

pkg:表示功能包相关的功能

create:表示创建功能包

package_name:自定义功能包名称

build-type:功能包类似是python还是C++的,如果是C或C++则为ament_cmake;如果是python就是ament_python

dependencies:表示功能包的依赖项,C++需要包含rclcpp;Python需要包含rclpy,如有需要还有其他依赖

node-name:可执行程序的名称,会自动生成对应的源文件并生成配置文件

比如在终端中分别创建C++和Python版本的功能包:

cd ~/ros_ws/src
# 创建C++功能包
ros2 pkg create pkg_helloworld_cpp --build-type ament_cmake --dependencies rclcpp --node-name helloworld
# 创建Python功能包
ros2 pkg create pkg_helloworld_py --build-type ament_python --dependencies rclpy --node-name helloworld

2、编译功能包

创建好功能包后可以继续完成代码编写,之后需要编译和配置环境变量即可运行

cd ~/ros_ws/src
# 编译工作空间所有功能包
colcon build
# 编译指定1个或多个功能包
colcon build --packages-select 功能包名称列表
source install/setup.bash

三、节点(Node)

节点是ROS中运行的最小执行单元,是一个可执行文件,可以执行一些计算任务,处理数据,或者控制硬件设备。节点之间通过话题(Topic)、服务(Service)或动作(Action)等机制进行通信。节点可以发布话题提供其他节点订阅,或者提供服务给其他节点调用。一个完整的机器人系统由许多协同工作的节点组成,ROS2中单个可执行文件可以包含一个或多个节点。

节点创建的流程如下:

1、编程接口初始化

2、创建节点初始化

3、实现节点功能

4、销毁节点并关闭接口

以Python版本helloworld功能包节点为例

1、创建功能包

cd ~/ros_ws/src
ros2 pkg create pkg_helloworld_py --build-type ament-python --dependencies rclpy --node-name helloworld

0

2、编写代码

创建功能包完成后,会自动创建hello world.py文件用于编写节点代码

0

编写helloworld.py代码,逻辑为定时1秒打印一次Hello World

import rclpy                             # ROS2 Python接口库
from rclpy.node import Node              # ROS2 节点类
import time

# 定义HelloWorld节点,初始化时定时打印"Hello World"
class HelloWorldNode(Node):
    def __init__(self, name):
        super().__init__(name)                         # ROS2节点父类初始化
        while rclpy.ok():                              # ROS2系统是否正常运行
            self.get_logger().info("Hello World")      # ROS2日志输出
            time.sleep(1)
    

def main(args=None):                                  # ROS2节点主入口函数
    rclpy.init(args=args)                             # ROS2 Python接口初始化
    node = HelloWorldNode("helloworld")               # 初始化ROS2节点对象
    rclpy.spin(node)                                  # 循环等待ROS2退出 
    node.destroy_node()                               # 销毁节点对象
    rclpy.shutdown()                                  # 关闭ROS2 Python接口

代码编写完成后需要设置功能包的编译选项,让系统知道程序的入口,打开功能包的setup.py文件,加入程序入口的配置: 

0

其中helloworld是可执行文件名称,pkg_helloworld_py是功能包名称,helloworld:main是python文件名称和入口函数名

3、编译代码

cd ~/ros_ws
colcon build --packages-select pkg_helloworld_py
source install/setup.bash

0

4、运行节点

ros2 run pkg_helloworld_py helloworld

 运行成功后终端中定时打印“Hello World”字符串

0