当前位置: 首页 > news >正文

四足机器人实战篇之十:cheetah mini运动控制工程解读(附C++代码)

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
TODO:写完再整理

文章目录

  • 系列文章目录
  • 前言
  • 一、主程序入口
    • 1.代码流程
    • 2.终端设置信息提示
  • 总结
  • 参考资料


前言

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!

在这里插入图片描述
四足机器人运动控制相关教程及博客请关注专栏:
https://blog.csdn.net/qq_35635374/category_11523325.html

足式机器人&机械臂控制合集(这个比较全面):
https://blog.csdn.net/qq_35635374/article/details/142862871

本文先对cheetah 3/mini运动控制工程解读做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章

代码流程:主程序入口是机器人控制系统的起始点,它负责初始化系统并引导进入命令行操作。此阶段,系统会打印描述robot程序的命令行标志的消息,以便用户了解如何与程序交互。


提示:以下是本篇文章正文内容

一、主程序入口

1.代码流程

(1)提示终端输入命令行操作,打印描述robot程序的命令行标志的消息

"Usage: robot [robot-id] [sim-or-robot] [parameters-from-file]\n""\twhere robot-id:     3 for cheetah 3, m for mini-cheetah\n""\t      sim-or-robot: s for sim, r for robot\n""\t      param-file:   f for loading parameters from file, l (or nothing) for LCM\n""                      this option can only be used in robot mode\n"

(2)选择机器人类型

MINI_CHEETAH
CHEETAH_3【防盗标记–盒子君hzj】

(3)选择运行是仿真还是真实机器人

s代表sim
r代表robot

(4)选择文件参数加载方式

(1)从文件加载参数
(2)不加载参数

(5)根据上面选择的状态连接机器人合适的驱动
1)仿真桥(模拟器)驱动
2)硬件桥(实体)驱动【防盗标记–盒子君hzj】

/*!* 功能:设置并运行给定的机器人控制器* 参数1:argc用于选择机器人* 参数2:argv[1][~]用于选择机器人,argv[2][~]用于选择是否是仿真,argv[2][~]用于选择是否加载参数文件* argv用于选择仿真还是robot* 注意:RobotController用于选择对应的控制器 * 步骤:(1)通过argv选择机器人类型(2)通过argv选择是否是仿真环境(3)通过argv选择是否加载文件参数(4)根据配置的仿真状态或者真实状态启动模拟器连接桥(5)运行run函数进行动作这里是主程序的入口*/
int main_helper(int argc, char** argv, RobotController* ctrl) 
{/*(1)提示终端输入命令行操作,打印描述robot程序的命令行标志的消息*///if (argc != 3 && argc != 4) {printUsage();     // 打印描述robot程序的命令行标志的消息return EXIT_FAILURE;}*(2)选择机器人类型*//if (argv[1][0] == '3')        //3代表猎豹3,先判断是不是猎豹3{gMasterConfig._robot = RobotType::CHEETAH_3;} else if (argv[1][0] == 'm')   //m代表迷你猎豹,再判断是不是猎豹mini {gMasterConfig._robot = RobotType::MINI_CHEETAH;} else                          //既不是猎豹3又不是猎豹mini就报错{printUsage();return EXIT_FAILURE;}*(3)选择运行是仿真还是真实机器人*//if (argv[2][0] == 's')              //s代表sim{gMasterConfig.simulated = true;} else if (argv[2][0] == 'r')         //r代表robot{gMasterConfig.simulated = false;}else                                //既不是仿真,又不是sim就报错 {printUsage();return EXIT_FAILURE;}*(4)选择文件加载方式*//if(argc == 4 && argv[3][0] == 'f')  //f用于从文件加载参数{gMasterConfig.load_from_file = true;printf("Load parameters from file\n");}else                                //不加载参数{gMasterConfig.load_from_file = false;printf("Load parameters from network\n");}printf("[Quadruped] Cheetah Software\n");printf("        Quadruped:  %s\n",gMasterConfig._robot == RobotType::MINI_CHEETAH ? "Mini Cheetah": "Cheetah 3");printf("        Driver: %s\n", gMasterConfig.simulated? "Development Simulation Driver": "Quadruped Driver");/ /*根据上面选择的状态连接机器人合适的驱动(仿真驱动或者robot驱动)*////*机器人若选择的是仿真状态*/if (gMasterConfig.simulated) {if(argc != 3)                                         //报错{printUsage();return EXIT_FAILURE;}if (gMasterConfig._robot == RobotType::MINI_CHEETAH)  //仿真选择的是猎豹mini,仿真连接猎豹mini的驱动{SimulationBridge simulationBridge(gMasterConfig._robot, ctrl);//设置模拟器连接桥simulationBridge.run();   //连接到仿真函数printf("[Quadruped] SimDriver run() has finished!\n");} else if (gMasterConfig._robot == RobotType::CHEETAH_3)//仿真选择的是猎豹3,仿真连接猎豹3的驱动{SimulationBridge simulationBridge(gMasterConfig._robot, ctrl);  //用SimulationBridge类定义一个simulationBridge的对象,根据上面设置的参数,加载猎豹mini的参数,设置模拟器连接桥simulationBridge.run();                                         //运行仿真桥驱动} else                                                  //既不是选择猎豹3也不是选择猎豹mini,就没有对应的驱动,报错{printf("[ERROR] unknown robot\n");assert(false);}}/*机器人在真实的运动状态*/else                          {
#ifdef linuxif (gMasterConfig._robot == RobotType::MINI_CHEETAH)    //仿真选择的是猎豹mini,仿真连接猎豹mini的驱动{MiniCheetahHardwareBridge hw(ctrl, gMasterConfig.load_from_file);//用MiniCheetahHardwareBridge类定义一个hw的对象,给定手柄数据和机器人参数定义 MiniCheetah硬件桥hw.run();                                                        //运行硬件桥驱动,运行的是MiniCheetahHardwareBridge类内的runprintf("[Quadruped] SimDriver run() has finished!\n");}else if (gMasterConfig._robot == RobotType::CHEETAH_3)  //仿真选择的是猎豹3,仿真连接猎豹3的驱动{Cheetah3HardwareBridge hw(ctrl);;//用Cheetah3HardwareBridge类定义一个hw的变量hw.run();                        //运行硬件桥驱动,运行的是Cheetah3HardwareBridge类内的run}else                                                   //既不是选择猎豹3也不是选择猎豹mini,就没有对应的驱动,报错{printf("[ERROR] unknown robot\n");assert(false);}
#endif}return 0;
}

