视觉巡线人形机器人使用说明

1. 机器人简介

1.1 功能简介

机器人基于DBSP舵机系统开发,采用反馈式的可视化动作编辑器,以摆姿势的简捷方式完成动作设计,并以动作组的形式保存,方便二次开发;由树莓派4B开源主板完成机器人的感知处理,使用Python语言,借助OPEN-CV视觉库,结合低照度高帧率高清摄像头和板载IMU传感器,可简单完成视觉巡线,避障,导航等多种机器人自主控制功能。机器人采用16颗RP-U41舵机,精度高、力量大、速度快,可在各种机器人竞赛中胜人一筹。

1.2 机器人特点

  • 基于DBSP舵机系统开发,机器人动作设计简单,易于二次开发。
  • 采用最新树莓派4B主板,运算能力强,开发资源丰富,能完成复杂的视觉算法。
  • 采用Python语言,集成OPEN-CV库用于视觉处理。
  • 采用16颗RP8-S41舵机(16自由度),精度高、扭力大、速度快。
  • 采用SONY IMX290低照度高帧率高清摄像头,识别效果精度更高。
  • 装有2颗大功率补光灯,可适应光线不足的场景。

视觉机器人巡线效果视频

1.3 机器人规格

image-20210816160055622

  • 尺寸:总高度49、肩宽20cm、臂长22cm、腿长29cm、脚掌(8.5*13.9mm)

  • 重量:2.3 kg

  • 支架材质:铝合金

  • 舵机:RP8-S41 DBSP舵机(16颗)

  • 主板:树莓派4B(RAM:2GB)+ Rasprobo1扩展板

  • 摄像头:SONY IMX290(1/2.8“),1920*1080@60fps,USB接口

  • 补光灯:3W LED(2颗)

  • 电池:7.4V 20C 1500mAh

2. 机器人硬件构成

2.1 硬件平台介绍

机器人硬件主要由DBSP舵机系统+树莓派4B+摄像头模组构成,由DBSP舵机系统设计和控制机器人动作,由树莓派4B+摄像头模组进行视觉处理并调用机器人动作。功能区分明确,实现简单,调试简单。

DBSP舵机系统 - RP8-S41舵机 x 16

舵机介绍

image-20210816160311893

DBSP舵机系统 - Rasprobo1扩展板

Rasprobo1说明

image-20210816160542721

树莓派4B主板

树莓派介绍

image-20210816160842654

摄像头模组

image-20210816163153149

2.2 硬件连接

  • Rasprobo1扩展板插到树莓派4B主板上。

img

  • DBSP舵机分组串联后接到Rasprobo1扩展板上的DBSP舵机接口。

注1:如果已经设计好动作,舵机串联的顺序和接入的通道不可改变,否则会导致动作错乱。

注2:舵机两侧的2个接口的功能是一致的,可以随意连接。

img

  • 电池接到Rasprobo1扩展板上的电源接口,给DBSP舵机系统和树莓派4B供电。

img

  • 摄像头模组通过USB线接到树莓派4B主板上的任意USB口。

img

  • 补光灯连接到Rasprobo1扩展板的LAMP1和LAMP2口。

img

3. 机器人软件构成

3.1 DBSP动作编辑器

3.2 树莓派软件系统

[使用教程]:详见工程目录下的doc目录中的附录A.开发环境配置附录B.其他教程

注:机器人出厂已经安装好系统,不需要再次下载系统,系统的使用请根据自身需要进行深入学习。

3.3 VNC远程软件

下载地址

使用教程:参考5.1章节

4. 机器人快速入门

4.1 连接输入输出设备

  • 需要自行准备键盘、鼠标和显示器,用于树莓派的初步控制。
  • 将键盘和鼠标的USB接口或无线接收头接到树莓派4B任意USB接口。用于操作树莓派4B的系统。

img

  • 用MICRO HDMI - HDMI线将树莓派4B的HDMI1或HDMI2口连接至支持HDMI的显示器。用于显示树莓派4B的系统。
注:如果显示器无HDMI接口,可自行购买适合自己显示接口的HDMI-VGA或HDMI-DVI转换器。

img

注:以上步骤为首次使用树莓派4B时必要的步骤,当设置好无线网络后,可以通过VNC无线连接和远程控制树莓派4B。请参考5.1 VNC远程连接。

4.2 给机器人充电

  • 机器人耗电较大,为避免调试过程被中断,在使用机器人前,请用充电器将电池充满电。
  • 电池低电量报警:电池电量接近耗尽时,Rasprobo1主板会开始报警(红灯闪烁,蜂鸣器滴滴响),请立即关机并使用充电器给电池充电。若不及时关机,电池会过放,电池过放后将永久性损坏!!!
  • 充电方式:将AC-3S10充电器接入市电,将电池的平衡充电口插入充电器,充电器指示灯为红色表示正在充电中,指示灯变为绿色常亮则为充满。

