目录
- 一. 绪论
- 二. 轮式机器人概述
- 三. 硬件准备
-
- 1. 机械底盘
- 2. 电机选择
- 3. 驱动板
- 4. 传感器
- 5. 电池
- 四. 软件准备——UCOS-III操作系统
一. 绪论
匆匆忙忙的2020年结束了,在机器人平台开发方面算是搞清了些端倪。近来总算有时间回顾过往,稍作整理。计划写一个专题系列,内容即为“机器人控制系统设计与实现”,这将会是我的系列文章的宗旨。机器人平台从地面无人车到空中无人机到水下无人潜航器,这将是一个可上九天揽月、可下五洋捉鳖的宏大蓝图。讲述内容从控制算法到嵌入式软件开发,从计算机仿真到单片机实战,从底层驱动到上层应用。所有的代码源于项目实战,讲述方式将是雅俗共赏。记录与分享心得的过程是快乐的,既是悦己、也可及人。如果有志同道合的朋友们可以动动小爪点个关注,我们一起成长、一起进步叭!
第一篇从实现一个四轮四驱小车开始~
二. 轮式机器人概述
在机器人的大家庭里,轮式机器人独领风骚。轮式机器人常见的有两轮平衡车(二驱差速)、四轮车(四驱差速)、三轮车(二驱)、阿克曼转向小车(与汽车最为相似)、麦克纳姆轮(Mecanum wheel)小车、全向轮(omni wheel)小车等。感兴趣的小伙伴可以分别去了解运动与控制原理,市场上的绝大部分地面移动机器人大抵都是基于以上平台了。这里我们实现一个四轮小车,四轮都有电机驱动,左右电机各为一组,控制左右侧电机差速即可实现转向,很简单有木有但是麻雀虽小,五脏俱全,在此篇中我们基于STM32实现机器人的控制,使用UCOS-III操作系统,实现遥控器通信、传感器数据读取、航向角串级PID控制、电机PID控制全部功能。上位机地面站的开发我放在下一篇四轴飞行器的讲解中。
三. 硬件准备
1. 机械底盘
搭建四轮小车的机械部分就不细讲了,有条件的自己设计机架机加工或3D打印,没条件的直接买一个四轮底盘即可,电机、轮子配套,成本不高。
2. 电机选择
电机选择就很多了,小型四轮车常见的是编码器电机,如图1所示,一般是六根接线,两根编码器电源线,两根电源线,两根编码器信 线(A相B相)。只需要一路编码器就可用于测速,两路可以测方向,控制板需要解析编码器信 做速度闭环控制。
3. 驱动板
4. 传感器
传感器主要是需要姿态传感器,一般使用九轴惯性传感器,即三轴陀螺仪、三轴加速度计、三轴磁力计。最终目的就是解算三轴姿态角,这里简单粗暴,直接买了一个姿态角传感器,如图所示是维特智能的传感器,串口输出三轴姿态角,其内部还是使用姿态解算算法算出来的。如果使用MPU9250等模块就需要自己进行解算了,后面有时间专门写一篇滤波算法与姿态解算。
在main函数中系统初始化、外设初始化、创建开始任务
开始任务的内容如下,内容就是创建其他四个任务,之后把自己挂起。
//开始任务函数void start_task(void *p_arg){ OS_ERR err; CPU_SR_ALLOC(); p_arg = p_arg; CPU_Init();#if OS_CFG_STAT_TASK_EN > 0u OSStatTaskCPUUsageInit(&err); //统计任务#endif#ifdef CPU_CFG_INT_DIS_MEAS_EN //如果使能了测量中断关闭时间 CPU_IntDisMeasMaxCurReset();#endif#if OS_CFG_SCHED_ROUND_ROBIN_EN //当使用时间片轮转的时候 //使能时间片轮转调度功能,设置默认的时间片长度 OSSchedRoundRobinCfg(DEF_ENABLED, 1, &err);#endif __HAL_RCC_CRC_CLK_ENABLE(); //使能CRC时钟 OS_CRITICAL_ENTER(); //进入临界区 //communicate任务 通信任务 OSTaskCreate((OS_TCB *)&CommunicateTaskTCB, (CPU_CHAR *)"Communicate task", (OS_TASK_PTR)communicate_task, (void *)0, (OS_PRIO)COMMUNICATE_TASK_PRIO, (CPU_STK *)&COMMUNICATE_TASK_STK[0], (CPU_STK_SIZE)COMMUNICATE_STK_SIZE / 10, (CPU_STK_SIZE)COMMUNICATE_STK_SIZE, (OS_MSG_QTY)0, (OS_TICK)10, (void *)0, (OS_OPT)OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR | OS_OPT_TASK_SAVE_FP, (OS_ERR *)&err); //Stabilizaiton任务 姿态控制 OSTaskCreate((OS_TCB *)&StabilizationTaskTCB, (CPU_CHAR *)"Stabilization task", (OS_TASK_PTR)stabilization_task, (void *)0, (OS_PRIO)STABILIZATION_TASK_PRIO, (CPU_STK *)&STABILIZATION_TASK_STK[0], (CPU_STK_SIZE)STABILIZATION_STK_SIZE / 10, (CPU_STK_SIZE)STABILIZATION_STK_SIZE, (OS_MSG_QTY)0, (OS_TICK声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!