1. 功能说明

本文示例将实现R287样机6自由度并联拉线写字机器人写字(机器时代)的功能。

该机器人有两部分:绘图机构、走纸机构。绘图机构由6个舵机模块近似正六边形位置分布,共同控制位于中心的画笔;还具备一个走纸机构,走纸机构是由一个大圆周舵机驱动的。

2. 6自由度并联拉线写字机器人逆解算法

该6自由度并联拉线写字机器人的运动控制采用逆运动更容易一些,下面我们将对其逆运动算法进行介绍。我们先确定该6自由度并联拉线写字机器人的位置,通过建立坐标系的方法确定位置。这里我们选择在6自由度并联拉线写字机器人外一点建立一个直角坐标系,Z轴范围——笔架上下接线间距60,坐标系Z轴0点为7X11平板平面,这里面我们需要求解出每个舵机转动角度与画笔位置的关系:

各舵机坐标(注意这里面的Z轴坐标是以实际作用到舵机上的为准)

1(97,55,-10)

2(25,200,50)

3(97,345,-10)

4(302,345,50)

5(375,200,-10)

6(302,55,50)

中心点(x,y,z);目标点(xt,yt,zt);舵机半径 radius——24.0

中心点到每个舵机的距离:

目标点到每个舵机的距离 :

中心点到目标点舵机需要转动的角度(弧长公式):

其中90.0为笔在中心时舵机初始角度(这个很重要,舵机角度安装一定要注意),M_PI=3.1415926,0.5用于五入(为了补充运动过程中无法避免的损耗产生的运动误差)。

3. 电子硬件

本实验中采用了以下硬件:

主控板

Basra主控板(兼容Arduino Uno)‍

扩展板

Bigfish2.1扩展板‍

电池 7.4V锂电池

其它

画笔、画笔套管、连线、纸张等

电路连接说明: 舵机连接:按圆盘顺时针方向,舵机位置依次对应Bigfish扩展板的D4, D7, D11,D3, D8, D12

4. 功能实现

     编程环境:Arduino 1.8.19

下面提供一个6自由度并联拉线写字机器人写字(机器时代)的参考例程(servo_writing.ino):