img

4.3 开机

将Rasprobo1扩展板上的电源开关拨到左侧(ON)开机,开机后电源开关旁边的电源指示灯亮起。树莓派4开始启动系统,显示器开始显示启动画面。

img

4.4 运行程序

  • 工程目录:出厂默认将工程目录放置在桌面上,名称为:fs-line-follow-and-obs-avoid。

img

  • 程序目录:双击进入工程目录,src为程序目录。

img

  • 运行终端:鼠标在src目录上右击,选择“在终端中打开"。
  • 运行Python程序:在弹出的终端中输入命令python3 main.py,回车。main.py开始被执行,机器人开始运行出厂工程,断开键盘、鼠标、显示器等有线连接,将机器人放置在布置好的赛道上运行。(建议使用VNC远程控制)

img

4.5 关机

将Rasprobo1扩展板上的电源开关拨到右侧(OFF)关机。

img

5. 机器人高级操作

5.1 VNC远程连接

  • VNC介绍:通过一台电脑远程连接和控制树莓派4B的软件。利用VNC软件可避免树莓派4B与键盘、鼠标和显示器的有线连接,方便机器人无线运行。
  • VNC安装:树莓派4B已经安装了VNC软件,远程连接的电脑需要根据3.3章节地址自行下载和安装。
  • 树莓派4B连接无线网络:点击wifi标志选择需要连接的热点,连接wifi网络。

img

  • 确认树莓派4B的IP地址:点击VNC标志,弹出VNC界面,上面会显示IP地址,例中IP为:192.168.0.102。

img

img

  • 电脑连接树莓派4B:电脑端运行VNC Viewer,在地址栏输入树莓派4B的IP地址,回车,在弹出的身份认证界面输入树莓派4B的用户名和密码(默认用户名为:pi,默认密码为:raspberry),选中记住密码,点击OK。

img

img

  • 再次连接树莓派4B:由于记录了密码,下次使用的时候直接双击连接记录便可以连接树莓派4B。

img

5.2 DBSP应用

5.2.1 DBSP工程文件

注: 如果你手里拿到的机器人是已经调试好的,请跳过此步骤。

DBSP工程文件存放在src/data/dbsp文件夹下,后缀为.svproj格式的文件就是DBSP的工程文件。

使用DBSP的上位机上传动作组,并完成机器人的零点标定。详情见文档 doc/附录B.其他教程/DBSP机器人动作编辑器使用指南

5.2.2 添加/修改动作组

注: 如果没有修改动作组的需求,可以跳过此部分。

使用DBSP的IDE添加/修改DBSP的动作组之后,需要同步修改配置文件,增加/修改对应的动作组类。

我们在PC端调用DBSP的动作组的时候,只关注两个属性:

  1. Marco ID 动作组的唯一标识

DBSP上位机上并不能直接看到Marco ID,需要你了解DBSP工程源文件的格式。详情请参阅doc/附录B.其他教程/DBSP的工程源文件解析

  1. Marco Interval 动作组的周期,单位是ms

DBSP上位机上也不能直接看到Marco的执行的总时间,有两种方式可以获取总时间:

一种是查看内部都包含哪些Action,以及延时指令,将其加在一起,得到一个总时间。

另外一个方式是,创建一个新的Marco名字叫做SUMMARY,将当前的Marco添加到这个新的Marco里面,在列表里面就可以看到总时间。

如果你想添加新的动作组的话,可以在src/dbsp_action_group.py 里面添加一个新的类,继承自ActionGroup,并填写marco相关的参数。

class ActionGroup(object):
    '''动作组'''
    name = 'NAME' # 运动的名称
    marco_id = 0 # 巨集的ID号
    marco_interval = 0 # 巨集的时间间隔

举例:

class StandUp(ActionGroup):
    # 站立
    name = 'STAND_UP'
    marco_id = 100000130
    marco_interval = 336

更规范一些,可以将参数定义在src/config.py里面统一管理。

src/config.py 代码片段

#############################
## DBSP动作组 Marco参数
##
#############################
# 站立的MarcoID
MARCO_STAND_UP_ID = 100000130
# 站立的执行周期(单位: ms)
MARCO_STAND_UP_INTERVAL = 336

修改后的StandUp

class StandUp(ActionGroup):
    # 站立
    name = 'STAND_UP'
    marco_id = MARCO_STAND_UP_ID
    marco_interval = MARCO_STAND_UP_INTERVAL

5.2.3 动作组管理器

注:此部分只是用于讲解如何使用动作组,无需配置,可跳过

动作队列的管理以及调用需要通过src/dbsp_action_group.py 里面的ActionGroupManager 动作组管理器。

