食品加工机械臂控制研究
- 格式:docx
- 大小:210.92 KB
- 文档页数:19
工业机器人在食品加工行业的应用及发展趋势工业机器人在食品加工行业的应用越来越广泛,它们可以提高生产效率,降低劳动强度,并确保产品的质量和安全性。
随着技术的不断发展,工业机器人在食品加工行业的应用也在不断创新。
本文将探讨工业机器人在食品加工行业的应用,并展望其未来的发展趋势。
一、工业机器人在食品加工行业的应用1. 食品包装工业机器人在食品包装环节的应用非常广泛。
它们可以完成食品的分拣、包装、封装等工作,提高包装效率,减少包装错误率。
通过视觉识别系统和机械手臂的精确控制,工业机器人可以将食品按照指定的重量和数量进行包装,确保产品的一致性和卫生安全。
2. 食品加工工业机器人在食品加工环节也发挥着重要的作用。
例如,在面包生产中,机器人可以自动将配料进行搅拌和混合,然后将面团切割成相同大小的块,最后进行烘烤。
这种自动化的加工过程大大提高了生产效率,并确保了产品的质量和口感的一致性。
3. 食品检测与质量控制工业机器人在食品检测与质量控制方面具有独特的优势。
它们可以利用高精度的传感器和摄像头来检测食品的大小、形状、颜色等特征,并进行瑕疵检测。
而且,工业机器人可以在高速运动中实现精确的操作,确保产品的质量和安全性。
二、工业机器人在食品加工行业的发展趋势1. 自主化与智能化随着人工智能技术的不断发展,工业机器人正在朝着自主化和智能化的方向发展。
它们可以通过学习和适应能力,自动识别和调整工作任务,从而更好地适应复杂多变的生产环境。
同时,工业机器人还可以通过与其他设备和系统的联网,实现数据的共享和协同操作,进一步提高生产效率和管理水平。
2. 灵活性和适应性未来的工业机器人将会更加灵活和适应性强。
它们可以通过柔性机械臂、可变结构和模块化设计来适应不同的生产需求。
例如,在食品加工行业,机器人可以根据不同的食品种类和工艺要求,灵活地改变工作姿态和动作路径,实现多品种、小批量生产。
3. 安全性和卫生性工业机器人在食品加工行业的应用必须要符合严格的安全和卫生标准。
自动化上下料机械手臂介绍自动化上下料机械手臂主要由机械臂、末端执行器、控制系统和传感器等组成。
机械臂通常采用多个关节结构,可以灵活移动和旋转,以适应各种复杂的作业环境和作业需求。
末端执行器通常是夹具或吸盘,用于抓取和搬运物料。
控制系统负责控制机械手臂的运动和执行任务,传感器用于监测环境和物料状态,以保证操作的安全性和准确性。
自动化上下料机械手臂的工作过程通常包括以下几个步骤:首先,机械手臂通过传感器检测到物料的位置和状态,并确定抓取方式和力度;然后,机械手臂灵活移动和旋转,将末端执行器准确地放置到目标位置,并将物料抓取起来;接下来,机械手臂再次移动到指定位置,并将物料准确放置到目标位置,完成上下料的任务。
1.高效性:机械手臂可以以较高的速度和准确性进行物料的上下料操作,提高生产效率。
2.灵活性:机械手臂的关节结构可以灵活移动和旋转,适应各种复杂的作业环境和作业需求。
3.自动化:机械手臂可以通过编程实现自动化的上下料操作,无需人力干预,减少了劳动力成本。
4.准确性:机械手臂可以通过传感器监测和调整操作过程中的位置和力度,保证物料的准确抓取和放置。
5.稳定性:机械手臂的运动和控制由控制系统负责,可以保证操作的稳定性和一致性。
自动化上下料机械手臂广泛应用于各个行业的生产工艺中,如汽车制造、电子设备制造、食品加工、医药生产等。
它可以帮助企业实现生产的智能化和自动化,提高产品质量和产能,降低生产成本,提高生产效率,增强企业竞争力。
总之,自动化上下料机械手臂是一种高效、灵活和稳定的工业机器人,可以帮助企业实现生产的智能化和自动化,提高生产效率和产品质量,降低生产成本,是现代工业生产中不可或缺的重要设备。
3p-delta机械臂参数3p-delta机械臂是一种高速、高精度的平行机械臂,由三根活动杆件和三个固定基座组成。
这种机械臂的独特结构和运动方式使其在工业自动化领域具有广泛的应用。
本文将介绍3p-delta机械臂的参数及其特点。
一、机械臂参数1. 杆件长度:3p-delta机械臂的三根活动杆件长度相等,通常用L 表示。
杆件长度的选择会直接影响机械臂的工作空间大小和运动范围。
2. 轨迹半径:机械臂的轨迹半径是指杆件末端在平面上的最大移动距离。
轨迹半径的大小与杆件长度、基座间距等参数有关。
3. 基座间距:3p-delta机械臂的三个固定基座之间的距离通常用R 表示。
基座间距的选择会直接影响机械臂的工作空间大小和运动范围。
4. 末端负载:机械臂末端负载是指机械臂在工作时所携带的负荷。
末端负载的大小会对机械臂的动态性能和稳定性产生影响。
5. 控制系统:3p-delta机械臂的控制系统通常包括运动控制器、传感器、执行器等。
控制系统的设计和参数设置直接影响机械臂的定位精度和工作效率。
二、3p-delta机械臂的特点1. 高速:由于3p-delta机械臂的结构特点,它具有快速的加速度和减速度,适合进行高速运动和快速定位。
2. 高精度:3p-delta机械臂具有较高的定位精度和重复精度。
其运动学模型和控制算法的设计使得机械臂可以实现精确的位置控制。
3. 大工作空间:3p-delta机械臂的运动范围广泛,可以覆盖较大的工作空间。
它适用于需要大范围运动和灵活操作的场景。
4. 高稳定性:3p-delta机械臂的结构稳定性较好,可以在高速运动和重负荷条件下保持稳定。
这使得机械臂在工业生产中能够长时间稳定运行。
5. 灵活性:3p-delta机械臂的末端可以进行多自由度的运动,可以完成复杂的工作任务。
它适用于需要灵活操作和多任务处理的生产环境。
三、应用领域由于3p-delta机械臂具有高速、高精度和灵活性等特点,因此在许多领域得到了广泛应用。
智能制造技术在食品加工中的创新与应用随着科技进步和社会发展,智能制造技术逐渐渗透到各个领域,食品加工行业也不例外。
智能制造技术的创新与应用为食品加工带来了许多机遇和挑战。
本文将探讨智能制造技术在食品加工中的创新与应用,通过准确的描述和案例来阐述这一主题。
一. 智能制造技术在食品加工中的创新1. 自动化生产线的应用传统的食品加工生产线通常需要大量的人工操作和监控。
然而,自动化生产线的引入改变了这一情况。
自动化生产线利用智能控制系统,实现了整个生产过程的自动化。
例如,通过激光传感器检测,智能机械臂能够准确地将原材料放置在指定的位置,减少了人为因素对生产过程的干扰,提高了生产效率和产品质量。
2. 大数据的应用智能制造技术的另一个重要创新是大数据的应用。
在食品加工行业,大数据的收集和分析可以帮助企业更好地了解市场需求和消费者偏好,有针对性地进行生产和营销。
另外,通过大数据的分析,企业还可以实现生产过程的优化和精细管理,提高资源利用率和生产效益。
3. 人工智能的应用人工智能是智能制造技术中的重要组成部分,也在食品加工中得到了广泛应用。
人工智能通过模拟和学习人类的思维和行为,实现了智能决策和操作。
在食品加工中,人工智能可以用于产品质量检测、生产流程控制、供应链管理等方面。
例如,通过人工智能的视觉识别技术,可以实现对产品外观的自动检测,提高产品质量的稳定性和一致性。
二. 智能制造技术在食品加工中的应用1. 智能设备的应用智能制造技术的应用离不开智能设备的支持。
在食品加工中,智能设备的应用可以大幅度提升生产效率和产品质量。
例如,智能传感器可以实时监测产品的温度、湿度等参数,保证产品在合适的环境下加工和储存。
智能机器人可以替代人工将产品分拣和包装,提高生产线的自动化程度。
2. 虚拟现实的应用虚拟现实技术是智能制造技术中的一项重要创新,也被广泛应用于食品加工中。
通过虚拟现实技术,员工可以在虚拟环境中进行培训和操作,提高工作效率和准确性。
机械臂的研究与发展引言机械臂作为一种用于模拟人手运动并完成各种任务的机械装置,已在工业生产、医疗手术、航天科研等领域得到广泛应用。
机械臂的研究与发展一直是科学家和工程师们的关注焦点。
本文将介绍机械臂的历史发展、应用领域以及未来趋势。
历史发展机械臂的历史可以追溯到20世纪50年代。
当时,机械臂被广泛用于核电站中进行危险任务的处理。
这些机械臂由一系列的关节组成,可以灵活移动并完成人类难以到达的地方的操作。
随着技术的发展,机械臂逐渐开始应用于其他领域,如汽车制造、食品加工等。
在机械臂的早期发展中,电气和机械工程师们主要关注机械臂的结构设计和控制系统的开发。
他们使用了传统的电机、传感器和编程语言来实现对机械臂的控制。
然而,这些早期的机械臂在某些方面还存在一些局限性,如精确度、速度和安全性等方面。
应用领域随着机械技术的不断进步,机械臂在各个领域得到了广泛应用。
工业生产工业生产是机械臂应用最广泛的领域之一。
机械臂可以取代人工完成重复性、繁琐或危险的工作。
例如,在汽车制造中,机械臂可以用来组装汽车零部件、焊接车身等。
机械臂的使用可以提高生产效率和产品质量,并降低生产成本。
医疗手术机械臂在医疗领域的应用也越来越广泛。
机械臂可以用于精确的手术操作,如微创手术和脑外科手术。
机械臂能够提供快速、准确和稳定的操作,使医生能够进行更加精细的手术,减少手术时间和创伤,并提高手术成功率。
航天科研机械臂在航天科研中扮演着重要的角色。
宇航员通常难以进行一些艰苦或危险的任务,如太空站维修、卫星安装等。
机械臂可以在外太空环境中进行精确的操作,提供给宇航员必要的支持。
未来趋势随着人工智能、传感器技术和供应链的发展,机械臂的研究与发展也呈现出一些新的趋势。
人工智能人工智能技术的进步将使机械臂具备更智能化的能力。
机械臂可以通过学习和模仿人类动作来更好地完成任务。
此外,机械臂还可以通过数据分析和自主决策来提高运动的准确性和效率。
柔性机械臂柔性机械臂是近年来的一个研究热点。
摘要随着自动化生产程度的提高,PLC 在生产控制系统中的应用也越来越广泛。
本设计是基于西门子公司S7-300可编程控制器,设计了机械手臂PLC控制的自动控制系统。
该工艺过程主要是完成对电机的控制。
系统主要由变频器、转台电机、液压泵电机、采样头电机、输送机、破碎机、缩分机、收集器以及控制系统组成。
通过对系统主电路、控制电路设计,给出了机械手臂自动控制系统完整的硬件接线图和流程图。
根据机械手臂的生产工艺要求,设计并使用STEP 7编制了一套适用于该生产工艺的梯形图。
利用Simens公司的Wincc完成了机械手臂的监控界面。
本设计过程中涉及较多的开关量输入输出点,故选用配置灵活的模块式结构PLC 以提高系统的可靠性与处理效率。
关键词: S7-300;机械手臂;自动控制AbstractWith the improvement of automatic production, the PLC application in production control system is also more and more broad. This design based on the Siemens S7-300 programmable controller, PLC controlled robotic arm designed automatic control system. The key is to complete the process of motor control. System mainly consists of inverter, turntable motor, hydraulic pump motor, the sampling hea d and the motor, conveyor, crusher, reduced extension, the collector and the control system.Through the design of system main circuit and control circuit, gives the complete hardware of the control system wiring diagrams and flow charts.According to the mechanical arm's technique of production's request, Design and use STEP 7 for the preparation of a ladder in the production process. Wincc by Simens company completed a mechanical arm monitoring interface.This design involves more switches quantity input output spot, the simulation quantity input output spot, therefore selects input output disposition nimble module type structure PLC to enhance the system the reliability and the processing efficiency.Key Words:S7-300;Mechanical arm;Automatic control目录第一章绪论 (1)1.1设计背景 (1)1.2设计目的 (1)1.3国内外研究现状和趋势 (2)1.4设计原则 (3)第二章系统方案设计 (4)2.1设计依据 (4)2.2各部分功能分述 (5)2.2.1 采样过程 (5)2.2.2 制样过程 (5)2.3控制方案的比较、论证和确定 (5)2.3.1 方案的比较 (5)2.3.2 方案论证及确定 (8)2.4系统结构图 (9)第三章系统硬件设计 (10)3.1设计依据 (10)3.2硬件设计 (10)3.3电动机选型 (14)3.4变频器设计 (15)3.4.1 概述 (15)3.4.2 变频器分类 (15)3.4.3 变频器的组成、工作原理及控制方式 (15)3.4.4 变频器选择 (18)3.5硬件地址配置 (20)3.6控制系统模块选择 (22)3.6.1 设计依据 (22)3.6.2 S7-300系列PLC组成 (23)3.6.3 S7-300PLC特点 (24)3.6.4 模块选择 (24)第四章控制系统软件设计 (32)4.1软件设计分析 (32)4.2系统流程图 (32)4.3STEP7编程过程 (37)4.3.1 建立工程 (37)4.3.2 硬件配置 (37)4.3.3 STEP 7编程 (38)第五章组态画面设计 (40)5.1组态软件概述 (40)5.2WINCC的介绍 (40)5.3画面组态 (40)5.3.1 建立主界面 (40)5.3.2 建立手动控制界面 (41)5.3.3 动作过程 (42)第六章 S7-300与WINCC通讯 (43)总结 (46)参考文献 (47)英文翻译原文 (48)英文翻译译文 (60)致谢 (69)附录 (70)第一章绪论1.1 设计背景机械手是在自动化生产过程中使用的一种具有抓取和移动工件功能的自动化装置,它是在机械化、自动化生产过程中发展起来的一种新型装置。
机器人技术在食品加工与检测中的应用1. 引言食品安全一直是人们关注的重要问题。
为了确保食品的安全性和品质,机器人技术在食品加工与检测中发挥着越来越重要的作用。
本文将探讨机器人技术在食品加工与检测领域的应用,并分析其带来的优势和挑战。
2. 机器人在食品加工中的应用2.1 自动化生产线机器人在食品加工中可以实现生产线的自动化,提高生产效率和质量。
例如,机械臂可以精确地分拣食材和包装产品,减少了人为错误和污染的风险。
2.2 刀具替代利用机器人的高精度和智能性,可以用机器人替代人工操作危险的食品加工任务,如切割和去皮。
机器人可以减少工作人员的伤害风险,并提高切割的精确度和一致性。
2.3 调味和配料机器人可以根据特定的食谱和配料需求,准确地调味和加入配料。
这可以确保食物的口感和品质的一致性,并提高生产效率。
3. 机器人在食品检测中的应用3.1 质量控制机器人可以利用成像和传感技术,对食品进行精确的质量检测。
例如,机器视觉系统可以检测食品的颜色、大小和表面瑕疵,保证产品符合质量标准。
3.2 化学成分检测通过机器人技术,可以对食品进行化学成分的快速检测。
利用机器人的自动化和智能化,可以准确测量食品中的营养成分、重金属含量等,确保产品的安全性和合规性。
3.3 检测设备维护机器人还可以用于食品检测设备的维护和保养。
例如,机器人能够定期检查设备的运行状态,并及时发现和修复潜在故障,保证设备的稳定性和可靠性。
4. 机器人技术的优势与挑战4.1 优势机器人技术在食品加工与检测中的应用具有以下优势:- 提高生产效率和质量- 减少人员伤害和劳动强度- 确保食品的安全和合规性4.2 挑战然而,机器人技术在食品加工与检测中也面临一些挑战:- 技术成本较高- 对操作环境的要求较高- 需要解决机器人与人类工作协同的问题5. 结论随着食品安全问题的日益突出,机器人技术在食品加工与检测中的应用将变得越来越重要。
通过机器人技术的自动化和智能化,可以提高生产效率和质量,并保证食品的安全性和合规性。
机械臂发展情况汇报机械臂作为一种重要的工业自动化装备,近年来在各个领域得到了广泛的应用和发展。
本文将就机械臂的发展情况进行汇报,分析当前的发展趋势和未来的发展方向。
首先,机械臂在工业领域的应用越来越广泛。
传统的工业机械臂主要用于汽车制造、电子产品组装等领域,但随着人工智能和机器视觉技术的发展,机械臂已经开始在食品加工、医药制造、物流仓储等领域得到了广泛的应用。
特别是在电商物流领域,机械臂的应用可以大大提高物流效率,降低成本,受到了越来越多企业的青睐。
其次,机械臂的技术水平不断提高。
随着传感器、执行器、控制系统等关键技术的不断进步,机械臂的精度、灵活性和自主性能得到了大幅提升。
例如,柔性机械臂的出现使得机械臂可以更好地适应复杂的工作环境,同时,轻量化、高强度材料的应用也使得机械臂的负载能力得到了提升。
这些技术的突破为机械臂在更多领域的应用奠定了技术基础。
再次,机械臂的发展呈现出智能化和柔性化的趋势。
随着人工智能和大数据技术的不断发展,智能机械臂开始逐渐走进人们的生活。
智能机械臂可以通过学习和优化算法,更好地适应复杂的工作场景,并且可以实现与人类的协作,提高生产效率。
同时,柔性机械臂的出现也使得机械臂可以更好地适应不同的任务需求,实现多样化的应用。
最后,机械臂的发展面临着一些挑战和机遇。
一方面,随着机械臂的应用领域不断拓展,对机械臂的精度、安全性、成本等方面提出了更高的要求,这需要不断推动机械臂关键技术的创新和突破。
另一方面,随着我国制造业的转型升级,机械臂市场也面临着巨大的机遇,我国机械臂市场规模不断扩大,市场需求不断增长,这为机械臂产业的发展提供了广阔的空间。
综上所述,机械臂作为一种重要的工业自动化装备,其发展前景广阔。
随着技术的不断进步和市场需求的不断增长,相信机械臂在未来会有更加广阔的发展空间,带来更多的创新和应用。
我们将继续关注机械臂的发展动态,不断推动机械臂产业的创新和发展,为我国制造业的转型升级做出更大的贡献。
工业机器人在食品加工行业的应用与趋势工业机器人是指一种能够自动执行工业化生产任务的机器人。
随着科技的发展和人们对于生产效率和质量的要求不断提高,工业机器人在各个行业中的应用越来越广泛。
而在食品加工行业,工业机器人也扮演着越来越重要的角色。
本文将探讨工业机器人在食品加工行业中的应用以及未来的趋势。
一、工业机器人在食品加工行业的应用1.食品分拣与包装在食品加工过程中,分拣与包装是一个重要的环节。
传统的分拣与包装工作通常需要大量的人力投入,不仅成本高昂且效率低下。
而工业机器人在这方面具有天然的优势,通过配备视觉系统和灵活的机械臂,能够准确地分拣和包装各类食品,从而提高生产效率和降低成本。
2.食品加工与烹饪工业机器人还可以应用于食品的加工和烹饪过程。
通过编程和传感器技术,机器人能够根据不同的食品类型和加工要求进行精确的操作,确保食品的质量和口感。
例如,一些工业机器人可以自动切割、搅拌和烹饪食材,不仅提高了食品的制作效率,还确保了产品的一致性。
3.卫生与安全管理食品加工行业对于卫生和安全要求非常严格。
传统的加工过程中,人工操作可能会引入细菌或其他污染物。
而工业机器人可以实现无人操作,从而减少了人为因素对食品安全的影响。
此外,工业机器人还可以配备传感器来检测和监控食品加工过程中的污染物,确保食品的质量和安全。
二、工业机器人在食品加工行业的趋势1.智能化发展随着人工智能技术的发展,工业机器人在食品加工行业将更加智能化。
机器人将能够学习和适应不同的食品加工任务,并能在生产过程中做出实时的决策。
智能化工业机器人将能够提高食品加工的效率和精确度,进一步降低生产成本。
2.人机协作尽管工业机器人在食品加工行业中起到了重要作用,但仍有一些任务需要人的参与。
未来的趋势是建立人机协作的工作环境,让工业机器人与人类员工进行有效的合作。
通过人机协作,可以发挥机器人的高效率和精确度,同时充分发挥人类员工的创造力和灵活性。
3.个性化生产如今,消费者对于个性化和定制化产品的需求越来越高。
食品加工机械臂控制研究0.引言平行四边形机械手是由基座回转机构和一种全铰接、可实现两平动自由度的平行四边形机构组成,适合于轻工、电子等行业对轻小物料的中、短距离的高速抓取与搬运。
1.机械手结构设计与串联机构相比,并联机构具有刚度大、承载能力强、定位精度高、无积累误差、易于实现高速等优点,同时,可将驱动电机安装在机架上,以轻质细杆作为运动臂,这样不但可以降低机构的总体质量,而且末端动平台可以达到较高的速度和加速度。
平行四边形机械手是由主动支链、辅助支链和动平台组成,每个支链包含一个平行四边形结构,主动支链、辅助支链与动平台又构成一个平行四边形结构,这样可以保证动平台的姿态不变;动平台末端可以根据生产中的实际需要安装实现不同功能的手爪来操作轻质、小体积的物料。
行四边形机械手的性能指标如下:(1)结构形式:串并混联结构;(2)自由度数:3 个;(3)工作空间:(4)末端加速度:;末端速度:;末端负载:;2.机械手运动学模型机械手利用平行四边形结构的性质消除了末端动平台转动的自由度,这样动平台的姿态始终保持不变。
由于机械手运动过程中,两条辅助支链各杆件的运动规律与其相对应主动支链各杆件的运动规律相同,所以在进行机构分析时可简化为图2-4所示的等效机构。
建立机械手固定参考系O −XYZ ,如图2-4所示;其中X , Y ,Z表示末端动平台在O −XYZ 坐标系下的位置;θ1 ,θ2 表示驱动杆l1 ,l2 分别与X轴正方向的夹角,经推导可得到末端动平台位置正解:(2-1)将正解方程整理可得到位置逆解:(2-2)扩展到三维空间,增加一个变量,表示目标(x,y,z)在xy平面上的投影与z轴的夹角,arctg().这样原来二维的(x, y)拓展到三维空间后变为(,y),带入式(2-2),就可以得到三维位置逆解。
(2-3)经过测量,测得两臂长:L1=120.38+17.93=138.31mmL3=110.05+41.75=151.8mm若用数组theta[0],theta[1],theta[2]表示,,,也即三个电机的转角,用pos[0],pos[1],pos[2]分别表示目标坐标(x, y, z),则用c语言可以将逆解表示为theta[0]=acos((19044+pow(pos[0]/cos(atan(pos[2]/pos[0])),2)+pow(pos[1],2)-23043) /(276*sqrt(pow(pos[0]/cos(atan(pos[2]/pos[0])),2)+pow(pos[1],2))))+atan((pos[1]*co s(atan(pos[2]/pos[0])))/pos[0]);theta[1]=pi-acos((23043+pow(pos[0]/cos(atan(pos[2]/pos[0])),2)+pow(pos[1],2)-190 44)/(303*sqrt(pow(pos[0]/cos(atan(pos[2]/pos[0])),2)+pow(pos[1],2))))+atan((pos[1] *cos(atan(pos[2]/pos[0])))/pos[0]);theta[2]=atan(pos[2]/pos[0]);3.机械手运动控制机械手运动控制初步分为快速定位运动,直线运动,圆周运动三种运动。
更复杂的运动这里不做深入研究。
这里贴出为这三种运动控制所编的程序。
运动控制板选择Arduino UNO电路板,程序开发环境为Arduino IDE。
三中运动分开编程为:快速定位#include <Servo.h>Servo myservo1; //创建三个舵机控制对象Servo myservo2;Servo myservo3;#define pi 3.1415926 //定义piint pos[3]; //定义数组,存储输入x,y,zfloat theta[3]; //坐标转换为三个角度,单位为弧度float degree[3]; //单位为角度void setup(){Serial.begin(9600); //定义波特率myservo1.attach(9); // 该舵机由arduino第9脚控制myservo2.attach(10); // 该舵机由arduino第10脚控制myservo3.attach(11); // 该舵机由arduino第11脚控制}/*~~~~~~~~~~~~~~~~~~~~~~~~~~华丽的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~ */ void loop(){Serial.println("please insert x y z"); //输入提示delay(10000); //延迟10秒if(Serial.available()>0) //判断串口数据是否可用{for(int i=0;i<3;i++){pos[i]=Serial.parseInt(); //读入串口三个坐标值}theta[0]=acos((19044+pow(pos[0]/cos(atan(pos[2]/pos[0])),2)+pow(pos[1],2)-23043) /(276*sqrt(pow(pos[0]/cos(atan(pos[2]/pos[0])),2)+pow(pos[1],2))))+atan((pos[1]*co s(atan(pos[2]/pos[0])))/pos[0]); //theta[1]=pi-acos((23043+pow(pos[0]/cos(atan(pos[2]/pos[0])),2)+pow(pos[1],2)-190 44)/(303*sqrt(pow(pos[0]/cos(atan(pos[2]/pos[0])),2)+pow(pos[1],2))))+atan((pos[1] *cos(atan(pos[2]/pos[0])))/pos[0]);theta[2]=atan(pos[2]/pos[0]);for(int i=0;i<3;i++){degree[i]=theta[i]*180/pi;Serial.println(degree[i]);}myservo1.write(degree[0]-10);delay(30);myservo2.write(180-degree[1]);delay(30);myservo3.write(degree[2]);delay(30);}}画直线#include <Servo.h>Servo myservo1; //创建三个舵机控制对象Servo myservo2;Servo myservo3;#define pi 3.1415926float t;float pos[7];float theta[3];float degree[3];float deltax,deltay,deltaz;void setup(){Serial.begin(9600);myservo1.attach(9); // 该舵机由arduino第九脚控制myservo2.attach(10);myservo3.attach(11);}/*~~~~~~~~~~~~~~~~~~~~~~~~~~华丽的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~ */ void loop(){Serial.println("please insert x1 y1 z1 x2 y2 z2 v");delay(10000);if(Serial.available()>0){for(int i=0;i<7;i++){pos[i]=Serial.parseInt();}deltax=(pos[3]-pos[0])/90;deltay=(pos[4]-pos[1])/90;deltaz=(pos[5]-pos[2])/90;t=sqrt(pow(pos[0]-pos[3],2)+pow(pos[1]-pos[4],2)+pow(pos[2]-pos[5],2))/pos[6]; for(int i=0;i<90;i++){pos[0]=pos[0]+deltax;pos[1]=pos[1]+deltay;pos[2]=pos[2]+deltaz;theta[0]=acos((19044+pow(pos[0]/cos(atan(pos[2]/pos[0])),2)+pow(pos[1],2)-23043) /(276*sqrt(pow(pos[0]/cos(atan(pos[2]/pos[0])),2)+pow(pos[1],2))))+atan((pos[1]*co s(atan(pos[2]/pos[0])))/pos[0]);theta[1]=pi-acos((23043+pow(pos[0]/cos(atan(pos[2]/pos[0])),2)+pow(pos[1],2)-190 44)/(303*sqrt(pow(pos[0]/cos(atan(pos[2]/pos[0])),2)+pow(pos[1],2))))+atan((pos[1] *cos(atan(pos[2]/pos[0])))/pos[0]);theta[2]=atan(pos[2]/pos[0]);for(int j=0;j<3;j++){degree[j]=theta[j]*180/pi;}myservo1.write(degree[0]-10);myservo2.write(180-degree[1]);myservo3.write(degree[2]);delay(1000*t/90);}}}画圆代码Xy 平面#include <Servo.h>Servo myservo1; //创建三个舵机控制对象Servo myservo2;Servo myservo3;#define pi 3.1415926float t;float pos[5];float theta[3];float degree[3];void setup(){Serial.begin(9600);myservo1.attach(9); // 该舵机由arduino第九脚控制myservo2.attach(10);myservo3.attach(11);}/*~~~~~~~~~~~~~~~~~~~~~~~~~~华丽的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~ */ void loop(){Serial.println("please insert x y z r v");delay(10000);if(Serial.available()>0){for(int i=0;i<5;i++){pos[i]=Serial.parseInt();}t=2*pi*pos[3]/pos[4];for(int i=0;i<180;i++){theta[0]=acos((19044+pow((pos[0]+pos[3]*cos(0.03491*i))/cos(atan(pos[2]/(pos[0]+ pos[3]*cos(0.03491*i)))),2)+pow((pos[1]+pos[3]*sin(0.03491*i)),2)-23043)/(276*sqrt (pow((pos[0]+pos[3]*cos(0.03491*i))/cos(atan(pos[2]/(pos[0]+pos[3]*cos(0.03491*i) ))),2)+pow((pos[1]+pos[3]*sin(0.03491*i)),2))))+atan(((pos[1]+pos[3]*sin(0.03491*i))*cos(atan(pos[2]/(pos[0]+pos[3]*cos(0.03491*i)))))/(pos[0]+pos[3]*cos(0.03491*i))); theta[1]=pi-acos((23043+pow((pos[0]+pos[3]*cos(0.03491*i))/cos(atan(pos[2]/(pos[ 0]+pos[3]*cos(0.03491*i)))),2)+pow((pos[1]+pos[3]*sin(0.03491*i)),2)-19044)/(303* sqrt(pow((pos[0]+pos[3]*cos(0.03491*i))/cos(atan(pos[2]/(pos[0]+pos[3]*cos(0.0349 1*i)))),2)+pow((pos[1]+pos[3]*sin(0.03491*i)),2))))+atan(((pos[1]+pos[3]*sin(0.0349 1*i))*cos(atan(pos[2]/(pos[0]+pos[3]*cos(0.03491*i)))))/(pos[0]+pos[3]*cos(0.03491 *i)));theta[2]=atan(pos[2]/pos[0]);for(int j=0;j<3;j++){degree[j]=theta[j]*180/pi;}myservo1.write(degree[0]-10);myservo2.write(180-degree[1]);myservo3.write(degree[2]);delay(1000*t/180);}}}画圆Xz平面#include <Servo.h>Servo myservo1; //创建三个舵机控制对象Servo myservo2;Servo myservo3;#define pi 3.1415926float t;float pos[5];float theta[3];float degree[3];void setup(){Serial.begin(9600);myservo1.attach(9); // 该舵机由arduino第九脚控制myservo2.attach(10);myservo3.attach(11);}/*~~~~~~~~~~~~~~~~~~~~~~~~~~华丽的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~ */ void loop(){Serial.println("please insert x y z r v");delay(10000);if(Serial.available()>0){for(int i=0;i<5;i++){pos[i]=Serial.parseInt();}t=2*pi*pos[3]/pos[4];for(int i=0;i<180;i++){theta[0]=acos((19044+pow((pos[0]+pos[3]*cos(0.03491*i))/cos(atan((pos[2]+po s[3]*sin(0.03491*i))/(pos[0]+pos[3]*cos(0.03491*i)))),2)+pow(pos[1],2)-23043)/(276 *sqrt(pow((pos[0]+pos[3]*cos(0.03491*i))/cos(atan((pos[2]+pos[3]*sin(0.03491*i))/( pos[0]+pos[3]*cos(0.03491*i)))),2)+pow(pos[1],2))))+atan((pos[1]*cos(atan((pos[2]+ pos[3]*sin(0.03491*i))/(pos[0]+pos[3]*cos(0.03491*i)))))/(pos[0]+pos[3]*cos(0.0349 1*i)));theta[1]=pi-acos((23043+pow((pos[0]+pos[3]*cos(0.03491*i))/cos(atan((pos[2]+pos[ 3]*sin(0.03491*i))/(pos[0]+pos[3]*cos(0.03491*i)))),2)+pow(pos[1],2)-19044)/(303*s qrt(pow((pos[0]+pos[3]*cos(0.03491*i))/cos(atan((pos[2]+pos[3]*sin(0.03491*i))/(p os[0]+pos[3]*cos(0.03491*i)))),2)+pow(pos[1],2))))+atan((pos[1]*cos(atan((pos[2]+p os[3]*sin(0.03491*i))/(pos[0]+pos[3]*cos(0.03491*i)))))/(pos[0]+pos[3]*cos(0.03491 *i)));theta[2]=atan((pos[2]+pos[3]*sin(0.03491*i))/(pos[0]+pos[3]*cos(0.03491*i))); for(int j=0;j<3;j++){degree[j]=theta[j]*180/pi;}myservo1.write(degree[0]-10);myservo2.write(180-degree[1]);myservo3.write(degree[2]);delay(1000*t/180);}}}画圆Yz平面#include <Servo.h>Servo myservo1; //创建三个舵机控制对象Servo myservo2;Servo myservo3;#define pi 3.1415926float t;float pos[5];float theta[3];float degree[3];void setup(){Serial.begin(9600);myservo1.attach(9); // 该舵机由arduino第九脚控制myservo2.attach(10);myservo3.attach(11);}/*~~~~~~~~~~~~~~~~~~~~~~~~~~华丽的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~ */ void loop(){Serial.println("please insert x y z r v");delay(10000);if(Serial.available()>0){for(int i=0;i<5;i++){pos[i]=Serial.parseInt();}t=2*pi*pos[3]/pos[4];for(int i=0;i<180;i++){theta[0]=acos((19044+pow(pos[0]/cos(atan((pos[2]+pos[3]*cos(0.03491*i))/pos [0])),2)+pow((pos[1]+pos[3]*sin(0.03491*i)),2)-23043)/(276*sqrt(pow(pos[0]/cos(ata n((pos[2]+pos[3]*cos(0.03491*i))/pos[0])),2)+pow((pos[1]+pos[3]*sin(0.03491*i)),2)) ))+atan(((pos[1]+pos[3]*sin(0.03491*i))*cos(atan((pos[2]+pos[3]*cos(0.03491*i))/po s[0])))/pos[0]);theta[1]=pi-acos((23043+pow(pos[0]/cos(atan((pos[2]+pos[3]*cos(0.03491*i))/pos[0 ])),2)+pow((pos[1]+pos[3]*sin(0.03491*i)),2)-19044)/(303*sqrt(pow(pos[0]/cos(atan( (pos[2]+pos[3]*cos(0.03491*i))/pos[0])),2)+pow((pos[1]+pos[3]*sin(0.03491*i)),2)))) +atan(((pos[1]+pos[3]*sin(0.03491*i))*cos(atan((pos[2]+pos[3]*cos(0.03491*i))/pos[ 0])))/pos[0]);theta[2]=atan((pos[2]+pos[3]*cos(0.03491*i))/pos[0]);for(int j=0;j<3;j++){degree[j]=theta[j]*180/pi;}myservo1.write(degree[0]-10);myservo2.write(180-degree[1]);myservo3.write(degree[2]);delay(1000*t/180);}}}如果用G代码控制,G代码及其含义如下所示G00X_Y_Z_ 快速定位到坐标X_Y_Z_G01X_Y_Z_ 从当前位置直线运动到坐标X_Y_Z_G02X_Y_Z_R_ 以X_Y_Z_为圆心,以R_为半径做顺时针圆周运动G03X_Y_Z_R_ 以X_Y_Z_为圆心,以R_为半径做逆时针圆周运动G17 选择xy平面G18 选择xz平面G19 选择yz平面#include <Servo.h>Servo myservo1; //创建三个舵机控制对象Servo myservo2;Servo myservo3;#define pi 3.1415926int X0,Y0,Z0; //定义三个坐标变量float pos[7]; //定义数组,存储输入x,y,zfloat theta[3]; //坐标转换为三个角度,单位为弧度float degree[3]; //单位为角度float deltax,deltay,deltaz,t; //定义三个坐标增量void setup(){Serial.begin(9600); //定义传输速率myservo1.attach(9); // 该舵机由arduino第9脚控制myservo2.attach(10); // 该舵机由arduino第10脚控制myservo3.attach(11); //该舵机由arduino第11脚控制}void loop() {Serial.println("please insert G code"); //输入提示delay(6000); //延迟6秒while(Serial.available()>0){ //接收数据int val= Serial.read(); // 将第一个读入数据记为valif (-1 != val) {if ('G' == val){ //判断第一个数据是否为G字符delay(2); //延迟2毫秒int g=Serial.parseInt(); //将第二个数据读入记为gswitch (g){ //判断g的值/*~~~~~~~~~~~~~~~~~~~~~快速定位~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/case 00: //如果g为0,即输入为G00for(int i=0; i<3; i++){ // 读入三个坐标(x,y,z)并存放到(X0,Y0,Z0)val= Serial.read();if('X'== val){X0 = Serial.parseInt();}else if('Y'==val){Y0 = Serial.parseInt();}else if('Z'==val){Z0 = Serial.parseInt();}}pos[0]=X0; //将三个坐标赋予数组pos[1]=Y0;pos[2]=Z0;theta[0]=acos((19044+pow(pos[0]/cos(atan(pos[2]/pos[0])),2)+pow(pos[1],2)-23043) /(276*sqrt(pow(pos[0]/cos(atan(pos[2]/pos[0])),2)+pow(pos[1],2))))+atan((pos[1]*co s(atan(pos[2]/pos[0])))/pos[0]); //计算三个角度theta[1]=pi-acos((23043+pow(pos[0]/cos(atan(pos[2]/pos[0])),2)+pow(pos[1],2)-190 44)/(303*sqrt(pow(pos[0]/cos(atan(pos[2]/pos[0])),2)+pow(pos[1],2))))+atan((pos[1] *cos(atan(pos[2]/pos[0])))/pos[0]);theta[2]=atan(pos[2]/pos[0]);for(int i=0;i<3;i++) //将弧度转为度{degree[i]=theta[i]*180/pi;Serial.println(degree[i]);}myservo1.write(degree[0]-10);//驱动三个电机转动相应角度delay(30);myservo2.write(180-degree[1]);delay(30);myservo3.write(degree[2]);delay(30);break; //跳出/*~~~~~~~~~~~~~~~~~~~~~~~~~~~直线运动~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/case 01: //如果g为1,即输入为G01for(int i=0; i<3; i++){ // 读入三个终点坐标(x,y,z)并存放到(pos[3],pos[4],pos[5])val= Serial.read();if('X'== val){pos[3] = Serial.parseInt();}else if('Y'==val){pos[4] = Serial.parseInt();}else if('Z'==val){pos[5] = Serial.parseInt();}}deltax=(pos[3]-X0)/90; //终点坐标减去起始坐标,分为90等份deltay=(pos[4]-Y0)/90;deltaz=(pos[5]-Z0)/90;pos[0]=X0; //将起始坐标(X0,Y0,Z0)存入(pos[0],pos[1],pos[2])pos[1]=Y0;pos[2]=Z0;for(int i=0;i<90;i++) //从起始坐标开始,每次运动一个等份,运动90次{pos[0]=pos[0]+deltax; //每次比上次多运动一个等份位移pos[1]=pos[1]+deltay;pos[2]=pos[2]+deltaz;theta[0]=acos((19044+pow(pos[0]/cos(atan(pos[2]/pos[0])),2)+pow(pos[1],2)-23043) /(276*sqrt(pow(pos[0]/cos(atan(pos[2]/pos[0])),2)+pow(pos[1],2))))+atan((pos[1]*co s(atan(pos[2]/pos[0])))/pos[0]); //计算出当前位置下的角度theta[1]=pi-acos((23043+pow(pos[0]/cos(atan(pos[2]/pos[0])),2)+pow(pos[1],2)-190 44)/(303*sqrt(pow(pos[0]/cos(atan(pos[2]/pos[0])),2)+pow(pos[1],2))))+atan((pos[1] *cos(atan(pos[2]/pos[0])))/pos[0]);theta[2]=atan(pos[2]/pos[0]);for(int j=0;j<3;j++) //将弧度转化为角度{degree[j]=theta[j]*180/pi;}myservo1.write(degree[0]-10); //驱动三个电机转相应角度myservo2.write(180-degree[1]);myservo3.write(degree[2]);delay(30);}break; //跳出/*~~~~~~~~~~~~~~~~~~~~~~圆周运动~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*//*~~~~~~~~~~~~~~~~~~~~~~xy平面内圆周运动~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/case 17: //如果g为17,即输入为G17val= Serial.read(); //读入第三个数据记为valif ('G' == val){ //如果第三个数据是G字符delay(2); //延迟两毫秒int g2=Serial.parseInt(); //读入第四个数据记为g2switch (g2){ //判断g2的值/*~~~~~~~~~~~~~~~~~~~~~~xy平面内顺势针圆周运动~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/case 02: //如果g2为02即输入为G17G02for(int i=0; i<4; i++){ //读入圆心坐标值(X,Y,Z)和半径R,并存放于pos[0]~pos[3]val= Serial.read();if('X'== val){pos[0] = Serial.parseInt();}else if('Y'==val){pos[1] = Serial.parseInt();}else if('Z'==val){pos[2] = Serial.parseInt();}else if('R'==val){pos[3]= Serial.parseInt();}}for(int i=180;i>0;i--){ //从360度走到0度,将圆周分为180份,每次循环走一份theta[0]=acos((19044+pow((pos[0]+pos[3]*cos(0.03491*i))/cos(atan(pos[2]/(pos[0]+ pos[3]*cos(0.03491*i)))),2)+pow((pos[1]+pos[3]*sin(0.03491*i)),2)-23043)/(276*sqrt (pow((pos[0]+pos[3]*cos(0.03491*i))/cos(atan(pos[2]/(pos[0]+pos[3]*cos(0.03491*i) ))),2)+pow((pos[1]+pos[3]*sin(0.03491*i)),2))))+atan(((pos[1]+pos[3]*sin(0.03491*i)) *cos(atan(pos[2]/(pos[0]+pos[3]*cos(0.03491*i)))))/(pos[0]+pos[3]*cos(0.03491*i))); //计算此位置对应的角度theta[1]=pi-acos((23043+pow((pos[0]+pos[3]*cos(0.03491*i))/cos(atan(pos[2]/(pos[ 0]+pos[3]*cos(0.03491*i)))),2)+pow((pos[1]+pos[3]*sin(0.03491*i)),2)-19044)/(303* sqrt(pow((pos[0]+pos[3]*cos(0.03491*i))/cos(atan(pos[2]/(pos[0]+pos[3]*cos(0.0349 1*i)))),2)+pow((pos[1]+pos[3]*sin(0.03491*i)),2))))+atan(((pos[1]+pos[3]*sin(0.0349 1*i))*cos(atan(pos[2]/(pos[0]+pos[3]*cos(0.03491*i)))))/(pos[0]+pos[3]*cos(0.03491 *i)));theta[2]=atan(pos[2]/pos[0]);for(int j=0;j<3;j++) //将弧度转为角度{degree[j]=theta[j]*180/pi;}myservo1.write(degree[0]-10); //驱动电机转动相应角度myservo2.write(180-degree[1]);myservo3.write(degree[2]);}break; //跳出/*~~~~~~~~~~~~~~~~~~~~~~xy平面内逆势针圆周运动~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/case 03:for(int i=0; i<4; i++){val= Serial.read();if('X'== val){pos[0] = Serial.parseInt();}else if('Y'==val){pos[1] = Serial.parseInt();}else if('Z'==val){pos[2] = Serial.parseInt();}else if('R'==val){pos[3]= Serial.parseInt();}}for(int i=0;i<180;i++){ //从0度走到360度,将圆周分为180份,每次循环走一份theta[0]=acos((19044+pow((pos[0]+pos[3]*cos(0.03491*i))/cos(atan(pos[2]/(pos[0]+ pos[3]*cos(0.03491*i)))),2)+pow((pos[1]+pos[3]*sin(0.03491*i)),2)-23043)/(276*sqrt (pow((pos[0]+pos[3]*cos(0.03491*i))/cos(atan(pos[2]/(pos[0]+pos[3]*cos(0.03491*i) ))),2)+pow((pos[1]+pos[3]*sin(0.03491*i)),2))))+atan(((pos[1]+pos[3]*sin(0.03491*i)) *cos(atan(pos[2]/(pos[0]+pos[3]*cos(0.03491*i)))))/(pos[0]+pos[3]*cos(0.03491*i))); theta[1]=pi-acos((23043+pow((pos[0]+pos[3]*cos(0.03491*i))/cos(atan(pos[2]/(pos[ 0]+pos[3]*cos(0.03491*i)))),2)+pow((pos[1]+pos[3]*sin(0.03491*i)),2)-19044)/(303* sqrt(pow((pos[0]+pos[3]*cos(0.03491*i))/cos(atan(pos[2]/(pos[0]+pos[3]*cos(0.0349 1*i)))),2)+pow((pos[1]+pos[3]*sin(0.03491*i)),2))))+atan(((pos[1]+pos[3]*sin(0.0349 1*i))*cos(atan(pos[2]/(pos[0]+pos[3]*cos(0.03491*i)))))/(pos[0]+pos[3]*cos(0.03491 *i)));theta[2]=atan(pos[2]/pos[0]);for(int j=0;j<3;j++){degree[j]=theta[j]*180/pi;}myservo1.write(degree[0]-10);myservo2.write(180-degree[1]);myservo3.write(degree[2]);}break;}}break;/*~~~~~~~~~~~~~~~~~~~~~xz平面内圆周运动~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/case 18: //如果g为18,即输入为G18val= Serial.read(); //读入第三个数据记为valif ('G' == val){ //如果第三个数据是G字符delay(2); //延迟两毫秒int g2=Serial.parseInt(); //读入第四个数据记为g2switch (g2){ //判断g2的值/*~~~~~~~~~~~~~~~~~~~~~xz平面内顺时针圆周运动~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/case 02: //如果g2为02即输入为G18G02for(int i=0; i<4; i++){ //读入圆心坐标值(X,Y,Z)和半径R,并存放于pos[0]~pos[3]val= Serial.read();if('X'== val){pos[0] = Serial.parseInt();}else if('Y'==val){pos[1] = Serial.parseInt();}else if('Z'==val){pos[2] = Serial.parseInt();}else if('R'==val){pos[3]= Serial.parseInt();}}for(int i=180;i>0;i--){ //从360度走到0度,将圆周分为180份,每次循环走一份theta[0]=acos((19044+pow((pos[0]+pos[3]*cos(0.03491*i))/cos(atan((pos[2]+pos[3]* sin(0.03491*i))/(pos[0]+pos[3]*cos(0.03491*i)))),2)+pow(pos[1],2)-23043)/(276*sqrt (pow((pos[0]+pos[3]*cos(0.03491*i))/cos(atan((pos[2]+pos[3]*sin(0.03491*i))/(pos[ 0]+pos[3]*cos(0.03491*i)))),2)+pow(pos[1],2))))+atan((pos[1]*cos(atan((pos[2]+pos[ 3]*sin(0.03491*i))/(pos[0]+pos[3]*cos(0.03491*i)))))/(pos[0]+pos[3]*cos(0.03491*i)) ); //计算当前位置对应的角度theta[1]=pi-acos((23043+pow((pos[0]+pos[3]*cos(0.03491*i))/cos(atan((pos[2]+pos[3]*sin(0.03491*i))/(pos[0]+pos[3]*cos(0.03491*i)))),2)+pow(pos[1],2)-19044)/(303*s qrt(pow((pos[0]+pos[3]*cos(0.03491*i))/cos(atan((pos[2]+pos[3]*sin(0.03491*i))/(p os[0]+pos[3]*cos(0.03491*i)))),2)+pow(pos[1],2))))+atan((pos[1]*cos(atan((pos[2]+p os[3]*sin(0.03491*i))/(pos[0]+pos[3]*cos(0.03491*i)))))/(pos[0]+pos[3]*cos(0.03491 *i)));theta[2]=atan((pos[2]+pos[3]*sin(0.03491*i))/(pos[0]+pos[3]*cos(0.03491*i)));for(int j=0;j<3;j++) //将弧度转为角度{degree[j]=theta[j]*180/pi;}myservo1.write(degree[0]-10); //驱动电机转动相应角度myservo2.write(180-degree[1]);myservo3.write(degree[2]);delay(30);}break; //跳出/*~~~~~~~~~~~~~~~~~~~~~xz平面内逆时针圆周运动~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/case 03:for(int i=0; i<4; i++){val= Serial.read();if('X'== val){pos[0] = Serial.parseInt();}else if('Y'==val){pos[1] = Serial.parseInt();}else if('Z'==val){pos[2] = Serial.parseInt();}else if('R'==val){pos[3]= Serial.parseInt();}}for(int i=0;i<180;i++){ //从0度走到360度,将圆周分为180份,每次循环走一份theta[0]=acos((19044+pow((pos[0]+pos[3]*cos(0.03491*i))/cos(atan((pos[2]+pos[3]* sin(0.03491*i))/(pos[0]+pos[3]*cos(0.03491*i)))),2)+pow(pos[1],2)-23043)/(276*sqrt (pow((pos[0]+pos[3]*cos(0.03491*i))/cos(atan((pos[2]+pos[3]*sin(0.03491*i))/(pos[ 0]+pos[3]*cos(0.03491*i)))),2)+pow(pos[1],2))))+atan((pos[1]*cos(atan((pos[2]+pos[ 3]*sin(0.03491*i))/(pos[0]+pos[3]*cos(0.03491*i)))))/(pos[0]+pos[3]*cos(0.03491*i)) );theta[1]=pi-acos((23043+pow((pos[0]+pos[3]*cos(0.03491*i))/cos(atan((pos[2]+pos[ 3]*sin(0.03491*i))/(pos[0]+pos[3]*cos(0.03491*i)))),2)+pow(pos[1],2)-19044)/(303*s qrt(pow((pos[0]+pos[3]*cos(0.03491*i))/cos(atan((pos[2]+pos[3]*sin(0.03491*i))/(p os[0]+pos[3]*cos(0.03491*i)))),2)+pow(pos[1],2))))+atan((pos[1]*cos(atan((pos[2]+p os[3]*sin(0.03491*i))/(pos[0]+pos[3]*cos(0.03491*i)))))/(pos[0]+pos[3]*cos(0.03491 *i)));theta[2]=atan((pos[2]+pos[3]*sin(0.03491*i))/(pos[0]+pos[3]*cos(0.03491*i)));for(int j=0;j<3;j++){degree[j]=theta[j]*180/pi;}myservo1.write(degree[0]-10);myservo2.write(180-degree[1]);myservo3.write(degree[2]);delay(30);}break;}}break;/*~~~~~~~~~~~~~~~~~~~~~~yz平面内圆周运动~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/case 19: //如果g为19,即输入为G19val= Serial.read(); //读入第三个数据记为valif ('G' == val){ //如果val是G字符delay(2); //延迟两毫秒int g2=Serial.parseInt(); //读入第四个数据记为g2switch (g2){ //判断g2的值/*~~~~~~~~~~~~~~~~~~~~~~yz平面内顺时针圆周运动~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/case 02: //输入为G19G02for(int i=0; i<4; i++){val= Serial.read();if('X'== val){pos[0] = Serial.parseInt();}else if('Y'==val){pos[1] = Serial.parseInt();}else if('Z'==val){pos[2] = Serial.parseInt();}else if('R'==val){pos[3]= Serial.parseInt();}}for(int i=180;i>0;i--){theta[0]=acos((19044+pow(pos[0]/cos(atan((pos[2]+pos[3]*cos(0.03491*i))/pos[0])), 2)+pow((pos[1]+pos[3]*sin(0.03491*i)),2)-23043)/(276*sqrt(pow(pos[0]/cos(atan((p os[2]+pos[3]*cos(0.03491*i))/pos[0])),2)+pow((pos[1]+pos[3]*sin(0.03491*i)),2))))+a tan(((pos[1]+pos[3]*sin(0.03491*i))*cos(atan((pos[2]+pos[3]*cos(0.03491*i))/pos[0] )))/pos[0]);theta[1]=pi-acos((23043+pow(pos[0]/cos(atan((pos[2]+pos[3]*cos(0.03491*i))/pos[0 ])),2)+pow((pos[1]+pos[3]*sin(0.03491*i)),2)-19044)/(303*sqrt(pow(pos[0]/cos(atan( (pos[2]+pos[3]*cos(0.03491*i))/pos[0])),2)+pow((pos[1]+pos[3]*sin(0.03491*i)),2)))) +atan(((pos[1]+pos[3]*sin(0.03491*i))*cos(atan((pos[2]+pos[3]*cos(0.03491*i))/pos[ 0])))/pos[0]);theta[2]=atan((pos[2]+pos[3]*cos(0.03491*i))/pos[0]);for(int j=0;j<3;j++){degree[j]=theta[j]*180/pi;}myservo1.write(degree[0]-10);myservo2.write(180-degree[1]);myservo3.write(degree[2]);delay(30);}break;/*~~~~~~~~~~~~~~~~~~~~~~yz平面内逆时针圆周运动~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/case 03: //输入为G19G03for(int i=0; i<4; i++){val= Serial.read();if('X'== val){pos[0] = Serial.parseInt();}else if('Y'==val){pos[1] = Serial.parseInt();}else if('Z'==val){pos[2] = Serial.parseInt();}else if('R'==val){pos[3]= Serial.parseInt();}}for(int i=0;i<180;i++){theta[0]=acos((19044+pow(pos[0]/cos(atan((pos[2]+pos[3]*cos(0.03491*i))/pos[0])), 2)+pow((pos[1]+pos[3]*sin(0.03491*i)),2)-23043)/(276*sqrt(pow(pos[0]/cos(atan((p os[2]+pos[3]*cos(0.03491*i))/pos[0])),2)+pow((pos[1]+pos[3]*sin(0.03491*i)),2))))+a tan(((pos[1]+pos[3]*sin(0.03491*i))*cos(atan((pos[2]+pos[3]*cos(0.03491*i))/pos[0] )))/pos[0]);theta[1]=pi-acos((23043+pow(pos[0]/cos(atan((pos[2]+pos[3]*cos(0.03491*i))/pos[0 ])),2)+pow((pos[1]+pos[3]*sin(0.03491*i)),2)-19044)/(303*sqrt(pow(pos[0]/cos(atan( (pos[2]+pos[3]*cos(0.03491*i))/pos[0])),2)+pow((pos[1]+pos[3]*sin(0.03491*i)),2)))) +atan(((pos[1]+pos[3]*sin(0.03491*i))*cos(atan((pos[2]+pos[3]*cos(0.03491*i))/pos[ 0])))/pos[0]);theta[2]=atan((pos[2]+pos[3]*cos(0.03491*i))/pos[0]);for(int j=0;j<3;j++){degree[j]=theta[j]*180/pi;}myservo1.write(degree[0]-10);myservo2.write(180-degree[1]);myservo3.write(degree[2]);delay(30);}break;}}break;/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/}}}}}。