说起人工智能机器人界的网红,那就不得不提到——“机器狗”。此前,著名机器人公司波士顿动力制造的“Spot”机器狗、国内知名科技企业蔚蓝科技自主设计研发的“阿尔法”机器狗、小米仿生四足机器人“CyberDog”都曾火爆全网。

机器狗的开发需要硬件、软件及运动行为三者达到协调,并不是一件容易的事,而在嘉立创EDA与传智教育联手举办的《仿生机器狗训练营》中,特等奖获得者刘潇翔脱颖而出,他从0-1打造了一个基于OpenAtom OpenHarmony(以下简称“OpenHarmony”)系统的机器狗,并将在本文中带来一些开发过程中的心得体会分享。

个人介绍

大家好,我是刘潇翔,现就读于南方科技大学(Southern University of Science and Technology)研一,修读的专业是智能制造与机器人。

开发项目简介

在这次训练营中,我从机械结构、电控硬件、控制算法、上位机等四个方面设计并制作了一款基于传智教育Hi3861 IoT WiFi模组主控,拥有十二自由度的桌面级四足机器狗—Puppy。

仿生四足狗—Puppy

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也是一样,期待刘同学能够在这两个领域同时不断深耕,并把它们灵活结合起来,创作出更多具有生活意义的作品,切实地影响改善人们的日常生活。

刘潇翔:基于OpenHarmony的仿生四足狗开发分享的更多相关文章

  1. 基于Vue SEO的四种方案

    基于Vue SEO的四种方案 https://segmentfault.com/a/1190000019623624?utm_source=tag-newest

  2. Keil MDK STM32系列(四) 基于抽象外设库HAL的STM32F401开发

    Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...

  3. 基于遗传算法的地图四色原理绘图上色的Python代码

      本文介绍利用Python语言,实现基于遗传算法(GA)的地图四色原理着色操作. 1 任务需求   首先,我们来明确一下本文所需实现的需求.   现有一个由多个小图斑组成的矢量图层,如下图所示.   ...

  4. 【毕业设计】基于Android的家校互动平台开发(内含完整代码和所有文档)——爱吖校推(你关注的,我们才推)

    ☆ 写在前面 之前答应大家的毕业答辩之后把所有文档贡献出来,现在答辩已过,LZ信守承诺,把所有文档开源到了GitHub(这个地址包含所有的代码和文档以及PPT,外层为简单的代码).还望喜欢的朋友们,不 ...

  5. 基于React Native的移动平台研发实践分享

    转载:http://blog.csdn.net/haozhenming/article/details/72772787 本文目录: 一.React Native 已经成为了移动前端技术的趋势 二.基 ...

  6. 20145221 《Java程序设计》实验报告四:Android开发基础

    20145221 <Java程序设计>实验报告四:Android开发基础 实验要求 基于Android Studio开发简单的Android应用并部署测试; 了解Android组件.布局管 ...

  7. 文献综述三:基于JSP的商品信息管理系统设计与开发

    一.基本信息 标题:基于JSP的商品信息管理系统设计与开发 时间:2015 出版源:Computer Knowledge and Technology 文件分类:jsp技术的系统开发 二.研究背景 通 ...

  8. SpringMVC内容略多 有用 熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器、过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验。

    熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器.过滤器等Web组件以及MVC架构 ...

  9. 基于screen.width的伪响应式开发

    一.站在用户的角度看问题 一个用户,访问一个web页面的真实场景是怎样的呢? 下面是某用户访问某站点的一个场景: 1. 小明打开了自己的电脑,访问了鑫空间-鑫生活: 2. 小明体内洪荒之力无法控制,疯 ...

  10. 基于事件驱动的DDD领域驱动设计框架分享(附源代码)

    原文:基于事件驱动的DDD领域驱动设计框架分享(附源代码) 补充:现在再回过头来看这篇文章,感觉当初自己偏激了,呵呵.不过没有以前的我,怎么会有现在的我和现在的enode框架呢?发现自己进步了真好! ...

随机推荐

  1. queryset高级用法:prefetch_related

    这个方法和select_related方法类型,就是访问多个表中的数据的时候,减少查询的次数.这个方法是为了解决一对多和多对多的关系的查询问题.比如要获取标题中带有hello字符串的文章以及它的所有标 ...

  2. Kotlin 协程二 —— 通道 Channel

    目录 一. Channel 基本使用 1.1 Channel 的概念 1.2 Channel 的简单使用 1.3 Channel 的迭代 1.4 close 关闭 Channel 1.5 Channe ...

  3. 【NLP学习其3.5】词嵌入的特性,为什么词之间会有联系?

    词嵌入的特性 现在你有了一堆嵌入向量,我们可以开始学习他们之间的特性了 前情提要:https://www.cnblogs.com/DAYceng/p/14962528.html 先把各向量重新命名便于 ...

  4. Vue3学习(二十)- 富文本插件wangeditor的使用

    写在前面 学习.写作.工作.生活,都跟心情有很大关系,甚至有时候我更喜欢一个人独处,戴上耳机coding的感觉. 明显现在的心情,比中午和上午好多了,心情超棒的,靠自己解决了两个问题: 新增的时候点击 ...

  5. Golang标准库之bytes介绍

    本次主要介绍golang中的标准库bytes,基本上参考了 字节 | bytes .Golang标准库--bytes 文章. bytes库主要包含 5 大部分,即: 常量 变量 函数 Buffer R ...

  6. 【Azure 应用服务】更便捷的方式抓取Azure App Service for Windows的网络包

    问题描述 在之前的一篇博文中,介绍了在App Service中抓取网络日志: 抓取Windows的网络包:[应用服务 App Service]App Service中抓取网络日志 抓取Linux的网络 ...

  7. RocketMQ(8) 消费幂等

    1 什么是消费幂等 当出现消费者对某条消息重复消费的情况时,重复消费的结果与消费一次的结果是相同的,并且多次消 费并未对业务系统产生任何负面影响,那么这个消费过程就是消费幂等的. 幂等:若某操作执行多 ...

  8. [学习笔记] Linux 环境下搭建基于Ngnix的反向代理服务

    ​之前为了方便同事测试微信小程序,搭建了基于CentOS的预发布环境,.Net5 程序也已经部署好在上面,在公网上可以通过http协议的临时域名(jevonsflash.xxx.net)访问到后台Ap ...

  9. 多线程系列(十八) -AQS原理浅析

    一.摘要 在之前的文章中,我们介绍了 ReentrantLock.ReadWriteLock.CountDownLatch.CyclicBarrier.Semaphore.ThreadPoolExec ...

  10. [VueJsDev] 快速入门 - vue项目根目录配置文件

    [VueJsDev] 目录列表 https://www.cnblogs.com/pengchenggang/p/17037320.html vue项目根目录配置文件 ::: details 目录 目录 ...