我需要在ROS2 Humble 环境下调用香橙派 5 PLUS 的摄像头。
硬件:香橙派 5 PLUS、OV13855(摄像头)、USB 摄像头(罗技720P)
硬件自己连接哈 。
注:黑色金属外壳散热效果一般。
1、硬件初始化
首先,按照文件
OrangePi_5_Plus_RK3588_用户手册_v1.8.pdf
中,
3.34. OV13850 和 OV13855 MIPI 摄像头的测试方法
操作一遍。
2、安装pip
注:通过pip安装opencv-python
Ubuntu22系统没有预先安装pip,需要自己安装,方法如下:
sudo apt update
sudo apt install python3-pip
3、安装opencv-python
注:调用摄像头需要用到opencv
Ubuntu22系统没有预先安装opencv-python,需要自己安装,方法如下:
sudo apt update
pip3 install opencv-python
4、创建一个ROS2节点
节点的创建不做描述,我的文件目录如下
向node.py 文件内复制如下代码:
#!/usr/bin/env python3
import rclpy
from rclpy.node import Node
import cv2
class MyNode(Node):
"""
创建一个MyNode节点,并在初始化时输出一个话
"""
def __init__(self, name):
super().__init__(name)
self.get_logger().info("大家好,我是%s!" % name)
for device in [11, 16]:
if self.open_camera(device):
break
def open_camera(self, device_id):
# 打开摄像头
cap = cv2.VideoCapture(device_id)
# 设置分辨率
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) # 设置宽度
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) # 设置高度
if not cap.isOpened():
self.get_logger().error(f"Can not find camera at /dev/video{device_id}")
return False
self.get_logger().info(f"Camera /dev/video{device_id} is opened successfully.")
while True:
# 捕获帧
ret, frame = cap.read()
if not ret:
self.get_logger().error("Failed to grab frame")
break
# 显示帧
cv2.imshow(f"Camera /dev/video{device_id}", frame)
# 按下 'q' 键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放摄像头并关闭所有OpenCV窗口
cap.release()
cv2.destroyAllWindows()
return True
def main(args=None):
rclpy.init(args=args) # 初始化rclpy
node = MyNode("node") # 新建一个节点
rclpy.spin(node) # 保持节点运行,检测是否收到退出指令(Ctrl+C)
rclpy.shutdown() # 关闭rclpy
if __name__ == "__main__":
main()
下面这部分代码中数组 [11, 16]代表着设备号
for device in [11, 16]:
if self.open_camera(device):
break
你可以通过命令ls /dev/video*查看有哪些视频设备可用
ls /dev/video*
比如我的:
5、保存代码,编译、source、运行
colcon build
source install/setup.bash
ros2 run node node
运行效果如下 :
补充:仅仅调用香橙派摄像头
如果不是 ROS2 环境,仅仅调用香橙派摄像头,也可以用下面的代码。未实测,勿喷。
import cv2
def open_camera(device_id):
# 打开摄像头
cap = cv2.VideoCapture(device_id)
if not cap.isOpened():
print(f"Can not find camera at /dev/video{device_id}")
return
print(f"Camera /dev/video{device_id} is opened successfully.")
while True:
# 捕获帧
ret, frame = cap.read()
if not ret:
print("Failed to grab frame")
break
# 显示帧
cv2.imshow(f"Camera /dev/video{device_id}", frame)
# 按下 'q' 键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放摄像头并关闭所有OpenCV窗口
cap.release()
cv2.destroyAllWindows()
if __name__ == "__main__":
# 尝试打开不同的摄像头设备
for device in [11、16、18]:
open_camera(device)
最后,我有话说:
如果文章对你有帮助,我很开心。有疑问请留言,看到后,我会回复。
评论前必须登录!
注册