/*------------------------------------------------------------------------------------版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.Distributed under MIT license.See file LICENSE for detail or copy athttps://opensource.org/licenses/MITby 机器谱 2023-04-20 https://www.robotway.com/------------------------------*//** 舵机连接,按圆盘顺时针舵机位置依次对应Bigfish:4, 7, 11, 3, 8, 12* 书写范围:dx --> 50; dy --> 40*/#include <Arduino.h>#include <avr/pgmspace.h>#include "model.h"#include "words.h"#include <Servo.h>#define SQU 0#define JI 1#define QI 2#define SHI 3#define DAI 4Servo myServo[SERVO_NUM];     //笔筒控制舵机数组Servo myServo1;               //走纸舵机Servo myServo2;               //压纸舵机int servo_port[SERVO_NUM] = {4,7,11,3,8,12};   //笔筒控制舵机引脚   int words_num[10] = {};   Point squ[] = {};              //字体Point ji[] = {};Point qi[] = {};Point shi[] = {};Point dai[] = {};   int pos_x = 0, pos_y = 1, pos_z = 2;boolean pos_test = false;      //位置测试, 真为测试void setup() {Serial.begin(9600);myServo1.attach(16);         //走纸舵机引脚myServo2.attach(17);         //压纸舵机引脚myServo1.write(88);          //走纸停pressServoDown();            //压纸if(pos_test) posTest();      //坐标位置测试wordsArrayLength();          //计算flash中存储的字体数组长度delay(1000);}void loop() {                  //写字//   writing(SQU);writing(JI);                 //机writing(QI);                 //器writing(SHI);                //时writing(DAI);                //代while(1){};}void setPos(Point pos) {                               static const float _basic_dists[kActuatorCount] = {distance(kInitialPoint, kActuatorOrigins[0]),distance(kInitialPoint, kActuatorOrigins[1]),distance(kInitialPoint, kActuatorOrigins[2]),distance(kInitialPoint, kActuatorOrigins[3]),distance(kInitialPoint, kActuatorOrigins[4]),distance(kInitialPoint, kActuatorOrigins[5])};int degree[kActuatorCount] = {};for (int i = 0; i < kActuatorCount; ++i){float dist = distance(pos, kActuatorOrigins[i]);float deg = 90.0 + (dist - _basic_dists[i]) /kActuatorRadius / M_PI * 180.0;degree[i] = floor(deg+0.5);}for (int i = 0; i < kActuatorCount; ++i){ServoGo(i, map(degree[i], 0, 180, 700, 2100));}}void writeLine(Point a, Point b, unsigned long t) {static const int dt = 50;unsigned long k = t / dt;float dx = (b.x - a.x) / (float)k;float dy = (b.y - a.y) / (float)k;Point p = a;for (int i = 0; i < k; ++i){setPos(p);delay(dt);p.x += dx;p.y += dy;}}void ServoStart(int which){if(!myServo[which].attached())myServo[which].attach(servo_port[which]);pinMode(servo_port[which], OUTPUT);}void ServoStop(int which){myServo[which].detach();digitalWrite(servo_port[which],LOW);}void ServoGo(int which , int where){ServoStart(which);myServo[which].writeMicroseconds(where);}void posTest(){//    setPos({175, 185, 20});   //最小坐标//    delay(1000);setPos({200, 200, 50});   //中间坐标,确定笔的位置时可将位置设置为中间坐标,打开开关然后机械调整舵机角度直到笔筒在中间位置即可delay(1000);//    setPos({225, 225, 20});   //最大坐标//    delay(1000);while(1){delay(10);};}void wordsArrayLength(){words_num[0] = sizeof(squArray) / sizeof(squArray[0]) / 3;words_num[1] = sizeof(jiArray) / sizeof(jiArray[0]) / 3;             //机words_num[2] = sizeof(qiArray) / sizeof(qiArray[0]) / 3;             //器words_num[3] = sizeof(shiArray) / sizeof(shiArray[0]) / 3;           //时words_num[4] = sizeof(daiArray) / sizeof(daiArray[0]) / 3;           //代}void readProgmem(int p, Point a, Point b, int ary[]){a.x = pgm_read_word_near( ary + p * 3 + pos_x) + 175;a.y = pgm_read_word_near( ary + p * 3 + pos_y) + 185;a.z = pgm_read_word_near( ary + p * 3 + pos_z);b.x = pgm_read_word_near( ary + (p + 1) * 3 + pos_x) + 175;b.y = pgm_read_word_near( ary + (p + 1) * 3 + pos_y) + 185;b.z = pgm_read_word_near( ary + (p + 1) * 3 + pos_z);writeLine(a, b, 500);//    Serial.print(a.x);  //    Serial.print("_");//    Serial.print(a.y);//    Serial.print(" ");//    Serial.print(b.x);  //    Serial.print("_");//    Serial.println(b.y);}void writing(int which){for(int i=0;i<words_num[which] - 1;i++){switch(which){case 0:readProgmem(i, squ[i], squ[i+1], squArray);break;case 1:readProgmem(i, ji[i], ji[i+1], jiArray);break;case 2:readProgmem(i, qi[i], qi[i+1], qiArray);break;case 3:readProgmem(i, shi[i], shi[i+1], shiArray);break;case 4:readProgmem(i, dai[i], dai[i+1], daiArray);break;}pos_x = 0;pos_y = 1;pos_z = 2;}setPos({200, 200, 50});delay(1000);pressServoUp();delay(100);positionSwitch();pressServoDown();}void positionSwitch(){                //走纸函数myServo1.write(80);delay(500);myServo1.write(88);delay(100);}void pressServoDown(){                //压杆落myServo2.write(70);  }void pressServoUp(){                  //压杆抬myServo2.write(75);  }

5. 资料内容

①写字-例程源代码

②写字-样机3D文件

资料内容详见:6自由度并联拉线写字机器人-写字

