刘潇翔:基于OpenHarmony的仿生四足狗开发分享
说起人工智能机器人界的网红,那就不得不提到——“机器狗”。此前,著名机器人公司波士顿动力制造的“Spot”机器狗、国内知名科技企业蔚蓝科技自主设计研发的“阿尔法”机器狗、小米仿生四足机器人“CyberDog”都曾火爆全网。
机器狗的开发需要硬件、软件及运动行为三者达到协调,并不是一件容易的事,而在嘉立创EDA与传智教育联手举办的《仿生机器狗训练营》中,特等奖获得者刘潇翔脱颖而出,他从0-1打造了一个基于OpenAtom OpenHarmony(以下简称“OpenHarmony”)系统的机器狗,并将在本文中带来一些开发过程中的心得体会分享。
个人介绍
大家好,我是刘潇翔,现就读于南方科技大学(Southern University of Science and Technology)研一,修读的专业是智能制造与机器人。
开发项目简介
在这次训练营中,我从机械结构、电控硬件、控制算法、上位机等四个方面设计并制作了一款基于传智教育Hi3861 IoT WiFi模组主控,拥有十二自由度的桌面级四足机器狗—Puppy。
仿生四足狗—Puppy
已经合仓的代码链接
https://gitee.com/openharmony-sig/contest/tree/master/2022_itcast_LCEDA_OpenHarmony_camp/Harmony%20Puppy
OpenHarmony学习过程
我第一次接触到嵌入式开发,还是在立创EDA&传智教育联合举办的物联网实战——智能开关训练营中。在此之前我对OpenHarmony系统了解不是很多,以为仅是运行在移动端与PC端的系统,但我还是对其充满好奇,毕竟这是为了打破技术封锁自主研发的系统。所以我也想了解OpenHarmony嵌入式开发,与常见的单片机STM32、ESP32、ATmega328P这些MCU的开发有什么区别。
传智教育旗下的Hi3861 IoT WiFi模组主芯片为海思Hi3861V100,拥有完整的WiFi功能,支持采用Micropython或C语言开发。由于OpenHarmony的生态相比其他一些主流单片机,还比较单薄,所以辅助开发的相关资料搜集起来相对费力些。我总结了一下个人的学习流程,大致如下:
学习流程:
(1)搜寻并下载不熟悉芯片的硬件数据手册;
(2)参考在Gitee上开源的有关嵌入式的项目代码及文档;
(3)参考OpenHarmony开发者社区交流帖;
(4)通过各种搜索引擎(百度、搜狗、Microsoft Bing等)查找相关文章;
(5)去Bilibili搜索相关内容,碰碰运气;
(6)QQ群,碰碰运气;
(7)以上如果均未得到有效解决方案,根据已有资料,自己研究解决。
接触OpenHarmony最大的惊喜和具体的收获
要数接触OpenHarmony最大的惊喜,我认为应该是在官方提供的如何采用C语言开发的教学中提供了一种通过SSH实现在WIN10系统内编辑,在虚拟机Ubuntu系统里编译的方法,这个方法对我提供了不小的帮助。
其他惊喜与收获:
(1)传智教育Hi3861 IoT WiFi物联网模组的封装十分精致小巧,该Hi3861模组支持FreeRTOS系统,且支持用Micropython、C语言开发;
(2)初步了解OpenHarmony嵌入式开发的基本流程,并实现了个人需求的相应效果。
对于OpenHarmony系统的建议
(1)用来烧录程序的Hiburn软件无法保存偏好设置,UI设计及操作界面也有些不够清晰。比如,每次打开都要手动把烧录程序波特率115200调到921600;
(2)用来开发传智教育Hi3861物联网模组的一些基本工具库需要完善。比如,IIC通信、SPI通信、OLED屏幕、TFT屏幕、MPU6050传感器等常用模块的驱动;
(3)传智教育Hi3861模组在Linux环境下编译调试时,不方便找到报错信息。
项目技术过程分享
(1)机械结构部分采用SolidWorks 2020设计,通过FDM式3D打印制造。其主要设计内容包括躯体与单腿。单腿机构采用平面四连杆构成并联腿,拥有3自由度,设计思路是尽量减轻腿部重量,并且使三个电机安装的位置紧凑集中。躯体采用模块分立结构设计,方便维护更换及升级;
(2)电控硬件部分采用立创EDA专业版设计。关于12路舵机驱动主要由PCA9685PW管理,Hi3861物联网模组主控,供电部分采用了一个DC-DC BUCK型降路压电路,支持最大电流6A,保证电机及控制电路供电充足;
(3)软件部分采用Clion作为编辑器,linux环境下编译。在实现主单腿正逆解、足端摆线轨迹规划的基础上,实现了四足机器狗的Trot小跑步态运动,姿态逆解控制等;
(4)机器人的远程控制App基于Android开发,与四足机器狗之间采用了UDP协议实现无线通信。
项目过程中遇到的困难&解决办法
困难:
Hi3861模组焊接完成后,按EN复位,串口输出为乱码。
检测结果:
(1)拆除WS2812B灯珠后,串口即能输出正常信息;
(2)拔下MPU6050模块后,串口即能输出正常信息。
解决方案:
(1)拆去连接IO2引脚的WS2812B灯珠;
(2)拔下连接IO7、IO8引脚的MPU6050模块。
疑似原因:
Hi3861模组烧录时,特定引脚不能外接设备。
当我一开始发现输出乱码,惯性上会首先思考MCU的焊接是否良好、串口通讯的电路是否正常、芯片供电是否正常、EN按键是否正常等问题。后来能顺利解决问题也是在检查上面所有问题后歪打正着,意外拆掉那颗WS2812灯珠后才发现复位正常了。
项目开发过程最重要或最值得分享的心得
(1)开发过程中卡壳,先检查硬件问题,再检查软件问题。
硬件问题一般比软件问题更麻烦一些,毕竟可能遇到需要重买材料、重新制板等时间成本较大的修补措施。
硬件问题检查:一般采用控制变量法把所有的嫌疑因素逐个排除。比如,先考虑各器件的焊接是否正常(可采用万用表蜂鸣档检测)。如果有MCU的电路先检查MCU及其外围电路,是否能够烧录程序。之后可通过写各种Demo小程序来快速测试其他硬件资源是否正常。
检查MCU及其外围电路是否正常,可以先观察焊接上是否有虚焊,连锡等情况。如果均无问题可接着测供电电压是否正常。同时需注意,用电端烧毁一般是电压问题,供电端烧毁一般是电流过大。
软件问题调试:如果有报错信息,就去阅读报错信息来调试代码。如果是语法错误就比较容易解决。如果遇到比如LED驱动不亮,先检查封装或LED焊反没,检查原理图上LED是引脚电平拉高还是拉低点亮。如果遇到采用IIC通讯的OLED屏幕无法点亮,先写简单的程序从大到小逐步测通,比如先使屏幕点亮,再试着点亮一个点,再点亮一条线,画出一个方块,写下一个字符。各种功能齐全后再组合调试出自己想要的效果。
而且单片机开发调试时不应该光敲代码,中间需要穿插烧录到单片机看是否能够实现效果。问题多的话尽量分阶段解决,而不是汇总到最后一起解决,不然很可能会出现找不到哪里出错的。
(2)优质的问题获得优质的回答。
提问者要多思考,如何阐述清楚自己的问题,考虑是否方便回答者能简洁地回答自己的问题,比如对方只用回答是还是不是。
比如自己的代码编译报错,如果问为什么自己的代码跑不起来,为什么自己的LED灯不亮了,这无疑很难获得自己想要的答案。因为开发的时候碰到的Bug会有千万种,但是正确的跑通道路却只有一条。如果代码报错,自己首先要去检查所报错的代码段,细化大概在哪一行出现了问题,个人先去通过搜索、调试等手段尝试能否解决。
虽然有时太具体的问题也不太好回答,比如有人问自己想用Hi3861模组开发一款能够监测室内温湿度并实现浇水的智能浇花器。这类问题涉及的内容就比较多,也不好获得自己想要的回答。调整一下的话,比如可以在问题最后加上,哪款温湿度传感器比较推荐,浇水用哪款电机比较合适等之类细化一些的问题。
(3)做项目,要一边开发一边学习。
想做一个项目,不像之前我们所接触的教育那样,先把一个领域全方面熟悉摸透后再去做。毕竟想摸清某个领域都是很不容易的。要明确知道自己的需求,自己想要实现什么,大概可以怎么样去实现,然后再去学习。需要用什么去学什么,需要用多少就学多少,除非自己对某方面非常感兴趣。这样才有可能快速地去完成自己的需求和实现想法。
做项目也是多做才可以更熟练,入门的话可以先跟着资料齐全,文档清晰的优秀开源作品复刻。做了几个后,随后就会慢慢摸索出自己如果想要实现新项目的开展思路。
接下来的开发计划
(1)完善曾经的项目
由于我对自己之前的一些作品感觉还有很多不满意、可以完善的地方,因此我计划去优化完善曾经一些老项目,包括结构设计、硬件设计、软件设计、项目文档等;
(2)开发一款电机调试器
毕竟我以后的工作很大概率会和机器人相关,预想的功能包括串口调试、CAN调试、舵机调试、总线舵机调试、直流电机调试、功率测量、屏幕显示、PC端上位机交互等。
机器人的发展前景是一片广阔无垠的星辰大海,OpenHarmony也是一样,期待刘同学能够在这两个领域同时不断深耕,并把它们灵活结合起来,创作出更多具有生活意义的作品,切实地影响改善人们的日常生活。