2.终端设置信息提示

/*!*功能: 打印描述robot程序的命令行标志的消息“用法:robot[robot id][sim or robot][来自文件的参数]”“此处机器人id:3代表猎豹3,m代表迷你猎豹”sim或robot:s代表sim,r代表robotparam file:f用于从文件加载参数,l(或不加载)用于LCM此选项只能在robot模式下使用*/
void printUsage() 
{printf("Usage: robot [robot-id] [sim-or-robot] [parameters-from-file]\n""\twhere robot-id:     3 for cheetah 3, m for mini-cheetah\n""\t      sim-or-robot: s for sim, r for robot\n""\t      param-file:   f for loading parameters from file, l (or nothing) for LCM\n""                      this option can only be used in robot mode\n");
}

.
.


总结

机器人运动控制就以下几个模块

  Quadruped<float>* _quadruped = nullptr;                   //四足数据FloatingBaseModel<float>* _model = nullptr;               //运动学树LegController<float>* _legController = nullptr;           //腿部控制StateEstimatorContainer<float>* _stateEstimator = nullptr;//状态估计器StateEstimate<float>* _stateEstimate = nullptr;           //估计数据GamepadCommand* _driverCommand = nullptr;RobotControlParameters* _controlParameters = nullptr;DesiredStateCommand<float>* _desiredStateCommand = nullptr;VisualizationData* _visualizationData = nullptr;RobotType _robotType;

参考资料

MIT最新源码下载
https://github.com/mit-biomimetics/Cheetah-Software/issues


http://www.mrgr.cn/news/62341.html

相关文章:

  • 火山引擎VeDI数据服务平台:在电商场景中,如何解决API编排问题?
  • 医院信息化与智能化系统(10)
  • 【时间盒子】-【14.任务编辑】修改删除任务
  • 【linux】centos编译安装openssl1.1.1
  • Cent0S9 Stream 修改指定用户密码
  • SystemC学习(3)— APB_SRAM的建模与测试
  • JAVA——多线程
  • JAVA程序导致cpu标高排查
  • 微服务设计模式 — 补偿事务模式(Compensating Transaction Pattern)
  • 基于java+SpringBoot+Vue的网上租贸系统设计与实现
  • Java8中CompletableFuture.allOf的使用
  • Python飞舞蝙蝠
  • 迪杰斯特拉算法(Dijkstra‘s Algorithm
  • Vue学习记录之二十七 Pinia的使用
  • 97、Python并发编程:多线程实现的两种方式
  • 串口屏控制的自动滑轨
  • 【MySQL】 运维篇—安全管理:数据加密与SSL配置
  • Java基础2-数组
  • Python | Leetcode Python题解之第521题最长特殊序列I
  • C语言 | Leetcode C语言题解之第522题最长特殊序列II
  • C++ | Leetcode C++题解之第522题最长特殊序列II
  • 【多线程场景下事务失效问题如何处理?】
  • 从openjdk17 C++源码角度看 java类成员变量是怎么赋值的
  • 理解环境变量与Shell编程:Linux开发的基础
  • DS18B20+测量系统可编程分辨率高精度数字温度传感器芯片
  • Python——石头剪刀布(附源码+多模式二改优化版)