四足机器人实战篇之十: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