使用方法如下:

导入依赖

import serial # PySerial串口通信
from dbsp_action_group import * # 导入动作组以及动作组管理器
from config import DBSP_PORT_NAME, DBSP_BAUDRATE # DBSP串口号以及波特率

创建串口对象

# 串口初始化
uart = serial.Serial(port=DBSP_PORT_NAME, \
    baudrate=DBSP_BAUDRATE, parity=serial.PARITY_NONE, \
    stopbits=1, bytesize=8, timeout=0)

创建动作管理器

am = ActionGroupManager(uart)

执行动作组(阻塞式)

# 动作初始化(站立)
am.execute(StandUp())

重复执行多次

am.execute(GoForward, n_repeat=5)

为了同时进行动作组管理以及图像处理等等其他的工作,工程实现上使用了多进程的实现方式。详情见src/main.py 里面的worker_dbsp_action_group 函数。

5.3 摄像头控制

5.3.1 摄像头脚本使用方法

脚本使用样例

python3 cv_camera.py --device /dev/video0

默认树莓派上接的USB摄像头的设备号就是/dev/video0,所以也可以不填写摄像头的设备号。

python3 cv_camera.py

选中窗口,按下Q键,退出图像预览程序。

查看cv_camera.py的帮助信息:

python3 cv_camera.py --help

输出日志

$ python3 cv_camera.py --help
摄像头 Camera
功能列表
1. 相机拍摄画面预览
1. 图像采集并保存在特定的路径
2. UVC相机参数的可视化调参

备注:
1. 不同摄像头型号的可设置的参数及取值范围各不相同.
   当前的参数设置仅对机型KS2A418适用

flags:

cv_camera.py:
  --device: 摄像头的设备号
    (default: '/dev/video0')
  --img_cnt: 图像计数的起始数值
    (default: '0')
    (an integer)
  --img_path: 图像的保存地址
    (default: 'data/image_raw')
  --[no]rm_distortion: 载入相机标定数据, 去除图像畸变
    (default: 'false')

Try --helpfull to get a list of all flags.

5.3.2 调整UVC摄像头的参数

如果你发现画面存在较大的色差,或者画面过暗/过亮等问题,这个时候可能需要对UVC摄像头的参数进行微调。

备注

  1. 如果画面正常,则请跳过次部分。
  2. 色差这个问题,有时候跟当前的光源也有关系,如果是暖光灯下,偏黄是正常的。调参时尽量排除光源的干扰。

执行如下脚本,通过滑动条实时的修改UVC摄像头参数,查看画面的变化。

python3 cv_camera.py

图像化界面里主要提供了四个关键的相机参数的可调节滑动条。

  • HUE 色调
  • SATURATION 饱和度
  • CONTRUST 对比度
  • SHARPNESS 锐度

拖动滑动条,查看效果。调完参数之后,选中窗口,按下Q键,退出程序。

UVC摄像头参数掉电不保存,重新上电恢复默认值。所以每次启用摄像头的时候,都需要从配置文件里面的摄像头参数,然后通过命令行的方式,设置UVC摄像头的具体参数。机器人上选配的UVC摄像头的型号是KS2A418,每款摄像头提供的可以配置的参数以及数值范围都是不同的。

相机的配置文件存放在src/config.py相机参数 部分。通过滑动条微调相机参数之后,将所修改的数值,同步更改到配置文件中。

src/config.py

#############################
## 相机参数
##
#############################
# 摄像头的设备号
CAM_PORT_NAME = '/dev/video0'
# 画面宽度
CAM_IMG_WIDTH = 680
# 画面高度
CAM_IMG_HEIGHT = 480
# 亮度
CAM_BRIGHNESS = 4
# 对比度
CAM_CONTRUST = 44
# 色调
CAM_HUE = 322
# 饱和度
CAM_SATURATION = 43
# 锐度
CAM_SHARPNESS = 45
# GAMMA
CAM_GAMMA = 150
# 开启自动白平衡
CAM_AWB = True
# 白平衡的温度
CAM_WHITE_BALANCE_TEMPRATURE = 4600
# 自动曝光
CAM_EXPOSURE_AUTO = True
# 相对曝光
CAM_EXPOSURE_ABSOLUTE = 78
# 相机帧率
CAM_FPS = 30

5.3.3 摄像头标定

摄像头标定的目的有两个

  1. 获得摄像头的内参矩阵

  2. 获得摄像头的畸变系数

第一步,打印棋盘格标定

PDF文件存放在src/data/相机标定板9x7.pdf ,将其打印在A4纸上,无边框打印。打印出来之后,每个黑色方块的宽度应该是20mm。打印出来之后,将其贴在一张硬纸板上。

第二步,清空历史图像

