MIT Cheetah-Software开源项目流程分析

这篇具有很好参考价值的文章主要介绍了MIT Cheetah-Software开源项目流程分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

摘要:MIT Cheetah-Software是四足机器人的开源项目,理清程序流程是进一步理解和研究项目的必要条件。Cheetah-Software开源项目包含robot、common、sim和user等四个部分的源码,本文以user/MIT_Controller下的子项目来介绍Cheetah-Software的程序流程。

一、主函数

        主函数定义在main.cpp文件中,源码如下:

int main(int argc, char** argv) 
{
     main_helper(argc, argv, new MIT_Controller());
     return 0;
}

       在主函数中,先使用new生成一个MIT_Controller对象,然后调用main_helper函数,最后返回0,流程如图1所示。

MIT Cheetah-Software开源项目流程分析

 图1 主函数流程图

       注:MIT_Controller在user/MIT_Controller/MIT_Controller.hpp文件中。

二、main_helper函数

       main_helper函数定义在robot/src/main_helper.cpp,流程图见图2。

MIT Cheetah-Software开源项目流程分析

图2 main_helper函数流程图 

       上面流程图中,大部分流程用于命令参数判断,在流程图后面三个分支中的对象是我们研究的重点,即MiniCheetahHardwareBridge、CheetahHardwareBridge和SimulationBridge三个类的对象声明hw和hw.run()。

MiniCheetahHardwareBridge和CheetahHardwareBridge是HardwareBridge的子类,是两种不同类型的四足机器人对象,而SimulationBridge类是仿真模拟类,用来仿真四足机器人对象,下面分别以MiniCheetahHardwareBridge和Cheetah3HardwareBridge为例来介绍四足机器人的运行流程。

三、HardwareBridge::run()

HardwareBridge类是一个抽象类,定义了run()的接口函数,其子类在run()中实现机器人运行代码。

(一)MiniCheetahHardwareBridge::run()

MiniCheetahHardwareBridge::run()的流程图如图3所示。

MIT Cheetah-Software开源项目流程分析

图3 MiniCheetahHardwareBridge::run函数流程图

1、初始化通信模块,调用基类HardwareBridge::initCommon()函数,通过LCM通信模块订阅interface和interface_request两个主题;

2、初始化MiniCheetah机器人的spi通信和惯性导航模块(IMU);

3、初始化机器人参数和用户控制参数列表;

4、创建和配置RobotRunner对象(实际上是一个任务对象);

5、启动状态任务;

6、启动spi通信任务,spi通信负责传输控制命令和接收传感器数据;

7、启动惯性导航线程;

8、执行RobotRunner的任务;

9、启动可视化数据LCM通信任务;

10、启动遥控器指令接收任务;

11、启动惯性导航日志任务;

12、每隔1秒循环。

(二)Cheetah3HardwareBridge::run()

Cheetah3HardwareBridge::run()的流程图如图4所示。

MIT Cheetah-Software开源项目流程分析

图4 Cheetah3HardwareBridge::run函数流程图 

1、初始化通信模块,调用基类HardwareBridge::initCommon()函数;

2、初始化Cheetah3的硬件系统;

3、初始化机器人参数和用户控制参数列表;

4、创建和配置RobotRunner对象;

5、初始化RobotRunner对象;

6、启动状态任务;

7、启动工业以太网(基于ethercat协议);

8、执行RobotRunner任务;

9、启动可视化数据LCM通信任务;

10、每隔1秒,打印状态。

四、RobotRunner任务的初始化与执行

在Cheetah3HardwareBridge::run()的流程中调用了RobotRunner::init()和RobotRunner::start(),下面分析两个函数的流程和功能。

(一)RobotRunner::init()

RobotRunner::init()的流程如图5所示。

MIT Cheetah-Software开源项目流程分析

图5 RotbotRunner::init函数流程图

1、根据机器人类型创建四足机器人模型(_quadruped)和生成基础移动模型;

2、创建机器人关节位姿初始化对象;

3、创建腿控制器对象;

4、创建状态预测容器并初始化;

5、创建期望状态命令对象;

6、将生成的对象赋值给机器人控制对象;

7、初始化机器人控制对象。

(二)RobotRunner::start()

RobotRunner的基类是PeriodicTask,PeriodicTask是一个线程任务类,所以RobotRunner::start()实际调用的是PeriodicTask::start()。RobotRunner::start()的流程如图6所示。

MIT Cheetah-Software开源项目流程分析

图6 启动RobotRunner任务流程图

1、调用PeriodicTask::start();

2、PeriodicTask::start()启动线程,线程的主体函数是PeriodicTask::loopFunction();

3、在PeriodicTask::loopFunction()中循环执行PeriodicTask::run()函数,而PeriodicTask::run()是一个纯虚函数,实际调用的是RobotRunner::run()函数。

五、RobotRunner::run()

RobotRunner::run()是机器人系统每个执行周期的运行内容,其流程如图7所示。

 MIT Cheetah-Software开源项目流程分析

图7 RobotRunner::run函数流程图

1、运行状态预测;

2、可视化数据清零;

3、将机器人数据更新到LegController对象;

4、设置LegController对象使能;

5、当遥控器控制时的rc_control.mode为0时,将LegController对象的控制命令数据清零,否则执行6;

6、如果关节位置初始对象没有初始化时,将LegController对象的各个关节的kp和kd赋值,否则执行7;

7、执行机器人控制对象(实际是MIT_Controller对象)的runController()和updateVisualization()函数。

(一)RobotRunner::setupStep()

RobotRunner::setupStep()的功能是将机器人的各关节数据更新到LegController对象,流程见图8所示。

 MIT Cheetah-Software开源项目流程分析

图8 RobotRunner::setupStep函数流程图

