作者:孙运通 黄善越 卢瑀 张宇峰 郑乐怡
单位:河海大学
指导老师:陆其清
人口老龄化始终是我国一个极为严峻的社会问题。独居老人和空巢老人占总人口比重日益提高:预计至2050年老龄人口占比将超20%,绝大部分城市和地区将进入深度老龄化[1]。加之城市生活节奏的加快,当代青年的生活压力“此消彼长”,照顾老年人同时也是我们义不容辞的责任和义务,因此如何高效照顾行动不便的老年人成为亟需解决的社会问题。我们研究并制作了一款基于多模块融合技术面向残障人士的家用服务型机器人,该装置可实现定时递送药物和其他生活必需品、远程辅助取物、室内地面清洁等功能,此外装置搭载了蓝牙模块,语音模块和相应一系列传感器,可以实现自动控制、手机遥控、语音控制,本作品结构可靠紧凑,生产成本低,基本可以满足老年人的生活所需,填补了相应的市场空白。
人口老龄化是我国乃至世界所面临的严峻课题与困难挑战,现如今如何高效照顾老人是当代年轻人所要面临的一大难题,既能尽到赡养的义务又能减轻照看负担,提高生活水平似乎是一两难的局面,大部分年轻人选择雇佣临时工来照看行动不便的老人,辅助他们按时吃饭吃药,但高昂的佣金与信任危机又会引发新的矛盾。
大部分老年人面临着行动不便,没有明确的时间观念,记忆力较差等困难,这会致使他们忘记按时吃药,难以获得需要的生活品等。
经广泛市场调研,我们找到了目前市面上常见的两类家用服务机器人并对其功能进行简要分析。
① 移乘护理机器人。共有特点为能够驼载老人在室内移动。能够将行动不便的老人载送至预定的位置,灵活性高,结构简单,理论完善。但缺点也很明显:无法帮助老人分辨需要的药品,制作成本高,因为需要搭乘在机器人上所以对老人的行动能力有一定要求。根据其优缺点可做出对应雷达图。
② 智能交互机器人。智能度高,灵活性高,可以与老年人进行高度互动。但是此类机器人成本高且功能单一,仅能起到陪伴作用。
目前针对老年人和残障人士的家用服务机器人市场缺口大,现有的产品也面临着功能单一,制造成本高昂,使用复杂等问题,并不能很好的契合老年人的生活难点和需求。因此需要设计一款更贴合老年人需求的家用服务机器人,其初衷在于帮助老人解决生活难题,后扩展到智能家具领域以适应更广泛的场景。
随着社会不断发展,机器人产业逐渐向家用,民用过渡。服务机器人这一领域也是当下的热门研究领域之一,国内外的研究与成果都在逐步完善该领域的缺口。早在2021年1月,三星就发布了一款可以实现生活助理和简单家务功能的机器人[3]。2021年9月,亚马逊也相继宣布推出名为Astro的家用机器人,可以实现视频通话、安全监控、物品移送等功能。得益于各种传感器技术的成熟,服务机器人可以拥有更多的功能以适应不同的环境。
经过广泛的市场调研,我们发现人们对家用服务机器人的选择倾向于以下方面:尺寸方面、功能方面、操作方面、价格方面、安全方面。
尺寸方面:家用服务机器人体积小,重量轻,易于搬运。
功能方面:功能丰富,能够辅助行动不便的老人的日常所需。
操作方面:易于上手,可直接使用APP远程操作。
价格方面:在功能完善的前提下尽可能降低成本,使其适应广泛民众的消水平。
安全方面:全程自动化完成,发生故障自行中断,安全性要高。
通过分析,该装置应具有以下特点:
① 操作简单,易于老年人的理解和应用,同时也为其他家庭成员提供了控制装置的方案。
② 能够定时向老年人递送需要的药物,可以帮助行动不便的老人远程取物,同时机器人应具有较高的智能,能够分辨老人不同时段需要的药品。
③ 针对当前家用养老服务机器人的不足进行对应的机构和程序设计,不易于操作是其中最大的缺陷,所以该方面工作需要着重解决。
家用服务机器人主要针对所要解决的问题进行机构设计,本作品主要设计了抓取机构、顶升机构、收纳机构、行走机构并拟定了总体控制方案。
抓取机构主要分为机械钳爪式和吸附式。吸附式又有真空吸附式和磁力吸附式之分,考虑到吸附式对硬件要求较高不符合设计初衷,为此我们改用机械钳爪式,参考拨杆杠杆式钳爪,设计了相应机构。其目的在于准确识别并抓取指定药品放置在载物平台上。
顶升机构最为常用的有丝杠螺母机构和剪叉机构。丝杠螺母机构利用螺母与螺纹间的滚动摩擦或滑动摩擦将旋转运动化为直线运动。若要使顶升机构能够平稳运行则需要多个丝杠螺母副且各运动副的同步运行对控制工程设计要求较高。因此本作品则采用了剪叉机构,利用了菱形易于变形且活动范围大的特点使整体机构控制简单且运动平稳。
针对收纳机构,我们参考了抽屉的原理进行设计,但由于抽屉的滑轨机构所需的安装空间过大且不易安装驱动,不符合结构紧凑的设计原则,为此我们将滑轨的直线运动替换成旋转运动使装置更加紧凑美观,当接收到指定信号后上层收纳机构可通过舵机的驱动转出,以方便机械手的识别和取物。
装置行走机构的设计采用了轮式运动方案。不同于腿式行走机构的不平稳和履带式行走机构的复杂结构,轮式机构更适合家用,结构简单且控制方便。可实现原地转向和双向移动。
本作品机械结构的SolidWorks建模成果如下图所示。
控制方面,主要包括Arduino开发板、舵机、HC-06蓝牙模块、LD3320语音模块,超声波传感器、摄像头等。其中Arduino开发板是整个控制系统的核心,通过其与超声波传感器的配合可以实现对3自由度机械臂的精准控制。搭载的HC-06蓝牙模块可与手机互联,通过自主研发的专用APP可以实现全部功能的无线操作。此外安装的LD3320语音模块又提供了一种新的控制方案,通过关键词“开始”可唤醒语音模块执行相应的工作。
本作品采用了探索者套件进行模型搭建和程序调试,前后历时两个月,在我组成员的不懈努力下该装置的结构和功能都在不断优化,最终制作出了实体样机,可实现预期的全部功能。
对装置各机构的设计。我们首先了解了各模块所需的运动过程和特点,并初步利用实物进行模拟验证。在规划完大致结构后,用SolidWorks建立整体模型,并对各机构进行校核修改。最终确定整体方案。
本节将从设计顺序大致介绍各机械结构的原理和选择,着重介绍该装置抓取机构和顶升机构的设计。
抓取机构的实现主要依赖于三自由度机械臂。三个旋转关节分别由360度标准舵机进行控制从而拥有更高的灵活性和工作范围,舵机的自锁通过代码调试实现从而使整个机械臂固定在相应角度。机械手的设计参考了拨杆杠杆式钳爪[2],具体结构如下:
舵机驱动连杆带动一侧爪转动,通过齿轮啮和将旋转运动反向传递至另一侧爪,该机构可实现两侧爪的同步开合,模拟了抓取过程。利用舵机提供的扭矩可夹取一定重量的物品。
顶升机构担负着整个载物平台抬升和下降的任务,剪叉机构具有结构紧凑、速度范围大、工作空间大的特点因而可以很好的胜任这一任务。我们通过双侧滑轨限位可以使平台抬升至指定高度。
剪叉机构的驱动力布置,参考工业用千斤顶布置液压缸的规律[3],我们在第二根连杆处置入横杆并由双头标准舵机进行抬升。经过大量实验证明该模型的布置是合理的。收纳机构固连于剪叉机构的上层,并通过连接件固定使两端受力平衡从而减轻剪叉机构的驱动负担。
抓取机构主要由R关节和钳爪组成。三个R关节分为两组,分别负责机械臂的旋转和俯仰。由于未设置机械自锁装置,在运行过程中三个关节均处于工作状态,这样设计的好处在于可以缩短机械臂的响应时间。钳爪采用两指张角结构。在机器人机械爪结构搭建过程中,考虑到工作环境的复杂化、测试物体的多样化,将机械爪设计方向定位为小型化、轻量化及灵活化。采用二指张角机械爪的设计方法,特点在于结构短小灵活、任务完成效率高,可以保证机器人在运动和抓取过程中保持机身稳定性[4]。
3.1.3 顶升机构设计
顶升机构的设计我们采用了三种方案,经过分析对比最终决定采用方案三。
方案一:在底盘四角安装可编程气缸驱动平台上升,从而实现桌板升起功能。
优点:结构简单易于实现。
缺点:可编程气缸成本较高,且要求四角同步抬升对控制方法要求高。
方案二:采用剪叉机构并通过丝杠螺母副进行驱动,实现桌面平台的上升。
优点:驱动方式简单,整体装置易于控制。
缺点:机械效率低,结构不稳定,外观不美观。
丝杠螺母驱动方式的简易实物图如下所示。
桌面平台的静应力分析如下图所示,我们根据实物尺寸搭建了平台的3D模型并利用SolidWorks进行仿真分析。在小位移条件下整体框架出现较大弹性变形,虽然强度符合要求但在工作工程中会出现较大抖振且无法通过改善控制方法对抖振进行抑制。此外驱动机构不够美观,且丝杠的高速旋转有可能造成安全性事故,这都是我们所不希望的。
方案三:采用剪叉机构并利用下图所示的方式进行驱动。
优点:结构紧凑,易于同步控制,工作中抖振较小。
缺点:对驱动舵机的最大转矩要求高。
收纳机构由安装在桌面平台两侧的四个可旋转储物格组成,实物图如下所示,工作时对应药品的储物格转出,辅助抓取机构实现不同药品的识别和递送。常态时则收入桌面载物平台下,这样设计既节约了空间也完成了规定任务。
3.1.5 清洁机构设计
清洁机构由固定在底盘上的两个轮形结构组成,并可由舵机控制清洁角度。清洁时只需将清洁布套在轮形结构上即可,湿润的清洁布可以很好的吸附地面的灰尘,装置的运动又会带动清洁布擦去地上的污渍,增强清洁效果。
3.2 传感系统设计
本装置的传感器主要有超声波传感器,蓝牙模块和语音模块组成。通过相应的传感器和接收模块将外部环境信号转化为计算机可以识别的电信号并传递给CPU进行处理,最终通过总线传递给各I/O口从而指挥末端执行器进行相应运作。
如下图所示,HC-06蓝牙模块采用BlueCore4-Ext芯片,支持UART,USB,SPI,PCM等接口,支持SPP蓝牙串口协议,相较其他蓝牙模块具有体积小,成本低的优势。
超声波传感器用于帮助机械手判断距离以准确抓取,通过定时发送脉冲并计算回波时间确定具体距离。
LD3320语音识别芯片采用的是ASR技术。它对大量的语音数据经语言学家语音模型分析, 建立数学模型, 并经过反复训练提取基元语音的细节特征, 以及提取各基元间的特征差异, 得到在统计概率最优化意义上的各个基元语音特征, 最后才由资深工程师将算法以及语音模型转换成硬件芯片并应用在嵌入式系统中[5]。
本章将会大致说明该装置的定时工作流程,其中包含了软件控制和机构的实际运动。定时过程:在手机APP(APP具体界面见附录)上选择需要定时的时长(时段间可以叠加),并将最终结果发送给HC-06蓝牙模块,蓝牙模块的串口与开发板相连,最终依靠开发板的软件延时实现定时功能。定时结束后,小车延规划的指定路线行走至终点,同时机械臂进入待命状态。短暂停顿后收纳药品的收纳格转出,机械臂的关节1驱动机械臂转至相应方向,超声波传感器以50Hz的频率发送脉冲,并计算回波时间,运用公式 将回波时间换算成以厘米为单位的长度。若小于指定长度,关节2、关节3将协同运动使机械爪移动至药品正上方,通过舵机驱动夹取药品。最终放置在在载物平台上并通过剪叉机构上升至指定高度。
//#define Trig 2 //引脚Tring 连接 IO D2
//#define Echo 3 //引脚Echo 连接 IO D3
#include
//左边的电机控制引脚
int leftMotor_1 = 5;
int leftMotor_2 = 6;
//右边的电机控制引脚
int rightMotor_1 = 9;
int rightMotor_2 = 10;
int ser;//时间转化变量
//float cm; //距离变量
//float temp; //距离临时变量
//-----------------------------------------------------------
//定义舵机
Servo myservo1; //myservo1用360度舵机
Servo myservo2;
Servo myservo3;
Servo myservo4;
Servo joint1;//三转动关节定义
Servo joint2;
Servo joint3;
Servo joint4; //机械爪定义
//Servo servo_rub;//垃圾桶控制舵机
Servo up_down_servo;//平台抬升舵机
//----------------------------------------------------------
//子函数定义
超声控制
//void rubbish() {
// //给Trig发送一个低高低的短时间脉冲,触发测距
// delay(200);
// digitalWrite(Trig, LOW); //给Trig发送一个低电平
// delayMicroseconds(2); //等待 2微妙
// digitalWrite(Trig,HIGH); //给Trig发送一个高电平
// delayMicroseconds(10); //等待 10微妙
// digitalWrite(Trig, LOW); //给Trig发送一个低电平
//
// temp = float(pulseIn(Echo, HIGH)); //存储回波等待时间,
//
// cm = (temp * 17 )/1000; //把回波时间换算成cm
// Serial.println(cm);
// if (cm<=8)
// {
// servo_rub.write(80);
// delay(5000);
// for (int pos =80;pos>=10;)
// {
// servo_rub.write(pos);
// pos=pos-5;
// delay(20);
// }
// }
//}
//舵机子函数
int pos = 0; // 角度存储变量
//机械爪首部舵机控制
void hand_control()
{
for (pos = 0; pos <= 100;)
{
joint4.write(pos);
pos = pos + 3;
delay(5);
}
delay(5000);
for (pos = 85; pos >= 0;)
{
joint4.write(pos);
pos = pos - 3;
delay(5);
}
delay(5000);
}
void servo_1()//控制一号舵机转出复位
{
for (pos = 90; pos >= 20; ) {
myservo1.write(pos); // 舵机角度写入
pos = pos - 1;
delay(50);
}
// delay(5000);//停留10s
// for (pos = 90; pos >= 20; ) {
// myservo1.write(pos);
// pos = pos - 2;// 舵机角度写入
// delay(10);
}
void servo_2()//控制二号舵机转出复位
{
for (pos = 0; pos <= 130; ) {
myservo2.write(pos); // 舵机角度写入
pos = pos + 2;
delay(10);
}
delay(5000);//停留10s
for (pos = 130; pos >= 0; ) {
myservo2.write(pos);
pos = pos - 2;// 舵机角度写入
delay(10);
}
}
void servo_3()//控制三号舵机转出复位
{
for (pos = 120; pos >= 0; ) {
myservo3.write(pos); // 舵机角度写入
pos = pos - 2;
delay(10);
}
delay(5000);//停留10s
for (pos = 0; pos <= 120; ) {
myservo3.write(pos);
pos = pos + 2;// 舵机角度写入
delay(10);
}
}
void servo_4()//控制四号舵机转出复位
{
for (pos = 60; pos >= 0; ) {
myservo4.write(pos); // 舵机角度写入
pos = pos - 2;
delay(10);
}
delay(5000);//停留10s
for (pos = 0; pos <= 60; ) {
myservo4.write(pos);
pos = pos + 2;// 舵机角度写入
delay(10);
}
}
//----------------------------------------------------------
//一高二低正转
void moveLeft(void)
{
analogWrite(leftMotor_1, 255);
analogWrite(leftMotor_2, 0);
analogWrite(rightMotor_1, 0);
analogWrite(rightMotor_2, 255);
}
//控制小车右转,左边电机正转,右边电机停止
//----------------------------------------------------------
void moveRight(void)
{
analogWrite(leftMotor_1, 0);
analogWrite(leftMotor_2, 255);
analogWrite(rightMotor_1, 255);
analogWrite(rightMotor_2, 0);
}
//控制小车前进,左边电机正转,右边电机正转
//----------------------------------------------------------
void moveForward(void)
{
analogWrite(leftMotor_1, 255);
analogWrite(leftMotor_2, 0);
analogWrite(rightMotor_1, 255);
analogWrite(rightMotor_2, 0);
}
//控制小车反转,左边电机反转,右边电机反转
//----------------------------------------------------------
void moveBackward(void)
{
analogWrite(leftMotor_1, 0);
analogWrite(leftMotor_2, 255);
analogWrite(rightMotor_1, 0);
analogWrite(rightMotor_2, 255);
}
//控制小车停止,左边电机停止,右边电机停止
//----------------------------------------------------------
void stopCar(void)
{
analogWrite(leftMotor_1, 0);
analogWrite(leftMotor_2, 0);
analogWrite(rightMotor_1, 0);
analogWrite(rightMotor_2, 0);
}
//设置小车转速
//----------------------------------------------------------
// void highspeed()
// {
// analogWrite(enA,500);
// analogWrite(enB,500);
// }
// void lowspeed()
// {
// analogWrite(enA,300);
// analogWrite(enB,300);
// }
//----------------------------------------------------------
//小车行走程序
void moverout()
{
moveForward();
delay(5000);
moveRight();
delay(5000);
stopCar();
delay(500);
}
void servo_control()
{
servo_1();
delay(2000);
}
void setup() {
Serial.begin(9600);
pinMode(leftMotor_1, OUTPUT);
pinMode(leftMotor_2, OUTPUT);
pinMode(rightMotor_1, OUTPUT);
pinMode(rightMotor_2, OUTPUT);
myservo1.attach(7);
// myservo2.attach(8);
// myservo3.attach(12);
// myservo4.attach(4);
up_down_servo.attach(18);
// pinMode(Trig, OUTPUT);
// pinMode(Echo, INPUT);
joint1.attach(4);
joint2.attach(11);
// joint3.attach(18);
joint4.attach(14);
}
void loop() {
delay(1000);
myservo1.write(100);
myservo3.write(120);
myservo2.write(95);
myservo4.write(0);
up_down_servo.write(30);
joint1.write();
delay();
joint1.write(90);
joint2.write();
delay();
joint2.write(90);
joint3.write();
delay();
joint3.write(90);
joint4.write();
delay();
joint4.write(90);
char val = Serial.read();//舵机角度初始化
switch (val) //定时控制药柜转出
{
case '1':
moverout();
delay(1000);
ser = Serial.parseInt();
Serial.println(ser);
delay(100);//平台升起
servo_1();
delay(500); //机械爪控制
joint2.write(125);
delay(380);
joint2.write(87);
joint3.write(50);
delay(430);
joint3.write(87);
delay(480);
joint1.write(65);
delay(655);
joint1.write(90);
delay(500);
joint1.write(130);
delay(340);
joint1.write(90);
delay(100);
joint3.write(110);
delay(565);
joint3.write(90);
for (int pos = 80; pos <= 150; )
{
joint4.write(pos);
pos = pos + 5;
delay(50);
}
delay(2000);
joint2.write(80);
delay(100);
joint2.write(90);
delay(500);
joint3.write(65);
joint2.write(80);
delay(180);
joint2.write(90);
delay(220);
joint3.write(90);
for (int pos = 150; pos >= 80; )
{
joint4.write(pos);
pos = pos - 5;
delay(50);
}
joint1.write(65);
delay(440);
joint1.write(90);
for (pos = 90; pos >= 20; ) {
myservo1.write(pos);
pos = pos - 2;
delay(10);
up_down_servo.write(60);
delay(10000);
up_down_servo.write(90);
up_down_servo.write(150);
delay(5000);
up_down_servo.write(90);
delay(500);
break;
case '2':
delay(2000);
moverout();
delay(1000);
ser = Serial.parseInt();
Serial.println(ser);
up_down_servo.write(100);
delay(5000);
up_down_servo.write(90);
servo_control();
up_down_servo.write(0);
delay(2000);
up_down_servo.write(90);
break;
case '3':
moverout();
delay(1000);
ser = Serial.parseInt();
Serial.println(ser);
up_down_servo.write(180);
delay(2000);
up_down_servo.write(90);
servo_control();
up_down_servo.write(0);
delay(2000);
up_down_servo.write(90);
break;
case '4':
moverout();
delay(1000);
ser = Serial.parseInt();
Serial.println(ser);
up_down_servo.write(180);
delay(2000);
up_down_servo.write(90);
servo_control();
up_down_servo.write(0);
delay(2000);
up_down_servo.write(90);
break;
case 'f':
servo_3();
delay(500);
break;
case 'c':
servo_2();
delay(500);
break;
case 'r'://机械臂蓝牙控制
joint1.write(0);
delay(200);
joint1.write(90);
Serial.println("right");
break;
case 'l':
joint1.write(100);
delay(500);
joint1.write(90);
break;
case 'm':
joint2.write(70);
delay(300);
joint2.write(90);
break;
case 'b':
joint2.write(0);
delay(200);
joint2.write(90);
break;
case 'u':
joint3.write(110);
delay(200);
joint3.write(90);
break;
case 'd':
joint3.write(0);
delay(200);
joint3.write(90);
break;
case 'g':
for (int pos = 80; pos <= 140; )
{
joint4.write(pos);
pos++;
delay(50);
}
break;
case 'q':
for (int pos = 140; pos >= 80; )
{
joint4.write(pos);
pos = pos - 1;
delay(50);
}
break;
case '5'://小车蓝牙控制
moveForward();
break;
case '7':
moveLeft();
break;
case '8':
moveRight();
break;
case '6':
moveBackward();
break;
case '9':
stopCar();
break;
}
}
① 本作品采用机械结构的交叉布置方法,使不同机构间既不会产生干涉,又可以提高不同功能间的联系。使机械臂,剪叉机构这种体积较为庞大的机构布置更为紧凑。同时结构的选择缩短了家用服务机器人产品的研发周期,降低了开发成本。
② 项目具有很大的发展前景,目前已经取得的成果可以作为一个广泛的服务平台。
③ 本装置已集成多种控制模块与传感模块,可以使用多种控制方式以适应不同老年人的身体状况,同时专属APP的开发使该装置的人机交互功能更加完善。
本装置主要应用于辅助行动不便的老人的日常生活,目前已经解决了向老年人定时递送相应药物,辅助老年人取物等核心功能。同时多自由度的机械臂具有大范围工作能力,将装置的应用场景进一步拓宽,具有较强适应性,可以实现一体多用,功能集成化。正如前文所说21世纪是人类社会大步发展的时代,采用一种轻量化,智能化,普及化的生活方案是众多年轻人所追求的,面对照顾老人这一方面也是如此,本装置的智能化高,可以基本实现一个临时工照顾老人的基本流程,例如打扫卫生,提醒用药等。此外。本装置结构简单紧凑,生产成本低,人机交互性好,易于操作,这些特点利于其被投入广泛的应用。
家用服务机器人尤其是养老服务机器人目前具有较大市场缺口,一是市面上的服务机器人功能单一,无法让人放心其是否具有照顾好行动不便的老人的能力;二是此类机器人售价过高,相较其实际功能性价比不高,所以除了一些养老院鲜有人入手。然而家用服务机器人的市场一部分也是当前家政服务行业的市场,具有广泛的受众群体。只要出现一款价格适中,功能全面的家用服务机器人必能打破当前市场壁垒,赢取更大的收益平台。
虽然当前我们的机器人已经具有相当全面的功能,但未来依然需要在以下方面进行改进。
① 增加远程监护功能,装置加装摄像头并采用图像识别技术识别老人的身体状态,若老人的身体出现异样能够及时报警并通知其他家庭成员。
② 完善人机交互功能,实现机器人与老人的互动交流,消解老人生活中的孤单与无聊
③ 升级陪护功能,帮助老人在家中行走,上厕所等功能。
参考文献
[1]郑媛媛.中日韩人口老龄化问题与应对问题分析[J].现代交际,2021(22):207-209.
[2]高倩. 伴老机器人研究与设计[D].山东建筑大学,2020.DOI:10.27273/d.cnki.gsajc.2020.000256.
[3]暴梦川. “有用+好用”成家庭机器人发展方向[N]. 消费日报,2022-06-10(A02).DOI:10.28866/n.cnki.nxfrb.2022.000677.
[4]胡前雨,汪正东,曾沁月,庄尚媛,侯贤泰.VEX机器人抓取方法设计与实现[J].工业技术创新,2019,06(06):8-12.DOI:10.14103/j.issn.2095-8412.2019.06.002.
[5]韩宇飞.基于LD3320的语音识别系统在家庭电路中的模拟应用[J].无线互联科技,2015(11):66-68.
* 更多详情请参考 【S028】智能扶老助残辅助管家