清空src/data/caliboard 文件夹下所有的图像。

第三步,标定板图像采集

回退到src目录下,执行脚本。

python3 cv_camera.py --img_path data/caliboard

--img_path 用于指定捕获图像的存储路径,这里设置存储路径为data/caliboard

选中当前的窗口image_win,手持标定板,放置在镜头前方,变换不同的姿态,同时也要保证棋盘的每个角点都在画面中出现。按下S键,即为采集一张图像,程序会自动给图像编号,并保存在src/data/caliboard下。参考图像采集张数为20张左右。

采集到的图像:

第四步,进行图像标定

运行脚本

python3 cv_camera_calibration.py 

运行日志

$ python3 cv_camera_calibration.py 
['data/caliboard/3.png', 
... 这里省略了一些png文件....
'data/caliboard/12.png']

相机内参 intrinsic
[[581.06526595   0.         357.93121291]
 [  0.         581.28993502 223.3983445 ]
 [  0.           0.           1.        ]]

畸变参数 distortion
[[-0.00094028 -0.11614309  0.00585255 -0.00532689  0.24779726]]

相机内参以及畸变系数会自动保存在src/config/camera_info.bin 里面。

5.3.4 摄像头安装位置相关机械参数

#############################
## 相机安装位置相关机械参数
## 
#############################
# 相机镜头中心相对地面安装的高度 (单位:cm)
CAM_H = 33
# 相机的俯仰角 (单位:度)
# 相机光心与水平面的夹角
CAM_PITCH = 60

5.3.5 更新透视逆变换映射矩阵

在得到相机的标定参数之后,需要在线计算一次透视逆变换的映射矩阵。

执行脚本

python3 update_ipm.py 

日志输出:

$python3 update_ipm.py 
计算IPM映射矩阵, 并存储在 config/ipm_remap.bin
更新完成

5.4 巡线例程

5.4.1 赛道规格

类目 明细
材质 广告纸
工艺 高清喷绘
背景色 白色
线色 黑色
线宽 4cm

可自行DIY赛道,注意弯度不要过大。

5.4.2 打开补光灯

在测试巡线例程之前,需要连接两个补光灯到LAMP接口。

手动打开LED补光灯的脚本,

python3 lamp.py

此时正常情况下LAMP会被打开,CTRL+C 中断程序, 补光灯自动关闭。

5.4.3 测试曲线识别效果

打开LAMP,

python3 lamp.py

新建另外一个Terminal,执行图像处理(曲线拟合)的脚本,查看图像处理的结果。

python3 cv_track_fit.py

cv_track_fit.py的帮助信息

$python3 cv_track_fit.py --help

--------------
| 赛道曲线拟合 |
--------------
颜色: 白底黑线
线宽: 4cm
材质: 广告布,高清喷绘

flags:

cv_track_fit.py:
  --device: 摄像头的设备号
    (default: '/dev/video0')
  --img_cnt: 图像计数的起始数值
    (default: '0')
    (an integer)
  --img_path: 图像的保存地址
    (default: 'data/image_raw')
  --[no]ipm_calc_online: 是否在线计算透视逆变换矩阵
    (default: 'false')
  --[no]rm_distortion: 载入相机标定数据, 去除图像畸变
    (default: 'false')

Try --helpfull to get a list of all flags.

5.4.4脚本使用说明

在测试巡线例程之前,需要连接两个补光灯到LAMP接口,进入src文件夹,执行主程序main.py

python3 main.py

在机器人站立之后,迅速将机器人放置与赛道起始位置。

程序一共有三个窗口:

  • img_preprocess 图像预处理窗口

从左到右依次为:

  1. 原图的缩放图

  2. 赛道的二值化图像(包括广告布白色背景+线)

  3. OSTU阈值分割的画面,白色区域为画面中黑线的连通域

  4. 黑线的二值化图像

    综合2跟3,二值化运算得到的结果

  5. img_raw 原始图像

​ 画面中的黄色圆圈为黑线的采样点

  • canvas_robo 机器人坐标系下的曲线

  • 灰点 通过透视逆变换(IPM)投影在机器人坐标系的采样点

  • 蓝线 曲线的二次曲线拟合

  • 红点 红点是复用的,根据距离机器人由近到远依次为
    • 二次曲线上距离机器人最近的点
    • 机器人下一步所要到达的目标点
    • (可选)曲线拐点,从一个二次曲线过渡到另外一个二次曲线的拐点

机器人开始巡线之后,若想中断机器人巡线,则需要选中程序中的任意一个窗口,按下按键Q。机器人会停止前进,执行站立动作,然后舵机卸力,补光灯关闭。

详细的调参指南见文档: doc/巡线算法详解与调参指南


Fashion Star Robot 关注华馨京微信公众号