机器谱

S104】骨科手术机器人

图文展示3264(1)

图文展示3264(1)

副标题

作品说明

作者:潘家豪 崔峰 江龙龙 谭远国

单位:重庆理工大学

1. 项目背景

      机器人在医疗领域有极其重要的应用,然而研发能实际应用的机器人是有相当难度的,研发医疗领域能实际应用的机器人更难。我国进口医疗器械每年近千亿元,尤其是医疗手术机器人价格昂贵,(进口的达芬奇手术机器人每台的价格高达2千多万元)。因此我国自主研发实际应用的医疗机器人迫在眉睫并具有长远的战略意义。目前中国正在建立上海、昆山、天津、沈阳、哈尔滨、青岛、广州、芜湖、常州、厦门十大机器人产业园,大力发展机器人产业。

2. 项目意义

      骨科手术在辐射环境下进行,医生在手术时极其需要机器人的辅助;同时,脊柱等骨头周边往往布满神经中枢,医生任何一个意外的手指抖动都可能带来巨大风险或严重后果,骨科手术机器人操作的精确性、稳定性超过经验丰富的骨外科医生,已经得到医疗界及患者的认可。因此,骨科手术机器人是当前机器人研究领域的热点。例如骨科手术机器人术前将患者的影像资料如X光片、CT、核磁共振等影像进行叠加分析计算,手术定位更精准,与手术导航系统相结合,医生制定手术路径,术中根据C型臂X线机影像调整机器人钻头等末端器械的位置和力量,机器人完成打孔等手术动作。

3. 作品功能

      本作品的创作灵感源自于目前医院里实际操作的一种方法。在折骨上打三个孔,在体外横向装一根不锈钢板,三个不锈钢螺丝从体外经不锈钢柱旋入骨中,折骨即固定了,两个月左右无须重创就可将螺丝拧出,免除了某些骨折患者需两次大手术的痛苦安装和取出钢钉、钢板),破坏骨折部位血运,使其不易愈合。

      本项目的机器人模拟骨科骨科定位手术进行定点打孔,由于真真的在打孔的时候对机器人的一些部件的硬度要求非常的高,而我们机器人的转头又只有1.5毫米,转头在打孔的时候比较喜欢断。所以我们准备的模拟骨头(亚克力板)是预先打好孔的,这样一来对机器人的精度要求是非常高的。机器人需要在预先已经打好孔的模拟骨头(亚克力板)上,使机械臂自动定位,精准完成打孔。

4. 制作过程简介

      由于在现实中我们需要打的孔不可能总会在一条笔直的直线上。有时候需要打的空在一个二维的平面上。那么就需要机械臂能在一个二维的平面上进行移动来寻找打孔点。要想在一个二维平面上进行移动就需要一个驱动模块在X轴上来移动还需要另外一个Y轴上移动。这样我们在做机器人的移动模块时就有了一些分歧。下面我来介绍一下我们想过的一些设计方案。

      方案一:X轴上的驱动模块和Y轴上的驱动模块是相互独立的。X轴上的驱动模块在移动的时候Y轴上的驱动模块是不移动的。我们将机械臂固定在X上,将病人固定在Y轴上。这个方案在实现起来的好处是在编程的时候考虑的方面会少一点,而且机械臂的固定也比较的容易。但是有一个缺点,在打孔的时候病人会移动,这可能对病人造成一定的伤害。

      方案二:Y轴上的驱动模块固定在X轴上。X轴在移动的时候Y也就在移动了。当在X轴上的移动距离达到后,Y轴就开始移动。这就增加了我们在模型设计上的难度。

5. 示例程序

作品说明

#include<reg52.h>

#define uchar unsigned char

#define uint   unsigned int

/**********************************************

引脚定义

**********************************************/

sbit Enable_A=P1^1;   

sbit Direction_A=P1^2;

sbit PulseSignal_A=P1^3;

sbit Enable_B=P1^4;   

sbit Direction_B=P1^5;

sbit PulseSignal_B=P1^6;

sbit IN_1 = P2^6;

sbit IN_2 = P2^7;

sbit s1 = P2^0;

sbit s2 = P2^1;

sbit s3 = P2^2;

sbit s4 = P2^3;

sbit s5 = P2^4;

sbit s6 = P2^5;

unsigned int temp;

unsigned int flag,t;

/*********************************************

延时函数

**********************************************/

void delay(uint xms)

{

uint j,k;

for(j=xms;j>0;j--)

for(k=110;k>0;k--);

}

void delay_1(uint xms)

{

uint j;

for(j=xms;j>0;j--);

//for(k=110;k>0;k--);

}

void begin()

{

IN_1 = 0;

IN_2 = 0;

delay(6000);

IN_1 = 1;

IN_2 = 0;


Direction_A = 1;   

Enable_A = 1;

for(t = 20000;t!=0;t--)

{

PulseSignal_A=~PulseSignal_A;

delay_1(8);

}

Enable_A = 0;

Direction_B = 1;

Enable_B = 1;

for(t =64000;t > 0;t--)

{

PulseSignal_B =~PulseSignal_B;

delay_1(4);

}

for(t = 1920;t!=0;t--)

{

PulseSignal_B =~PulseSignal_B;

delay_1(4);

}

Enable_B = 0;

Direction_A = 0;

Enable_A = 1;

for(t = 20000;t!=0;t--)

{

PulseSignal_A=~PulseSignal_A;

delay_1(8);

}

Enable_A = 0;

IN_1 = 0;

IN_2 = 0;

delay(6000);

IN_1 = 1;

IN_2 = 0;

Direction_A = 1;  

Enable_A = 1;

for(t = 20000;t!=0;t--)

{

PulseSignal_A=~PulseSignal_A;

delay_1(8);

}

Enable_A = 0;  

Direction_B = 1;

Enable_B = 1;

for(t = 33920;t!=0;t--)

{

PulseSignal_B =~PulseSignal_B;

delay_1(4);

}

Enable_B = 0;

Direction_A = 0;  

Enable_A = 1;

for(t = 20000;t!=0;t--)

{

PulseSignal_A=~PulseSignal_A;

delay_1(8);

}

Enable_A = 0;

IN_1 = 0;

IN_2 = 0;

delay(6000);

IN_1 = 1;

IN_2 = 0;

Direction_A = 1;  

Enable_A = 1;

for(t = 20000;t!=0;t--)

{

PulseSignal_A=~PulseSignal_A;

delay_1(8);

}

Enable_A = 0;


6. 作品展示

* 本项目未获得作者开源授权,无法提供资料下载

© 2022 机器时代(北京)科技有限公司  版权所有
机器谱——机器人共享方案网站
学习  开发  设计  应用