你是否准备好了,
动手实践,
那就按照我们的步骤一起来体验吧~
一、技术方案介绍
BCK (本项目名称)技术链路较长,由于是针对教育市场开发的套件,所以做了很多 SDK 的封装,其目的是在于更加便利的二次开发和更加有趣的体验,激发创意,简单开发是我们核心的理念。
BCK 技术上充分采用了软硬结合,具体围绕硬件,控制,算法,云端,前端五个方向打造套件一体化,各方向职责明确,相互串联,共同作用。
由于本版本开发套件是为了 Hackathon 2019 短时间打造,技术方案倾向在 MVP 产品完成,但「三万块团队」在设计上预留了足够的想象空间,技术方案提升空间仍有很多。未来希望更加符合我们的愿景,让编程没有年龄边界。

下面依次介绍各方向的技术方案
1.1 硬件
底层小车平台采用一个麦克纳姆轮小车实现,其控制板搭载意法半导体 STM32F1xx 系列MCU。
AI 开发板主要由叠放的三张 PCB 板和摄像头模块组成,三张 PCB 版从上到下依次为搭载地平线 Sunrise™ 2 人工智能芯片的运算板、一个接口转接板和 96Boards 搭载高通 410c 的主板组成。

1.2 控制
麦轮小车的运动控制采用带编码器的电机做闭环控制,控制逻辑在小车控制板上的 STM32 MCU 上运行。
AI 开发板 通过 USB-to-MicroUSB 连接线连接小车控制核心板,核心板上使用 CH341芯片用于USB转串口信号向 STM32 发送控制信号。96Boards 侧 CH341 芯片被挂载为一个 USB 串口设备,软件层提供了简单的 python 库用于直接调用下发控制指令。
1.3 算法
BCK在芯片上预置了一套人体检测和骨骼分析的感知计算流程,可以直接取出计算结果用于应用分析。同时,BCK提供了一套动作识别的Python框架,提供例如“左手举起”、“右手伸展”、“有人/无人在视野内”等示例动作,同时支持用户自定义新的动作作为扩充。
1.4 云端
使用golang的gin框架搭建了一套后台转发服务。前端将更新的命令post到云端服务,小车又到云端轮询get新的指令。由此解决了无线小车连接WIFI没有固定IP的问题。
1.5 前端
可视化编程页面基于 React + TypeScript 开发,组件库使用 antd, 使用 rematch 进行数据管理,UI 视图分为可视化操作区和逻辑代码显示区。

二、开发教程
本次项目代码均已上传到github,软件库列表:
2.1 X2 SDK 部署
2.1.1 开发板环境设置
AI 开发板主要由叠放的三张PCB板和摄像头模块组成,三张PCB版从上到下依次为搭载地平线X2人工智能芯片的运算板(以下简称X2板)、一个接口转接板 和 96Boards搭载高通410c的主板(以下简称410c版)组成。此外,运行Demo还需要准备一台Windows PC用于展示Demo的显示端。
a. 连线:
将410c板上连接上电源线、usb转网口转接器(连接网线)、usb hub(连接键盘鼠标)、HDMI视频输出;并连号通过转接口转接的网线和键盘鼠标。
将X2板连接上网线,并将Micro USB转USB线连接上白色3pin接口旁的Micro USB接口用于串口调试。
为保证正常ssh连接,可使用固定IP地址。
● 配置410c板IP地址:
通过HDMI接入显示器,通过usb hub连接键盘鼠标,410c上电之后进入板子的图形界面,右键点击右下角网络连接图标,点击“Edit Connections...”打开配置界面

在配置界面选中Ethernet中的wired connection 1,点击下方齿轮图标(如有多个wired connection,则在齿轮图标弹出的窗口中选择Ethernet页,确认配置的网卡名为enx[XXX],其中[XXX]为mac值)。

在界面中选中IPv4 Settings,将IP地址和相关参数配置为需要的参数。

