说起人工智能机器人界的网红,那就不得不提到——“机器狗”。此前,著名机器人公司波士顿动力制造的“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. 【ACM专项练习#02】输入整行字符串、输入值到vector、取输入整数的每一位

    输入整行字符串 平均绩点 题目描述 每门课的成绩分为A.B.C.D.F五个等级,为了计算平均绩点,规定A.B.C.D.F分别代表4分.3分.2分.1分.0分. 输入 有多组测试样例.每组输入数据占一行 ...

  2. 【LeetCode剑指offer#06】实现pow函数、计算x的平方根

    实现pow函数 实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,xn ). 示例 1: 输入:x = 2.00000, n = 10 输出:1024.00000 示例 2: 输入:x ...

  3. 第130篇:BOM(window对象)

    好家伙,本篇为<JS高级程序设计>第十二章"BOM"学习笔记   什么是BOM? BOM(Browser Object Model) 是指浏览器对象模型,是用于描述这种 ...

  4. 【Azure Logic App】在Logic App中使用 Transfer XML组件遇见错误 undefined

    问题描述 在Azure Logic App中,使用Transform XML组件进行XML内容的转换,但是最近这个组件运行始终失败. 问题解答 点击Transform XML组件上的错误案例,并不能查 ...

  5. 【Azure 应用程序见解】在Docker中运行的ASP.NET Core应用如何开启Application Insights的Profiler Trace呢? 

    问题描述 使用Azure Application Insights收集AKS中ASP.NET Core应用的监控数据,自动收集请求的Trace情况,用于分析单个请求在应用内部的耗时及处理事件情况,参考 ...

  6. 【小程序分包】小程序包大于2M,来这教你分包啊

    前言 缘由 该大的不大,小程序包超出2M,无法上传发布 前段时间项目迭代时,因版本大升级,导致uniapp打包后小程序后,包体积大于2M.虽然将图片等静态资源压缩,体积大的资源放置cdn,在不懈的努力 ...

  7. 标准差为什么除以n-1

    参考:https://blog.csdn.net/qian2213762498/article/details/80558018 如果要测量中国人的平均身高,假设为μ,通常会随机取假设10000人,求 ...

  8. Java static 关键字的使用 小练习

    1 package com.bytezreo.statictest2; 2 3 /** 4 * 5 * @Description static 关键字的使用 小练习 6 * @author Bytez ...

  9. Java 子类对象实例化的全过程

    2 /* 3 * 子类对象实例化的全过程 4 * 5 *1.结果上来看:(继承性) 6 * 子类继承父类以后,就获取了父类中声明的属性或方法 7 * 创建子类的对象,在堆空间中,就会加载所有父类声明的 ...

  10. Codeforces Round 170 (Div. 1)A. Learning Languages并查集

    如果两个人会的语言中有共同语言那么他们之间就可以交流,并且如果a和b可以交流,b和c可以交流,那么a和c也可以交流,具有传递性,就容易联想到并查集,我们将人和语言看成元素,一个人会几种语言的话,就将这 ...