6自由度并联拉线写字机器人实现写字功能
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自由度并联拉线写字机器人实现写字功能相关推荐
- python写字机器人_写字机器人开发之:霍夫变换的直线识别
为了实现利用霍夫变换求得页面的格子线和边界的定位,需要识别出这些格子线和边界,但是现在的情况下,识别情况不是很好.暂且把代码罗列如下,以便后续修改完善. 参考代码: #!/usr/bin/env py ...
- 并联四足机器人项目开源教程(六)--- Cheetah开源项目的代码框架移植
这个是本人在大三期间做的项目 ---- 基于MIT的Cheetah方案设计的十二自由度并联四足机器人,这个项目获得过两个国家级奖项和一个省级奖项.接下来我会将这个机器人的控制部分所有代码进行开源,并配 ...
- 并联四足机器人项目开源教程(三)--- 使用webots搭建仿真环境
这个是本人在大三期间做的项目 ---- 基于MIT的Cheetah方案设计的十二自由度并联四足机器人,这个项目获得过两个国家级奖项和一个省级奖项.接下来我会将这个机器人的控制部分所有代码进行开源,并配 ...
- 并联四足机器人项目开源教程(五) --- 四足机器人相关书籍论文研读
这个是本人在大三期间做的项目 ---- 基于MIT的Cheetah方案设计的十二自由度并联四足机器人,这个项目获得过两个国家级奖项和一个省级奖项.接下来我会将这个机器人的控制部分所有代码进行开源,并配 ...
- 并联四足机器人项目开源教程(一)--- 机器人学导论的学习
这个是本人在大三期间做的项目 ---- 基于MIT的Cheetah方案设计的十二自由度并联四足机器人,这个项目获得过两个国家级奖项和一个省级奖项.接下来我会将这个机器人的控制部分所有代码进行开源,并配 ...
- 3自由度并联绘图机器人实现写字功能(二)
1. 功能说明 本文示例将实现R305b样机3自由度并联绘图机器人写字的功能.本实验使用的样机是用探索者兼容零件制作的. 2. 电子硬件 在这个示例中,采用了以下硬件,请大家参考: 主控板 Basra ...
- 3自由度并联绘图机器人实现写字功能(一)
1. 功能说明 本文示例将实现R305样机3自由度并联绘图机器人写字的功能. 2. 电子硬件 在这个示例中,采用了以下硬件,请大家参考: 主控板 Basra主控板(兼容Arduino Uno) 扩展板 ...
- c语言写字机器人,写字机器人(基于STM32简易实现)
写此博客的主要目的是为了记录下来调试过程中所遇到的问题,更重要的是记录下来解决遇到的那些问题的方法,以供之后此后遇到问题之参考. 该写字机器人或叫机械臂的主控芯片为STM32F103C8T6,机械臂拥 ...
- 蜡笔小新里的钢达姆机器人怎么画_写字机器人好用吗? 组装就花了5个小时 还要学习软件、录入字体...
据江苏公共·新闻频道<新闻360>报道:新学期开学,各种各样的课后作业成了孩子和家长关注的话题.前不久,一条"孩子购买代写作业机器人,被家长发现"的新闻,引发了强烈争议 ...
最新文章
- python GUI编程( 二 ) (基于PyQt5)
- 图灵四月书讯 ——经典与技术前沿的融合
- Simulink仿真---PMSM滞环电流控制仿真模型学习
- 光纤激光切机计算机无法启动,激光切割机不出光,如何解决?
- WF:要想绑到两个活动的属性值---依赖属性的定义方法
- python 状态码转字典文本_python爬虫 处理521状态码
- 的ui在vs中显示没有成员_在电脑桌面使用敬业签团队便签怎么设置新增内容在上面显示?...
- Android JNI学习(六)——Java与Native实战演习
- 真假难辨,AI就能分得清?
- Flex_As操作大全
- 安卓磁链搜索下载播放和原理探索
- ping结果中TTL是什么意思
- 2D激光SLAM::ROS-AMCL包源码阅读(三)从main()开始
- CSS3中设置元素转换中心点
- VUCA时代下,如何有效提高项目成功率?
- 漏洞解决方案-明文传输漏洞
- 2020年是意义非凡的一年,大专的我面试阿里P6居然过了,activity事件分发
- 网易校园招聘java面试经历
- 【知识蒸馏】知识蒸馏(Knowledge Distillation)技术详解
- 网站 数据库 服务器 结构图,网站 数据库 服务器 结构图
热门文章
- 湖南工业大学计算机学院调剂,2019年湖南工业大学硕士研究生调剂信息
- 微信公众号h5更新内容部分手机出现白屏或者旧内容,需要刷新
- 基于Java毕业设计新生报到管理源码+系统+mysql+lw文档+部署软件
- 5个免费的跨境电商营销工具,你Get了吗?
- linux sssd加入AD域 Key table file ‘/etc/krb5.keytab‘ not found
- 出境游复苏加速,距离“回到过去”还有多远?
- 5G/NR 随机接入过程之Msg3
- HTML躬行记(4)——Web音视频基础
- android 华为荣耀v8不能上传视频,华为荣耀V8能拍摄720p视频吗
- 科大讯飞会是典型的AI泡沫吗