6自由度并联拉线写字机器人实现写字功能相关推荐

  1. python写字机器人_写字机器人开发之:霍夫变换的直线识别

    为了实现利用霍夫变换求得页面的格子线和边界的定位,需要识别出这些格子线和边界,但是现在的情况下,识别情况不是很好.暂且把代码罗列如下,以便后续修改完善. 参考代码: #!/usr/bin/env py ...

  2. 并联四足机器人项目开源教程(六)--- Cheetah开源项目的代码框架移植

    这个是本人在大三期间做的项目 ---- 基于MIT的Cheetah方案设计的十二自由度并联四足机器人,这个项目获得过两个国家级奖项和一个省级奖项.接下来我会将这个机器人的控制部分所有代码进行开源,并配 ...

  3. 并联四足机器人项目开源教程(三)--- 使用webots搭建仿真环境

    这个是本人在大三期间做的项目 ---- 基于MIT的Cheetah方案设计的十二自由度并联四足机器人,这个项目获得过两个国家级奖项和一个省级奖项.接下来我会将这个机器人的控制部分所有代码进行开源,并配 ...

  4. 并联四足机器人项目开源教程(五) --- 四足机器人相关书籍论文研读

    这个是本人在大三期间做的项目 ---- 基于MIT的Cheetah方案设计的十二自由度并联四足机器人,这个项目获得过两个国家级奖项和一个省级奖项.接下来我会将这个机器人的控制部分所有代码进行开源,并配 ...

  5. 并联四足机器人项目开源教程(一)--- 机器人学导论的学习

    这个是本人在大三期间做的项目 ---- 基于MIT的Cheetah方案设计的十二自由度并联四足机器人,这个项目获得过两个国家级奖项和一个省级奖项.接下来我会将这个机器人的控制部分所有代码进行开源,并配 ...

  6. 3自由度并联绘图机器人实现写字功能(二)

    1. 功能说明 本文示例将实现R305b样机3自由度并联绘图机器人写字的功能.本实验使用的样机是用探索者兼容零件制作的. 2. 电子硬件 在这个示例中,采用了以下硬件,请大家参考: 主控板 Basra ...

  7. 3自由度并联绘图机器人实现写字功能(一)

    1. 功能说明 本文示例将实现R305样机3自由度并联绘图机器人写字的功能. 2. 电子硬件 在这个示例中,采用了以下硬件,请大家参考: 主控板 Basra主控板(兼容Arduino Uno) 扩展板 ...

  8. c语言写字机器人,写字机器人(基于STM32简易实现)

    写此博客的主要目的是为了记录下来调试过程中所遇到的问题,更重要的是记录下来解决遇到的那些问题的方法,以供之后此后遇到问题之参考. 该写字机器人或叫机械臂的主控芯片为STM32F103C8T6,机械臂拥 ...

  9. 蜡笔小新里的钢达姆机器人怎么画_写字机器人好用吗? 组装就花了5个小时 还要学习软件、录入字体...

    据江苏公共·新闻频道<新闻360>报道:新学期开学,各种各样的课后作业成了孩子和家长关注的话题.前不久,一条"孩子购买代写作业机器人,被家长发现"的新闻,引发了强烈争议 ...

最新文章

  1. python GUI编程( 二 ) (基于PyQt5)
  2. 图灵四月书讯 ——经典与技术前沿的融合
  3. Simulink仿真---PMSM滞环电流控制仿真模型学习
  4. 光纤激光切机计算机无法启动,激光切割机不出光,如何解决?
  5. WF:要想绑到两个活动的属性值---依赖属性的定义方法
  6. python 状态码转字典文本_python爬虫 处理521状态码
  7. 的ui在vs中显示没有成员_在电脑桌面使用敬业签团队便签怎么设置新增内容在上面显示?...
  8. Android JNI学习(六)——Java与Native实战演习
  9. 真假难辨,AI就能分得清?
  10. Flex_As操作大全
  11. 安卓磁链搜索下载播放和原理探索
  12. ping结果中TTL是什么意思
  13. 2D激光SLAM::ROS-AMCL包源码阅读(三)从main()开始
  14. CSS3中设置元素转换中心点
  15. VUCA时代下,如何有效提高项目成功率?
  16. 漏洞解决方案-明文传输漏洞
  17. 2020年是意义非凡的一年,大专的我面试阿里P6居然过了,activity事件分发
  18. 网易校园招聘java面试经历
  19. 【知识蒸馏】知识蒸馏(Knowledge Distillation)技术详解
  20. 网站 数据库 服务器 结构图,网站 数据库 服务器 结构图

热门文章

  1. 湖南工业大学计算机学院调剂,2019年湖南工业大学硕士研究生调剂信息
  2. 微信公众号h5更新内容部分手机出现白屏或者旧内容,需要刷新
  3. 基于Java毕业设计新生报到管理源码+系统+mysql+lw文档+部署软件
  4. 5个免费的跨境电商营销工具,你Get了吗?
  5. linux sssd加入AD域 Key table file ‘/etc/krb5.keytab‘ not found
  6. 出境游复苏加速,距离“回到过去”还有多远?
  7. 5G/NR 随机接入过程之Msg3
  8. HTML躬行记(4)——Web音视频基础
  9. android 华为荣耀v8不能上传视频,华为荣耀V8能拍摄720p视频吗
  10. 科大讯飞会是典型的AI泡沫吗