
为了和大家一起交流和进步,现在将小白机器人的软硬件所有资料全部开源。下面分硬件、结构、软件三个方面向大家汇报一下小白机器人的技术细节。
1.硬件总体设计
做硬件,首先要确定一下小白机器人的核心CPU,有近些年火热的ESP32和昂贵的Linux SOC两种选择,最终还是选择了能跑Linux的RK3566芯片,虽然价格昂贵、功耗高、发热重、体积大,但是在Linux系统下编程更加自由,功能更加容易扩展,有大量的开源项目可供使用,不必自己重新造轮子,例如下文中会提到的强大的ros系统。
确定了处理器之后,机器人上肯定少不了一块液晶屏,为的是和用户进行人机交互,显示个表情包啥的,提供必要的情绪价值。
要想让机器人能看见这个世界,必须需要安装一个摄像头;要机器人能听会说,麦克风和扬声器也是必须要的;要实现机器人能走路,最简单的方式就是安装两个差速轮,并且为了支持它到处跑,电池供电也是必不可少的。
另外为了机器人在室内环境中能够避障和导航,我还为小白机器人的顶部配备了单线激光雷达;为了实现机器人常见的离线命令词控制,内置了离线语音芯片;为了实现待机充电,在机器人内部做了电源切换和充电电路。
最后确定下来的硬件整体框架如下:
2.采购清单
硬件采购清单如下,仅供参考(以下不包括底盘PCB单面SMT用到的元器件,如果两面全手工焊接需要根据原理图另行购买元器件):
3.原理图和PCB
主板采用了现成的香橙派3B,而STM32控制板需要在嘉立创打样完成,主要是用于电源管理和移动底盘控制:
另外还有比较简单的电池盒转接板、USB线转接板、USB串口板:
4.硬件参数
1.外观设计
对于结构部分,小白机器人的外壳采用工业界常用的Solidworks软件进行绘制。
注意:3D打印采用光固化打印,没有尝试过普通的FDM打印机。
2.内部结构设计
小白机器人充分利用了壳体内的空间,在直径12厘米的圆柱体内,从下至上大致分成了电机、电池、主板、激光雷达四层空间,做到了体积小巧但功能丰富。
3.激光雷达的安装
目前支持YDLidar X2、M1C1_MINI、乐动LD14等多款雷达,YDLidar X2的雷达孔位,也适用于顶部有个小红点的乐动LD14,但是M1C1_MINI的孔位距离更长,具体细节可参考雷达手册。
小白机器人的接口线序和组装详细步骤也放到了项目主页,您可以从零开始一步步组装好机器人的每一个零件。
注意:根据激光雷达的类型不同,孔位位置不同,要选用不同的上壳结构:
1.软件整体框架
(1)ROS系统简介
ROS(机器人操作系统,Robot Operating System),是专为机器人软件开发所设计出来的一套电脑操作系统架构。小白机器人的软件在ROS框架下构建,需要掌握ROS基本的命令行工具、可视化工具、工程编译方法、ROS Launch文件、C++和Python语言等ROS开发基础。
推荐ROS入门课程:
ROS官方教程:
古月居GYH:?【古月居】古月·ROS入门21讲 | 一学就会的ROS机器人入门教程
机器人工匠阿杰:?机器人操作系统?ROS?快速入门教程
ROS包括了通信机制、开发工具、应用功能和生态系统四个部分:
ROS的通信机制主要有Topic、Service、Action三大方式,最常用的是Topic:
ROS常用的可视化工具有rviz、rqt、rqt_image_view、rqt_graph、rqt_plot等,ROS主要应用于移动机器人底盘(SLAM、NAV)、机械臂(MoveIt)和底盘与机械臂结合的复合机器人。
(2)本系统的主要软件功能
这是本项目的三大主要软件功能,包括了语音交互、图像识别、移动导航。
(3)本系统的ROS节点图
左侧是图像的采集处理流程,先读取USB相机原始的JPEG格式数据,然后解码和缩放,送入yolov6处理模块,处理得到检测框和绘制了检测框的图像,然后送入跟踪模块,得到绘制了跟踪结果的图像,最后送到JPEG编码节点,发布出去方便电脑或手机接收查看。
注意这里的解码、缩放以及最后的编码都是调用了RK3566的硬件编解码能力,而yolov6使用了RK3566 RKNN的AI加速能力。
右侧是其他处理流程,包括了底盘控制节点,雷达驱动节点,离线唤醒命令处理节点,纯python编写的语音处理节点audio,精确移动和旋转命令执行节点。下文会对核心的几个节点做简单介绍。
2.底盘控制节点
base_control节点的主要功能:和STM32串口通信,计算并发布里程计/odom和/tf,发布电池信息话题,发布离线语音命令ID;订阅速度话题转换为串口命令,订阅雷达使能话题转换为串口命令,订阅位置复位话题清零位置等。
(1)和STM32的通信协议
底盘控制节点(base_control)每20ms都会通过串口从STM32接收到机器人的一些底层状态信息,包括了当前20ms内的编码器的脉冲数,电池电压,充电状态,离线语音命令ID;底盘控制节点每20ms都会向STM32发送控制命令,包括了两个轮子的PWM占空比,是否打开雷达电源。具体的通信协议如下:
(2)差速机器人的运动学模型
小白机器人采用两个差速轮加上一个万向球的底盘架构,差速机器人的运动学模型如下:
代码实现:
(3)PID控制机器人速度
PID控制分为两种,位置式PID和增量式PID:
位置型PID:控制输出与整个历史误差有关,包括比例项、积分项(误差的累加值)和微分项。这种算法直接计算出控制量的绝对值。
增量型PID:控制输出仅与当前误差及前几次误差的差值有关,计算的是控制量的增量,即每次调整的量,而不是控制量的绝对值。因此,它没有积分累加的概念。
优缺点如下:
位置式PID:直接基于当前误差控制输出,更适合精确的位置或速度控制,但可能会遇到积分饱和问题。
增量式PID:基于误差变化量控制输出,通常实现更简单,适合在对误差变化快速响应的场合,能较好地避免积分饱和。
为了达到更高的速度控制精度,小白机器人采用位置式PID控制电机速度。
PID参数调节参考链接:
电机控制进阶——PID速度控制:
在ROS系统下可以使用工具来调节和可视化PID控制效果:
位置式PID控制器的代码如下:
3.语音交互节点
语音交互节点主要包括了语音识别、大模型处理和语音合成。因为目前大多数语音识别API都需要付费,因此使用Kaldi本地语音识别。大模型使用了不限次数免费的科大讯飞大模型API。语音合成可以使用免费的edge_tts、有道TTS、Kaldi本地TTS等。
(1)语音识别
因为目前大多数语音识别API都需要付费,因此使用sherpa_onnx库实现的本地语音识别,使用cpu推理模型:
kaldi语音识别的代码如下:
(2)大模型处理
使用了无限次免费的科大讯飞大模型API:
(3)语音合成
目前使用免费的edge_tts(前一段时间挂了,升级到最新又能用了),或者国内的有道tts:
4.目标检测节点
目标检测节点采用了RK3566的NPU加速处理,推荐官方的模型仓库rknn_mode_zoo,官方已经支持了各类视觉和自然语言任务。本项目选用了速度较快的yolov6检测模型,模型部署的大致流程是先将pytorch转onnx,再将onnx转rknn,最后在开发板上读取rknn模型进行推理。
瑞芯微RK3566或RK3588支持NPU深度学习推理加速,官方提供的模型库链接:
目前模型库中已经支持了图像分类、目标检测、语义分割、实例分割、人脸关键点、车牌识别、文本识别OCR、机器翻译、图像文本匹配、语音识别、语音分类、文本转语音等各类深度学习任务。
下面介绍目标检测算法yolov6的模型部署过程,模型部署的大致流程是:
电脑python训练 --> .pt --> .onnx --> .rknn --> 开发板c++推理
(1)训练代码修改
先从官方github下载代码:
原始代码:
修改后,输出层改为3个,方便部署代码的后处理:
原始代码:
修改后:
原始代码:
修改后:
代码修改完成后进行模型导出:
参考链接:
将img的高度设置为,宽度设置为,导出最小模型:
模型可视化,使用Netron工具打开模型:
可以看到模型输入图像尺寸为1x3x352x640:
模型其中一个分支输出尺寸为:
(2)模型转换
模型转换之前需要在电脑安装,大致转换代码如下:
转换后得到文件,使用python接口推理可以得到绘制了检测结果的图片:
也可以用Netron工具可视化查看:
输出层:
(3)模型部署代码
模型部署代码运行在开发板上,使用C++代码实现推理,主要修改后处理代码:
5.SLAM和导航节点
最后是slam和导航节点,slam和导航基本都是用ROS自带的功能包,只需要根据自己机器人情况修改配置文件,例如调整机器人的尺寸配置,修改机器人的最大速度限制等。
(1)启动功能包
在小白机器人上启动SLAM和导航的命令如下:
电脑上可视化建图和导航效果:
(2)修改配置文件
以下改动量比较大的两个配置文件,首先要调整机器人的尺寸配置,还需要修改机器人的速度限制:
配置文件:
配置文件:
B站视频链接
【开源】如何手工打造一台理想中的机器人?:
电饭锅们出来军训了? ??? ?: