极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2581|回复: 0

三轮全向底盘实现绘图功能

[复制链接]
发表于 2023-4-4 09:58:01 | 显示全部楼层 |阅读模式
本帖最后由 机器谱 于 2023-4-4 09:58 编辑

1. 功能说明
       本文示例将实现R313a样机三轮全向底盘绘图(三角形、矩形、三叶草、正弦曲线)的功能。三轮全向底盘绘制图形有两种模式:第一种是自主选择模式(即通过按下开关进行模式的选项);第二种是上位机模式(即通过上位机发送坐标来完成绘制)。这里主要介绍下自主选择模式绘制图形。


2. 结构说明

     R313a样机主要是由R313c样机上安装一个 舵机关节模组【https://www.robotway.com/h-col-121.html】 组成。

       三轮全向底盘采用全向福来轮作为执行轮,全向福来轮由主轮和副轮组成,主轮和副轮成垂直分布。三个轮成正三角形分布,两两夹角120度,这种结构使得全向底盘运动灵活、可以在平面内任意方向平移。

三轮全向底盘简图

三轮全向底盘的全向移动需要三个轮之间的相互配合,具体运动方向和各个轮的转向如下图所示:

三轮全向底盘运动简图(横线表示该轮不转,箭头方向为轮转动方向)

3. 三轮全向底盘的运动学逆解分析
我们先做一些必要的前提假设:
① 全向底盘质量分布均匀,每个轮子的大小和质量相同;
② 三个全向轮到中心的距离相等,且两两夹角为120度;
③ 全向底盘不会出现打滑。


       首先建立一个世界坐标系X′O′Y′,然后再建立机器人自身的坐标系XOY。设中心到轮子的距离为常数L,移动平台自身的角速度为ω,设顺时针为角速度正方向,各个轮子的速度分别为Va,Vb,Vc。移动平台在自身坐标系下的分速度为Vx,Vy。夹角 θ₁ = π / 3,θ₂ = π / 6 , α是两个坐标系的夹角。

逆解:
所谓逆解,就是给定一个世界坐标系下的速度矢量,需要求出三个轮子分别需要给多少速度才可以使机器人在世界坐标系下达到该速度矢量。通过简单的速度矢量运算我们可以列出以下的线性方程组:


该线性方程组变成矩阵形式就像下面这样:


        这个解是在机器人自身坐标系下的,当运用到实际场景中还需要一步转换。其实很简单,再乘上一个旋转矩阵就可以了。现在假设我们已经知道 α 的大小了,那么求旋转矩阵就没什么难度了,从X′O′Y′到XOY的旋转矩阵为:
那么从XOY到X′O′Y′的旋转矩阵就是R(α)的逆矩阵:
所以有:
将这个关系代入第一个线性方程中得:
化简得:

4. 电子硬件
本实验中采用了以下硬件:

主控板STM32主控板
扩展板STM32扩展板
电池7.4v锂电池
传感器触碰传感器
输出模块OLED显示屏
其它
步进电机、标准舵机

按下图进行电路连接:舵机连接在PD15引脚上。


5. 功能实现
编程环境:keil5
功能:当按上边的触碰传感器时,OLED显示屏上会显示出不同的选项(sin/ Triangle/ Rect/ ThreeLeaf);当按下边的触碰传感器时,开始绘制相应的内容(见下表)。

参数
绘制的图案
sin
正弦曲线
Triangle
三角形
Rect
矩形
ThreeLeaf
三叶草

三轮全向底盘绘图的参考例程(USER\test.uvprojx)如下,下面是主程序main.c:
  1. /*------------------------------------------------------------------------------------

  2.   版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.

  3.            Distributed under MIT license.See file LICENSE for detail or copy at

  4.            https://opensource.org/licenses/MIT

  5.            by 机器谱 2023-03-10 https://www.robotway.com/

  6.   ------------------------------*/

  7. #include "sys.h"

  8. #include "led.h"

  9. #include "usart.h"

  10. #include "delay.h"

  11. #include "math.h"

  12. #include "stdio.h"

  13. #include "string.h"

  14. #include "stdlib.h"

  15. #include "a4988.h"

  16. #include "pwm.h"

  17. #include "key.h"

  18. #include "oled.h"

  19. #include "stdbool.h"


  20. int main(void)

  21. {

  22. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2

  23. delay_init(168);//初始化延时,168为CPU运行频率

  24. usart_init(9600); //串口初始化

  25. usart3_init(9600);

  26. LED_Init();//LED灯初始化

  27. Stepper_Motor_Init(0); //步进电机引脚初始化

  28. KEY_Init();

  29. OLED_Init(1);

  30. delay_ms(1000);

  31. TIM4_PWM_Init(20000-1,84-1);

  32. Put_Up();delay_ms(1500);

  33.   int receive_touch[2] = {0,0};

  34. bool Flags_draw = false;

  35. OLED_Clear();

  36. OLED_ShowString(30,3,(unsigned char*)"Wait...",16);

  37. while(1)

  38. {

  39. if(touch_keys(1) == 1)

  40. {

  41.   delay_ms(350);

  42. receive_touch[0] += 1;

  43. Flags_draw = false;

  44. }

  45. if(touch_keys(2) == 1)

  46. {

  47. if(Flags_draw)

  48. {

  49. receive_touch[1] = 0;

  50. }

  51. else

  52. {

  53.     delay_ms(350);

  54.   receive_touch[1] = 1;

  55. }

  56. }

  57.   if(receive_touch[0]==1)

  58. {

  59. //printf("data:%d",receive_touch[0]);

  60.   OLED_Clear();

  61.   OLED_ShowString(0,0,(unsigned char*)"Sin",16);

  62. if(receive_touch[1] == 1)

  63. {

  64. OLED_Clear();

  65. OLED_ShowString(0,0,(unsigned char*)"Sin",16);

  66. OLED_ShowString(0,4,(unsigned char*)"Start",16);

  67. receive_touch[1]=0;

  68. delay_ms(1000);

  69.     Put_Down();delay_ms(1000);

  70.     drawSin();

  71.     Put_Up();delay_ms(1000);

  72. }

  73. }

  74. if(receive_touch[0]==2)

  75. {

  76. //printf("data:%d",receive_touch[0]);

  77.   OLED_Clear();

  78.   OLED_ShowString(0,0,(unsigned char*)"Triangle",16);

  79. if(receive_touch[1] == 1)

  80. {

  81. OLED_Clear();

  82. OLED_ShowString(0,0,(unsigned char*)"Triangle",16);

  83. OLED_ShowString(0,4,(unsigned char*)"Start",16);

  84. receive_touch[1]=0;

  85.     Put_Down();delay_ms(1000);

  86.     drawTriangle();

  87.     Put_Up();delay_ms(1000);

  88. }

  89. }



  90.   if(receive_touch[0]==3)

  91. {

  92. //printf("data:%d",receive_touch[0]);

  93.   OLED_Clear();

  94.   OLED_ShowString(0,0,(unsigned char*)"Rect",16);

  95. if(receive_touch[1] == 1)

  96. {

  97. //receive_touch[0]=0;

  98. OLED_Clear();

  99. OLED_ShowString(0,0,(unsigned char*)"Rect",16);

  100. OLED_ShowString(0,4,(unsigned char*)"Start",16);

  101. receive_touch[1]=0;

  102.     Put_Down();delay_ms(1000);

  103.     drawRect();

  104.     Put_Up();delay_ms(1000);

  105. }

  106. }



  107.   if(receive_touch[0]==4)

  108. {

  109.   OLED_Clear();

  110.   OLED_ShowString(0,0,(unsigned char*)"ThreeLeaf",16);

  111. if(receive_touch[1] == 1)

  112. {

  113. OLED_Clear();

  114. OLED_ShowString(0,0,(unsigned char*)"ThreeLeaf",16);

  115. OLED_ShowString(0,4,(unsigned char*)"Start",16);

  116. receive_touch[1]=0;

  117.     //Put_Down();delay_ms(1000);

  118.     drawThreeLeaf();

  119.     Put_Up();delay_ms(1000);

  120. }

  121. }


  122.   if(receive_touch[0]==5)

  123. {

  124.   OLED_Clear();

  125.   OLED_ShowString(8,3,(unsigned char*)"Draw Line End",16);

  126. receive_touch[0]=0;

  127.   receive_touch[1]=0;

  128.   Flags_draw = true;

  129. }

  130.   }

  131. }
复制代码

三轮全向底盘绘制三角形、矩形、三叶草、正弦曲线的详细例程可下载文末资料获取。

6. 资料下载
资料内容:
​①绘图-例程源代码
​②绘图-样机3D文件
资料下载地址:https://www.robotway.com/h-col-199.html

想了解更多机器人开源项目资料请关注 机器谱网站 https://www.robotway.com

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-28 23:09 , Processed in 0.054876 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表