RK摄像头使用指南
任务目的
使用RK开发板识别摄像头中的apriltag标签位置姿态。在机械臂程序中通过lebai_sdk使用信号量读取RK开发板的识别结果。
前置知识
路由器及网络配置、Linux使用、AprilTag测距原理、Lua编程、lebai sdk开发
配置RK开发板
摄像头安装
将摄像头固定到手臂末端,将USB线沿手臂固定好并将USB插头接入RK开发板。
网络配置
需要准备好一个路由器,并登录路由器的后台管理系统,确保其正常工作。
准备3根网线,一根有网的网线接入路由器wan口,另一根网线路由器和RK板连接,最后一根分别接入手臂控制箱与路由器。

在路由器的后台管理系统中分别找到手臂控制箱和RK开发板的 IP地址,文档后续假设手臂控制箱的IP为 192.168.22.200 ,RK开发板的IP为 192.168.22.201 /ui/plugin,需要根据实际情况进行修改。

摄像头配置
安装插件
在浏览器中打开RK开发板的控制系统 http://192.168.22.201/ui/plugin
点击左上角的安装插件,选中cameracamera_calibraterapriltag共3个插件,点击"确定"安装插件。安装完成后,点击右侧开关,操作使能打开这3个插件
配置摄像头插件
点击camera插件的"前往插件"按钮,填写摄像头的序号index、画面的宽度width、画面的高度height,画面翻转,填写完成后点击"save"保存参数

配置视觉标定插件
准备标定板,放在摄像头显示范围内。

点击camera_calibrater插件的"前往插件"按钮,填写网络配置时获取到的手臂控制箱的IP、相机位置选择眼在手上、标定板的角点行数、标定板的角点列数、相邻角点之间的间隔长度,格子长度填写完成后点击"save"保存参数

进行视觉标定
通过示教手臂到不同位置,待摄像头画面稳定不晃动后,点击"记录点位"按钮。
持续上述步骤,直到记录的点位数量足够多,点位数量越多,结果越精准,通常需要6~20个点位。
点位采集完成后,点击标定按钮,待下方出现标定结果记录点位变为0,即为标定完成。

配置apriltag插件
点击apriltag插件的"前往插件"按钮,填写标签类型tag_family、标签尺寸tag_size、信号量signal,填写完成后点击"save"保存参数。

完成配置
恭喜,至此已完成对RK开发板的配置。
配置手臂
在浏览器中打开手臂的控制系统 http://192.168.22.200/dashboard/
点击"场景" "导入",将上方的apriltag.zip导入进去,即可得到如图所示3个场景。

配置RK开发板参数
打开名为apriltag的场景,即上图第1个。
第1步修改变量way为signal,使用进行通信,第2步将RK开发板的IP地址赋值给camera_ip变量,第3步将配置RK开发板的apriltag插件时设置的信号量signal赋值给sid变量。
第四步可以将run_test置为true后,点击右上角的运行,会打印出找到的所有标签,并打印耗费的时间。测试完后务必将run_test置为false,后续场景中均需要以此场景为基础 调用该场景里的函数。

csharp
import cv2
import apriltag
import numpy as np
# 初始化摄像头
cap = cv2.VideoCapture(0)
# 初始化AprilTag检测器
detector = apriltag.Detector()
while True:
ret, frame = cap.read()
if not ret:
break
# 转换为灰度图像
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 检测AprilTag
tags = detector.detect(gray)
for tag in tags:
# 获取标签的中心位置
center = tag.center
print(f"Tag ID: {tag.tag_id}, Center: {center}")
# 获取标签的姿态
pose = tag.pose
print(f"Pose: {pose}")
# 显示图像
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
示教获取抓取点与标签的相对位置
打开名为apriltag-offset的场景,即上图第3个。
配置tag_id为目标标签的ID。
点击右上角的运行,会打印出识别到的所有标签的位置信息,然后工具中心点TCP会移动到标签上方200mm的位置,并自动进入示教模式,将手臂拖拽到理想的抓取位后,按下手臂肩部灯板的按钮,会打印出位置信息,首先检验一下good_pose和verify是否相差2mm以内,确认数据无误后复制offset的值

csharp
-- 初始化lebai_sdk
local lebai = require("lebai_sdk")
-- 读取信号量
local tag_position = lebai.read_signal("tag_position")
local tag_pose = lebai.read_signal("tag_pose")
-- 根据标签位置和姿态控制机械臂
-- 示例:移动机械臂到标签位置
lebai.move_to(tag_position)
运行抓取示例
打开名为"抓标签"的场景,即上图第2个,该场景为使用示例,可自由更改使用。
将上一步得到的offset赋值给cell2tag,配置tag_id为目标标签的ID。
将手臂示教到一个合适的位置后,点击右上角的运行,会运动到抓取点进行抓取,并返回到起始位置。