### 配置和运行电脑内置摄像头
要在 ROS 中配置并运行电脑内置摄像头,可以通过 `usb_cam` 或其他类似的包实现。以下是具体方法:
#### 安装必要的依赖项
首先需要确保已安装 `usb_cam` 包以及相关的驱动程序。如果没有安装,则通过以下命令完成安装:
```bash
sudo apt-get install ros-<your_ros_distro>-usb-cam
```
其中 `<your_ros_distro>` 是指代您的 ROS 发行版名称(如 noetic、melodic 等)。[^1]
#### 启动 USB 摄像头节点
启动 `usb_cam` 节点以发布来自内置摄像头的图像数据。创建一个新的 launch 文件或者直接在终端中执行以下命令:
```bash
roslaunch usb_cam usb_cam-test.launch video_device:=/dev/video0 image_width:=640 image_height:=480 pixel_format:=yuyv camera_frame_id:=usb_cam
```
上述命令中的 `/dev/video0` 表示默认的第一个摄像头设备路径,通常对应于笔记本电脑上的内置摄像头。如果存在多个摄像头,请根据实际情况更改该路径。
对于像素格式选项 (`pixel_format`) ,常见的值包括但不限于 yuv422 (即 yuyv)、mjpeg 和 rgb8 。可以根据需求选择合适的编码方式。[^4]
#### 图像查看器订阅主题
为了验证是否正常工作,可以使用 rqt_image_view 工具来实时预览捕获到的画面:
```bash
rosrun rqt_image_view rqt_image_view
```
此时应该能够看到由 /usb_cam/image_raw 主题发布的原始未压缩帧序列。[^3]
#### 相机标定过程简介
当发现视觉效果不佳或测量精度不足时,可能是因为当前使用的相机参数并不适合特定场景下的应用场合。这时就需要重新对标记好的图案进行拍摄从而获得更精确的新一组内外部参数矩阵。整个流程大致如下所示:
1. 准备好黑白相间的棋盘格纸张作为参照物;
2. 将其放置在一个平坦表面上,并让镜头尽可能多地覆盖不同角度视场范围内的各个部分;
3. 利用专门编写的小型应用程序采集多组样本图片存档备用;
4. 把所得结果导入至 OpenCV 库函数 cv::calibrateCamera() 内计算得出最终数值保存下来供后续调用即可。[^5]
```python
import numpy as np
import cv2
from matplotlib import pyplot as plt
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
objp = np.zeros((7*9,3), np.float32)
objp[:,:2] = np.mgrid[0:9,0:7].T.reshape(-1,2)*20
axis = np.float32([[3,0,0], [0,3,0], [0,0,-3]]).reshape(-1,3)
def draw(img, corners, imgpts):
corner = tuple(corners[0].ravel())
img = cv2.line(img, corner, tuple(imgpts[0].ravel()), (255,0,0), 5)
img = cv2.line(img, corner, tuple(imgpts[1].ravel()), (0,255,0), 5)
img = cv2.line(img, corner, tuple(imgpts[2].ravel()), (0,0,255), 5)
return img
for fname in glob.glob('*.jpg'):
img = cv2.imread(fname)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,corners=cv2.findChessboardCorners(gray,(9,7))
if ret==True:
objpoints.append(objp)
corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
imgpoints.append(corners2)
img = cv2.drawChessboardCorners(img, (9,7), corners2,ret)
cv2.imshow('img',img)
cv2.waitKey(500)
cv2.destroyAllWindows()
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1],None,None)
np.savez("B.npz",mtx=mtx,dist=dist,rvecs=rvecs,tvecs=tvecs)
print(mtx)
print(dist)
```