news 2026/8/2 6:27:08

ros2简单的案例,一个节点采集图片,一个节点推理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ros2简单的案例,一个节点采集图片,一个节点推理

先说一下为什么要学ros2,:首先他的通信非常快,而且可以多语言编程。

比如说,如果要采集一张,然后多个模型推理,然后结果汇总,如果就单纯的用python的多线程,多进程,不仅速度慢,各种损耗,gil限制,而且多进程多了,管理起来比较复杂,并且ipc开销高,速度也不是很快。如果使用c++,如果模型中还要加几个大模型,各种算子没有,要自己写,如果采用部分模型c++推理,部分模型python推理,然后http通信,但是这样实时性又不好。采用ros2可以就可以非常好的解决这些问题,c++,python多语言编程,且通信速度非常快。

没有ros2环境需要根据系统版本安装对应的ros2.

# 安装 cv_bridge sudo apt install ros-jazzy-cv-bridge # 安装 OpenCV Python 包(推荐使用 pip 获取最新版本) pip install opencv-python

1,创建工作空间

mkdir -p ~/ros2_ws/src cd ~/ros2_ws

2, 创建python包

包名我们取为my_camera_pkg

cd src ros2 pkg create --build-type ament_python my_camera_pkg --dependencies rclpy sensor_msgs cv_bridge

参数说明:

  • --build-type ament_python:python包

  • --dependencies:自动在package.xmlsetup.py中添加依赖。

3,编辑节点代码

进入包目录:

cd my_camera_pkg/my_camera_pkg

创建两个python文件:

(1):camera_publisher.py (采集节点)

import rclpy from rclpy.node import Node from sensor_msgs.msg import Image import cv2 from cv_bridge import CvBridge class CameraPublisher(Node): def __init__(self): super().__init__('camera_publisher') self.publisher_ = self.create_publisher(Image, '/camera/image_raw', 10) self.timer = self.create_timer(1.0 / 30, self.timer_callback) # 30 Hz self.cap = cv2.VideoCapture(0) if not self.cap.isOpened(): self.get_logger().error('Cannot open camera') raise RuntimeError('Camera open failed') self.bridge = CvBridge() self.get_logger().info('Camera publisher started') def timer_callback(self): ret, frame = self.cap.read() if ret: msg = self.bridge.cv2_to_imgmsg(frame, encoding='bgr8') self.publisher_.publish(msg) else: self.get_logger().warn('Failed to capture frame') def destroy_node(self): self.cap.release() super().destroy_node() def main(args=None): rclpy.init(args=args) node = CameraPublisher() try: rclpy.spin(node) except KeyboardInterrupt: pass finally: node.destroy_node() rclpy.shutdown() if __name__ == '__main__': main()

(2):canny_subscriber.py(推理节点),为了减少搭建环境的工作量,我这里不使用yolo,用canny算子来演示。

import rclpy from rclpy.node import Node from sensor_msgs.msg import Image import cv2 from cv_bridge import CvBridge class CannySubscriber(Node): def __init__(self): super().__init__('canny_subscriber') self.subscription = self.create_subscription( Image, '/camera/image_raw', self.image_callback, 10) self.bridge = CvBridge() # 创建显示窗口 cv2.namedWindow('Canny Edge', cv2.WINDOW_NORMAL) self.get_logger().info('Canny subscriber started') def image_callback(self, msg): try: cv_image = self.bridge.imgmsg_to_cv2(msg, desired_encoding='bgr8') except Exception as e: self.get_logger().error(f'cv_bridge error: {e}') return # 转为灰度图 gray = cv2.cvtColor(cv_image, cv2.COLOR_BGR2GRAY) # Canny 边缘检测 edges = cv2.Canny(gray, 50, 150) # 显示结果 cv2.imshow('Canny Edge', edges) cv2.waitKey(1) def destroy_node(self): cv2.destroyAllWindows() super().destroy_node() def main(args=None): rclpy.init(args=args) node = CannySubscriber() try: rclpy.spin(node) except KeyboardInterrupt: pass finally: node.destroy_node() rclpy.shutdown() if __name__ == '__main__': main()

4 ,添加可执行权限

chmod +x camera_publisher.py canny_subscriber.py

4. 配置包信息

~/ros2_ws/src/my_camera_pkg/setup.py中找到entry_points部分。修改成:

entry_points={ 'console_scripts': [ 'camera_publisher = my_camera_pkg.camera_publisher:main', 'canny_subscriber = my_camera_pkg.canny_subscriber:main', ], },

5. 编译工作空间

#回到工作空间根目录: cd ~/ros2_ws # 编译 colcon build --packages-select my_camera_pkg source install/setup.bash #运行采集节点代码: source ~/workspaces/ros2_ws/install/setup.bash ros2 run my_camera_pkg camera_publisher

6:运行推理节点代码:

source ~/workspaces/ros2_ws/install/setup.bash ros2 run my_camera_pkg canny_subscriber

7:结果

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 15:02:26

LangChain4j AI Services 深度解析:声明式 API 与接口驱动开发

LangChain4j AI Services 深度解析:声明式 API 与接口驱动开发 前言 LangChain4j 的 AI Services 是框架的核心特性之一,它采用声明式 API 设计,让开发者只需定义接口,无需编写实现类即可调用 LLM。这种设计类似于 Spring Data JP…

作者头像 李华
网站建设 2026/7/14 15:02:27

一文搞懂智能强化学习:如何打造下一代化学语言模型?(保姆级教程),从入门到精通,收藏这一篇就够了!

智能强化学习赋能下一代化学语言模型,用于分子设计与合成 ChemCRAFT 是一个 7-14 亿参数的开源化学 LLM,在药物设计任务上优于 GPT-4/Gemini,同时在本地运行,可降低 65% 的云令牌成本。 核心技巧:“认知解耦”——该模…

作者头像 李华
网站建设 2026/7/14 15:02:42

bug2026.03.18

bug1服务器启动成功,但是无法访问网页。解决:linux防火墙开放8090端口,之后就可以访问了。firewall-cmd --add-port8090/tcp --permanent && firewall-cmd --reload && firewall-cmd --list-portsbug2redis容器环境删掉&…

作者头像 李华
网站建设 2026/7/14 15:02:39

别再被割韭菜了!AI Agent学习资源大公开

一、先认清一个事实:AI Agent 到底学什么? 很多人一上来就问:“怎么学AI Agent?报哪个班好?” 我的回答永远是:先搞懂三件事——提示词、API调用、Agent框架。 提示词是跟AI沟通的“语法”API调用是让AI连接…

作者头像 李华
网站建设 2026/7/14 15:02:27

数据类型及扩展

public class 数据类型扩展 {public static void main(String[] args) {// 整数扩展: 进制 二进制0b 十进制 八进制0 十六进制0xint i110;int i2010; //二进制0int i30x10; //十六进制0x 0~9 A~F 16System.out.println(i1);System.out.println(i2);Syst…

作者头像 李华
网站建设 2026/7/14 15:02:25

Paperhey 降重与降 AIGC:从 99.8% 到 14.9%,学术写作的“合规护航方案”

深夜,论文查重报告弹出来的那一刻,你的心跳也跟着停了半拍——99.8% AIGC 疑似度,鲜红的数字像一道学术“红牌”。导师的消息紧随其后:“内容需要调整,注意原创性。”这种场景,是不是每个用过 AI 辅助写作的…

作者头像 李华