接着前几节课讲的项目,创建一个camera_oepn.py
#!/usr/bin/env python3
import rclpy
from rclpy.node import Node
from cv_bridge import CvBridge, CvBridgeError
from sensor_msgs.msg import Image
import cv2
class CameraNode(Node):
def __init__(self):
super().__init__('camera_node') # 使用 'camera_node' 作为节点名称
self.bridge = CvBridge()
self.image_pub = self.create_publisher(Image, 'camera/image', 10)
self.timer = self.create_timer(0.1, self.timer_callback) # 100ms interval
self.cap = cv2.VideoCapture(0) # 打开摄像头
if not self.cap.isOpened():
self.get_logger().error('Failed to open camera device.')
def timer_callback(self):
ret, cv_image = self.cap.read() # 读取摄像头图像
if ret:
try:
ros_image = self.bridge.cv2_to_imgmsg(cv_image, encoding="bgr8")
ros_image.header.stamp = self.get_clock().now().to_msg()
self.image_pub.publish(ros_image)
cv2.imshow('Camera Image', cv_image) # 显示图像
cv2.waitKey(1) # 等待1毫秒,以便更新窗口
except CvBridgeError as e:
self.get_logger().warn('CvBridge Error: %s', e)
def destroy_node(self):
self.cap.release() # 释放摄像头资源
cv2.destroyAllWindows() # 关闭所有OpenCV窗口
super().destroy_node()
def main(args=None):
rclpy.init(args=args)
camera_node = CameraNode()
rclpy.spin(camera_node)
camera_node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
在setup.py添加路径
此时我们需要把外接摄像头的usb接上
输入ls /dev/,可以看到video
运行成功打开
效果如下:
注意!如果你的画面没打开的话,按照以下操作
点击设置
这里切换2.0或者3.1尝试一下,切换之后记得再次插拔摄像头usb口,重新识别一下。