重新插拔网线,410c设备IP将变为新配置IP地址。此后即可通过ssh连入410c板,用户名密码均为linaro。
● 配置X2板IP地址:
X2板需要通过串口连接接入配置IP地址:
首先在 https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers 下载串口芯片驱动安装。
以 Mac OSX为例,安装minicom串口调试工具,参考https://blog.csdn.net/u010285246/article/details/72354038 配置minicom,串口连入410c(串口接入密码为root)。
接入后,使用vi在/etc/init.d目录下建立名为ipinit.sh的启动脚本,内容如下(请将10.31.32.111、10.31.32.1替换为需要的IP地址和网关地址)
ipinit.sh:
之后,修改文件权限为775,在/etc/init.d目录下执行以下命令,将脚本加入自启动即可。
执行./ipinit.sh,x2板设备IP将变为新配置IP地址,此后即可通过ssh连入x2板,用户名为root。
2.1.2 部署Demo
a. 嵌入式环境确认:
首先确保ap与cp的内核版本的一致性,目前用的ap与cp的内核版本如下图:


b. X2板部署:
1. 参考http://wiki.hobot.cc/pages/viewpage.action?pageId=74423879中2.3.2步骤,将 xppcp_smart_96board.tgz安装包,拷贝到x2板CP端/home/root下,解压后cd xppcp_smart进入目录,运行文件根路径下的安装脚本 ./xpp_start.sh启动cp侧程序,ps查看进程中有./xpp_cp_smart -i configs/smart_config.json在运行。
2. 复制Billionaire SDK (http://gitlab.hobot.cc/ptd/experimental/alg/eevee/awesome/bilionaire) init文件夹中initx2.sh脚本到CP侧的/etc/init.d文件夹中。
3. 在CP侧的/etc/init.d文件夹中执行chmod +x initx2.sh为脚本添加可执行权限。
4. 在/etc/init.d文件夹中执行如下命令添加开机启动项:
c. 410c板部署:
1. 参考http://wiki.hobot.cc/pages/viewpage.action?pageId=74423879 中2.3.1节内容,安装AP端基础环境到 96Boards 410c板上
2. 复制Billionaire SDK (http://gitlab.hobot.cc/ptd/experimental/alg/eevee/awesome/bilionaire) init文件夹中initap.sh脚本到AP侧的/etc/init.d文件夹中。
3. 在AP侧的/etc/init.d文件夹中执行chmod +x initap.sh为脚本添加可执行权限。
4. 在/etc/init.d下执行以下命令,添加开机启动项。
2.2 AP 侧部署
AP侧程序为端上系统的核心控制模块,负责执行:
1. 通过调用X2 SDK,循环读取CP的计算结果并进行解析。
2. 通过轮询云端接口,获取前端下发的配置。
3. 进行人体动作识别。
4. 根据前端配置,将人体动作识别的结果映射为小车需要执行的动作。
5. 调用小车控制的SDK接口,向小车发送动作指令。
部署流程:
1. git clone AP程序,cd ap_process/
2. sudo python ws_server.py
2.3 云端部署
云端基于 golang 编写,负责:
1. 提供前端配置接收接口,并存储该配置在内存中。
2. 提供 AP 轮询获取命令接口,如内存中有前端更新命令则返回新命令。
部署流程:
1. git clone 云端程序,cd cloud_server/
2. go mod vendor
3. go run main.go
4.4 前端部署
前端开发环境采用 webpack 进行构建,建议使用 node 12+ 以上版本环境,安装好 node 后会有 npm 包管理工具。
项目 clone 到本地后安装开发所需依赖,一般步骤为:
- npm i (依赖不更新只用执行一次)
- npm start
执行以上操作,浏览器会自动打开对应网页,开发建议使用 chrome。
打包生产版本执行 npm run build,然后会在项目中生成 dist 文件,部署到指定文件,一般使用 nginx 进行代理。
4.5 AP侧代码详解
AP 侧的代码入口为ws_server.py,其中,首先对所调用的X2 SDK与bilioncar SDK进行初始化,然后在smart_process线程中轮询X2智能信息并进行解析、交互控制。另一方面在主线程启动websocket server,用于请求前端下发的配置。
h2v 模块(human-to-vehicle)为对动作进行识别并与小车进行交互的入口。
大家对于代码和开发过程有任何问题,欢迎留言 ❤️。