(二)MIT_Controller::runController()

MIT_Controller::runController()的功能是根据机器人当前位姿、期望位姿、遥控器指令、步态等多种数据计算各关节的控制命令,流程见图9所示。

MIT Cheetah-Software开源项目流程分析

图9 MIT_Controller::runController函数流程图

(三)RobotRunner::finalizeStep()

RobotRunner::finalizeStep()的功能是将生成的控制命令数据更新到机器人各控制系统,流程见图10所示。

MIT Cheetah-Software开源项目流程分析

图10 RobotRunner::finalizeStep函数流程图

六、小结

本文从/user/MIT_Controller/main.cpp的main()函数出发,通过逐次递进的方法分析了MIT开源项目Cheetah-Software机器人系统运行的主要流程,这只是源码分析的开始,希望和四足机器人爱好者们共同进步!

 文章来源地址https://www.toymoban.com/news/detail-434195.html

 

 

到了这里,关于MIT Cheetah-Software开源项目流程分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • WebStackHugo导航开源项目部署流程和内容一键配置

    本项目是基于纯静态的网址导航网站 webstack.cc 制作的Hogo主题,基于开源项目的基础这里总结了一下在 centos7 云服务器部署和本地一键配置数据更新静态页面的笔记。 不得不说,Hugo 比 Django 利用开源的项目基础二次开发和数据整理要方便快捷很多。 先来看一下 我的主页吧。

    2024年02月05日
    浏览(29)
  • 开源许可证概述:GNU, BSD, Apache, MPL, 和 MIT

    开源许可证是开源软件分发的基础。它们定义了使用者如何使用,修改,分发开源软件。在这篇文章中,我们将探讨五种常见的开源许可证:GNU通用公共许可证 (GNU GPL),BSD许可证,Apache许可证,Mozilla公共许可证 (MPL) 和麻省理工学院许可证 (MIT)。我们将给出每种许可证的一些

    2024年02月09日
    浏览(40)
  • GUN、MIT、Apache、BSD、MPL各种开源协议介绍和区别

    目前,以下是目前一些主流的开源协议: GPL是最常见和最具影响力的开源协议之一。它有多个版本,包括GPLv2和GPLv3。GPL要求任何基于或修改自GPL许可的软件的派生作品也必须以相同的协议分发。 MIT许可证是一种非常宽松的开源协议。它允许自由地使用、修改和分发软件,无

    2024年02月07日
    浏览(42)
  • 开源世界许可证Copyleft GPL LGPL MIT BSD Apache

    Copyleft 利用版权法来提供分发作品的副本和修改版本的权利,并要求在作品的修改版本中保留同样的权利。换句话说,copyleft是让创造性的作品可以自由修改,并要求作品的所有修改和扩展版本也是自由的一般方法。 GPL是首个通用的copyleft许可证。 GNU通用公共许可证 ( GNU

    2024年01月17日
    浏览(41)
  • 开源许可协议:GPL、LGPL、AGPL、MPL和BSD、MIT、Apache

    一、开源许可证的分类 开源许可证分为2种类型:宽松型和著作权型。 1、宽松型(Permissive):该类许可证往往只要求被许可方保留原作品的版权信息,对用户施加的限制较少,衍生软件可以成为私有软件,如Apache、MIT、BSD系列许可证。由于这类许可证允许衍生软件闭源,对商业

    2024年02月02日
    浏览(43)
  • 几种开源协议的区别(Apache、MIT、BSD、MPL、GPL、LGPL)

     作为一名软件开发人员,你一定也是经常接触到开源软件,但你真的就了解这些开源软件使用的开源许可协议吗?         你不会真的认为,开源就是完全免费吧? 那么让我们通过本文来寻找答案。         开源许可协议是指开源社区为了维护作者和贡献者的合法权利

    2024年02月07日
    浏览(32)
  • mit 6.824 lab1分析

    略 map阶段每个worker应该把中间文件分成nReduce份,nReduce是reduce任务的数量 worker完成reduce任务后生成文件名 mr-out-X mr-out-X 文件每行应该是 \\\"%v %v\\\" 格式,参考 main/mrsequential.go worker处理完map任务,应该把生成的中间文件放到当前目录中,便于worker执行reduce任务时读取中间文件 当所

    2023年04月10日
    浏览(39)
  • 开源项目-数据可视化分析平台

    哈喽,大家好,今天给大家带来一个开源项目-数据可视化分析平台。项目通过SpringBoot实现 数据可视化分析平台主要有数据源管理,项目管理,数据集管理,图表管理,看板管理等功能 数据源管理功能可以添加MySQL,Oracle,PostgreSQL等类型的数据源信息 项目管理可以对项目名

    2024年02月10日
    浏览(44)
  • SpringBoot配置外部Tomcat项目启动流程源码分析

    SpringBoot应用默认以Jar包方式并且使用内置Servlet容器(默认Tomcat),该种方式虽然简单但是默认不支持JSP并且优化容器比较复杂。故而我们可以使用习惯的外置Tomcat方式并将项目打War包。 ① 同样使用Spring Initializer方式创建项目 ② 打包方式选择\\\"war\\\" ③ 选择添加的模块 ④ 创建的

    2024年02月04日
    浏览(29)
  • 【开源项目】Stream-Query的入门使用和原理分析

    无意间发现了一个有趣的项目, Stream-Query 。了解了一下其基本的功能,可以帮助开发者省去Mapper的编写。在开发中,我们会编写entity和mapper来完成业务代码,但是 Stream-Query 可以省去mapper,只写entity。 实体类 创表语句 配置扫描包 插入Demo 单个查询Demo 多个查询Demo Stream-Que

    2024年02月12日
    浏览(21)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包