ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

ROS2实战之节点通信

ROS2实战之节点通信 文章目录创建工作空间节点通信为了演示ROS2中Node的通信过程下面假装开发一个“智能餐厅服务机器人”。创建工作空间当ROS2项目需求比较复杂时最好用工作空间进行项目管理。所谓工作空间就是具有特定结构的文件夹一个典型的ROS2工作空间主要包含以下几个子文件夹。src/根据宇宙编程惯例这显然是放源代码的也是唯一需要手动操作的目录。build/编译过程中生成的中间文件如 CMake 缓存、对象文件。由系统自动生成不要手动修改。install/编译成功后生成的可执行文件、库和头文件。当你运行 ros2 run 时系统实际上是从这个目录中加载程序。由系统自动生成。log/编译过程的日志文件。如果编译报错可以在这里查看详细错误信息。由系统自动生成。下面创建ROS2的工作空间mkdir -p ros2_ws/src cd ros2_ws/src ros2 pkg create --build-type ament_python restaurant_robot cd .. colcon build source install/setup.bash【row2_ws】即为工作空间。【ros2 pkg create】用于创建一个库并通过【–build-type】指明为【ament_python】类型即纯Python项目。【colcon】是ROS2 默认的命令行构建工具支持并行编译速度很快。【source】用于新增环境变量。将install/setup.bash注入环境变量后可以更便捷地运行。节点通信在完成工作空间的创建后进入代码编辑路径。在src下共有两层restaurant_robot其中外层src/restaurant_robot/是 ROS2 功能包的根目录包含 setup.py 等配置文件。内层…/restaurant_robot/是 Python 模块目录.py 源代码都要写在这个文件夹里。我们进入内层目录cd src/restaurant_robot/restaurant_robot/新建一个 Python 文件命名为first_node.py内容如下importrclpyfromrclpy.nodeimportNode# 定义一个类继承自 ROS2 的 Node 基类classFirstNode(Node):def__init__(self):# 调用父类构造函数传入节点名称 first_nodesuper().__init__(first_node)# 使用 ROS2 内置的日志系统打印信息self.get_logger().info(first_node started)defmain(argsNone):# 初始化 ROS2 客户端库 (rclpy)rclpy.init(argsargs)# 实例化节点nodeFirstNode()try:# 核心让节点进入事件循环保持进程不退出rclpy.spin(node)exceptKeyboardInterrupt:# 捕获 CtrlC 信号优雅退出passfinally:# 7清理资源并关闭 ROS2 通信node.destroy_node()rclpy.shutdown()if__name____main__:main()代码完成后退回到外层/restaurant_robot/目录修改setup.py文件找到 entry_points 字典在 console_scripts 列表中添加一行映射关系。entry_points{console_scripts:[# 格式自定义的运行命令名 Python模块名.文件名:主函数名run_first restaurant_robot.first_node:main,],},这行配置告诉 Python 的 setuptools 构建工具当用户在终端输入 run_first 时去 restaurant_robot 模块下的 first_node.py 文件中执行 main() 函数。至此回到ros2_ws文件夹下编译后即可运行colcon build source install/setup.bash ros2 run restaurant_robot run_first运行之后当前终端会输出我们设定的first_node started并卡住。此时打开一个新的终端输入ros2 node list即可返回/first_node说明ROS中有节点在运行。
返回列表