ROS2学习笔记|创建工作空间并打印文件内容
一,创建 ROS 2 工作空间
- 创建工作空间目录及
src
子目录:mkdir -p ~/ros2_ws/src cd ~/ros2_ws
解释:
mkdir -p
命令用于创建目录,如果目录已存在则不报错。这里创建了名为ros2_ws
的工作空间目录,并进入该目录,src
目录用于存放功能包源代码。 -
初始化工作空间(首次编译时会自动初始化)
colcon build
解释:
colcon build
命令用于编译工作空间,首次执行时会自动初始化工作空间,创建编译所需的文件和目录。编译完成后会生成build
目录(存放中间编译文件)、install
目录(存放安装后的文件,包括可执行文件、库文件等)和log
目录(存放编译日志)。 - 设置工作空间环境变量:
source install/setup.bash
解释:该命令让系统识别工作空间中的功能包和节点等资源。为方便每次打开新终端自动设置,可将其添加到
.bashrc
文件:echo "source ~/ros2_ws/install/setup.bash" >> ~/.bashrc source ~/.bashrc
二、创建功能包
- 进入
src
目录:cd ~/ros2_ws/src
- 创建 Python 功能包:
ros2 pkg create --build-type ament_python demo_python_topic --dependencies rclpy
解释:
ros2 pkg create
用于创建功能包,--build-type ament_python
指定使用 Python 构建类型,demo_python_topic
是功能包名称,--dependencies rclpy
表示该功能包依赖 ROS 2 的 Python 客户端库rclpy
。 -
目录结构说明:创建完成后,
src
目录下会生成demo_python_topic
功能包目录,包含以下重要文件:package.xml
:记录功能包的元信息,如名称、版本、依赖等。setup.py
:用于配置功能包的构建和安装,包括定义可执行文件的入口点等。demo_python_topic
目录:存放 Python 源代码文件。
三、编写代码实现文件内容打印
进入功能包的 Python 代码目录
cd ~/ros2_ws/src/demo_python_topic/demo_python_topic
- 创建 Python 脚本文件(如
novel_pub_node.py
),内容如下:import rclpy from rclpy.node import Node import osclass NovelPubNode(Node):def __init__(self, node_name):super().__init__(node_name)self.get_logger().info(f'{node_name},启动!')def print_novel_from_file(self):# 直接指定工作空间根目录workspace_dir = '/home/elf/chapt3/topic_ws'file_path = os.path.join(workspace_dir, 'novel1.txt')self.get_logger().info(f"尝试打开文件: {file_path}")try:with open(file_path, 'r', encoding='utf-8') as file:content = file.read()self.get_logger().info('开始打印小说内容:')self.get_logger().info(content)except FileNotFoundError:self.get_logger().error('未找到 novel1.txt 文件,请检查文件是否存在。')except Exception as e:self.get_logger().error(f'读取文件时出现错误:{e}')def main():rclpy.init()node = NovelPubNode('novel_pub')node.print_novel_from_file()# 打印完文件内容后,手动销毁节点并关闭rclpynode.destroy_node()rclpy.shutdown()if __name__ == "__main__":main()
解释:导入
rclpy
库用于 ROS 2 Python 开发,Node
类用于创建节点,os
库用于文件路径操作。NovelPubNode
类继承自Node
,在构造函数中初始化节点并输出启动信息。print_novel_from_file
方法用于读取指定文件内容,其中workspace_dir
需根据实际工作空间路径设置,os.path.join
用于拼接路径。通过try-except
捕获文件读取过程中的异常。main
函数初始化 ROS 2,创建节点实例,调用文件读取方法,最后销毁节点并关闭 ROS 2 环境。 - 赋予脚本可执行权限:
chmod +x novel_pub_node.py
解释:该命令为
novel_pub_node.py
脚本添加可执行权限,确保 ROS 2 能运行该脚本。
四、配置setup.py
文件
-
打开
~/ros2_ws/src/demo_python_topic/setup.py
文件,在entry_points
部分添加以下内容:'console_scripts': ['novel_pub_node = demo_python_topic.novel_pub_node:main', ],
解释:
console_scripts
用于定义命令行可执行脚本,novel_pub_node
是运行节点时使用的名称,demo_python_topic.novel_pub_node
指定功能包和脚本文件名(不含.py
后缀),:main
表示脚本中的主函数。
五、编译工作空间
cd ~/ros2_ws
colcon build
解释:重新编译工作空间,使新添加或修改的代码生效。编译过程中会根据setup.py
和package.xml
文件配置生成可执行文件等。
六、运行节点
- 确保已设置工作空间环境变量
source install/setup.bash
运行节点
ros2 run demo_python_topic novel_pub_node
解释:
ros2 run
命令用于运行 ROS 2 节点,demo_python_topic
是功能包名称,novel_pub_node
是在setup.py
中配置的节点名称。运行后,节点将读取并打印novel1.txt
文件内容。如果在运行过程中遇到问题,可参考以下常见问题排查:
- 未找到可执行文件:检查
setup.py
文件中entry_points
配置是否正确,脚本是否有可执行权限,重新编译工作空间。 - 文件未找到错误:确认文件路径是否正确,文件是否存在,文件权限是否可读。
- 环境变量问题:确保 ROS 2 和工作空间的环境变量已正确设置,可尝试重新设置或添加到
.bashrc
文件