机器人制作开源方案 | 智能扶老助残辅助管家

作者:孙运通 黄善越 卢瑀 张宇峰 郑乐怡

单位:河海大学

指导老师:陆其清

      人口老龄化始终是我国一个极为严峻的社会问题。独居老人和空巢老人占总人口比重日益提高:预计至2050年老龄人口占比将超20%,绝大部分城市和地区将进入深度老龄化[1]。加之城市生活节奏的加快,当代青年的生活压力“此消彼长”,照顾老年人同时也是我们义不容辞的责任和义务,因此如何高效照顾行动不便的老年人成为亟需解决的社会问题。我们研究并制作了一款基于多模块融合技术面向残障人士的家用服务型机器人,该装置可实现定时递送药物和其他生活必需品、远程辅助取物、室内地面清洁等功能,此外装置搭载了蓝牙模块,语音模块和相应一系列传感器,可以实现自动控制、手机遥控、语音控制,本作品结构可靠紧凑,生产成本低,基本可以满足老年人的生活所需,填补了相应的市场空白。

1. 绪论

1.1背景

      人口老龄化是我国乃至世界所面临的严峻课题与困难挑战,现如今如何高效照顾老人是当代年轻人所要面临的一大难题,既能尽到赡养的义务又能减轻照看负担,提高生活水平似乎是一两难的局面,大部分年轻人选择雇佣临时工来照看行动不便的老人,辅助他们按时吃饭吃药,但高昂的佣金与信任危机又会引发新的矛盾。

照顾老年人

       大部分老年人面临着行动不便,没有明确的时间观念,记忆力较差等困难,这会致使他们忘记按时吃药,难以获得需要的生活品等。

行动不便的老人

1.2现状

       经广泛市场调研,我们找到了目前市面上常见的两类家用服务机器人并对其功能进行简要分析。

      ① 移乘护理机器人。共有特点为能够驼载老人在室内移动。能够将行动不便的老人载送至预定的位置,灵活性高,结构简单,理论完善。但缺点也很明显:无法帮助老人分辨需要的药品,制作成本高,因为需要搭乘在机器人上所以对老人的行动能力有一定要求。根据其优缺点可做出对应雷达图。

伴老机器人[2]

移乘护理机器人雷达图

       ② 智能交互机器人。智能度高,灵活性高,可以与老年人进行高度互动。但是此类机器人成本高且功能单一,仅能起到陪伴作用。

智能交互机器人

智能交互机器人雷达图

      目前针对老年人和残障人士的家用服务机器人市场缺口大,现有的产品也面临着功能单一,制造成本高昂,使用复杂等问题,并不能很好的契合老年人的生活难点和需求。因此需要设计一款更贴合老年人需求的家用服务机器人,其初衷在于帮助老人解决生活难题,后扩展到智能家具领域以适应更广泛的场景。

2. 作品介绍

2.1 需求分析

      随着社会不断发展,机器人产业逐渐向家用,民用过渡。服务机器人这一领域也是当下的热门研究领域之一,国内外的研究与成果都在逐步完善该领域的缺口。早在2021年1月,三星就发布了一款可以实现生活助理和简单家务功能的机器人[3]。2021年9月,亚马逊也相继宣布推出名为Astro的家用机器人,可以实现视频通话、安全监控、物品移送等功能。得益于各种传感器技术的成熟,服务机器人可以拥有更多的功能以适应不同的环境。

      经过广泛的市场调研,我们发现人们对家用服务机器人的选择倾向于以下方面:尺寸方面、功能方面、操作方面、价格方面、安全方面。

      尺寸方面:家用服务机器人体积小,重量轻,易于搬运。

      功能方面:功能丰富,能够辅助行动不便的老人的日常所需。

      操作方面:易于上手,可直接使用APP远程操作。

      价格方面:在功能完善的前提下尽可能降低成本,使其适应广泛民众的消水平。

      安全方面:全程自动化完成,发生故障自行中断,安全性要高。

设计流程图

2.2 设计思路

      通过分析,该装置应具有以下特点:

      ① 操作简单,易于老年人的理解和应用,同时也为其他家庭成员提供了控制装置的方案。

      ② 能够定时向老年人递送需要的药物,可以帮助行动不便的老人远程取物,同时机器人应具有较高的智能,能够分辨老人不同时段需要的药品。

      ③ 针对当前家用养老服务机器人的不足进行对应的机构和程序设计,不易于操作是其中最大的缺陷,所以该方面工作需要着重解决。

2.3 装置简述

      家用服务机器人主要针对所要解决的问题进行机构设计,本作品主要设计了抓取机构、顶升机构、收纳机构、行走机构并拟定了总体控制方案。

      抓取机构主要分为机械钳爪式和吸附式。吸附式又有真空吸附式和磁力吸附式之分,考虑到吸附式对硬件要求较高不符合设计初衷,为此我们改用机械钳爪式,参考拨杆杠杆式钳爪,设计了相应机构。其目的在于准确识别并抓取指定药品放置在载物平台上。

      顶升机构最为常用的有丝杠螺母机构和剪叉机构。丝杠螺母机构利用螺母与螺纹间的滚动摩擦或滑动摩擦将旋转运动化为直线运动。若要使顶升机构能够平稳运行则需要多个丝杠螺母副且各运动副的同步运行对控制工程设计要求较高。因此本作品则采用了剪叉机构,利用了菱形易于变形且活动范围大的特点使整体机构控制简单且运动平稳。

      针对收纳机构,我们参考了抽屉的原理进行设计,但由于抽屉的滑轨机构所需的安装空间过大且不易安装驱动,不符合结构紧凑的设计原则,为此我们将滑轨的直线运动替换成旋转运动使装置更加紧凑美观,当接收到指定信号后上层收纳机构可通过舵机的驱动转出,以方便机械手的识别和取物。

      装置行走机构的设计采用了轮式运动方案。不同于腿式行走机构的不平稳和履带式行走机构的复杂结构,轮式机构更适合家用,结构简单且控制方便。可实现原地转向和双向移动。

      本作品机械结构的SolidWorks建模成果如下图所示。

家用服务机器人结构图

      控制方面,主要包括Arduino开发板、舵机、HC-06蓝牙模块、LD3320语音模块,超声波传感器、摄像头等。其中Arduino开发板是整个控制系统的核心,通过其与超声波传感器的配合可以实现对3自由度机械臂的精准控制。搭载的HC-06蓝牙模块可与手机互联,通过自主研发的专用APP可以实现全部功能的无线操作。此外安装的LD3320语音模块又提供了一种新的控制方案,通过关键词“开始”可唤醒语音模块执行相应的工作。

      本作品采用了探索者套件进行模型搭建和程序调试,前后历时两个月,在我组成员的不懈努力下该装置的结构和功能都在不断优化,最终制作出了实体样机,可实现预期的全部功能。

3. 装置原理介绍

3.1 机械部分设计

      对装置各机构的设计。我们首先了解了各模块所需的运动过程和特点,并初步利用实物进行模拟验证。在规划完大致结构后,用SolidWorks建立整体模型,并对各机构进行校核修改。最终确定整体方案。

3.1.1 机构简述

      本节将从设计顺序大致介绍各机械结构的原理和选择,着重介绍该装置抓取机构和顶升机构的设计。

抓取机构的实现主要依赖于三自由度机械臂。三个旋转关节分别由360度标准舵机进行控制从而拥有更高的灵活性和工作范围,舵机的自锁通过代码调试实现从而使整个机械臂固定在相应角度。机械手的设计参考了拨杆杠杆式钳爪[2],具体结构如下:

机械爪示意图

      舵机驱动连杆带动一侧爪转动,通过齿轮啮和将旋转运动反向传递至另一侧爪,该机构可实现两侧爪的同步开合,模拟了抓取过程。利用舵机提供的扭矩可夹取一定重量的物品。

      顶升机构担负着整个载物平台抬升和下降的任务,剪叉机构具有结构紧凑、速度范围大、工作空间大的特点因而可以很好的胜任这一任务。我们通过双侧滑轨限位可以使平台抬升至指定高度。

顶升机构示意图

      剪叉机构的驱动力布置,参考工业用千斤顶布置液压缸的规律[3],我们在第二根连杆处置入横杆并由双头标准舵机进行抬升。经过大量实验证明该模型的布置是合理的。收纳机构固连于剪叉机构的上层,并通过连接件固定使两端受力平衡从而减轻剪叉机构的驱动负担。

3.1.2 抓取机构设计

      抓取机构主要由R关节和钳爪组成。三个R关节分为两组,分别负责机械臂的旋转和俯仰。由于未设置机械自锁装置,在运行过程中三个关节均处于工作状态,这样设计的好处在于可以缩短机械臂的响应时间。钳爪采用两指张角结构。在机器人机械爪结构搭建过程中,考虑到工作环境的复杂化、测试物体的多样化,将机械爪设计方向定位为小型化、轻量化及灵活化。采用二指张角机械爪的设计方法,特点在于结构短小灵活、任务完成效率高,可以保证机器人在运动和抓取过程中保持机身稳定性[4]。

机械臂结构

3.1.3 顶升机构设计

      顶升机构的设计我们采用了三种方案,经过分析对比最终决定采用方案三。

      方案一:在底盘四角安装可编程气缸驱动平台上升,从而实现桌板升起功能。

      优点:结构简单易于实现。

      缺点:可编程气缸成本较高,且要求四角同步抬升对控制方法要求高。

方案一模型

方案二:采用剪叉机构并通过丝杠螺母副进行驱动,实现桌面平台的上升。

优点:驱动方式简单,整体装置易于控制。

缺点:机械效率低,结构不稳定,外观不美观。

丝杠螺母驱动方式的简易实物图如下所示。

丝杠螺母驱动方式

      桌面平台的静应力分析如下图所示,我们根据实物尺寸搭建了平台的3D模型并利用SolidWorks进行仿真分析。在小位移条件下整体框架出现较大弹性变形,虽然强度符合要求但在工作工程中会出现较大抖振且无法通过改善控制方法对抖振进行抑制。此外驱动机构不够美观,且丝杠的高速旋转有可能造成安全性事故,这都是我们所不希望的。

平台静应力分析

方案三:采用剪叉机构并利用下图所示的方式进行驱动。

优点:结构紧凑,易于同步控制,工作中抖振较小。

缺点:对驱动舵机的最大转矩要求高。

3.1.4 收纳机构设计

      收纳机构由安装在桌面平台两侧的四个可旋转储物格组成,实物图如下所示,工作时对应药品的储物格转出,辅助抓取机构实现不同药品的识别和递送。常态时则收入桌面载物平台下,这样设计既节约了空间也完成了规定任务。

收纳机构

3.1.5 清洁机构设计

      清洁机构由固定在底盘上的两个轮形结构组成,并可由舵机控制清洁角度。清洁时只需将清洁布套在轮形结构上即可,湿润的清洁布可以很好的吸附地面的灰尘,装置的运动又会带动清洁布擦去地上的污渍,增强清洁效果。

清洁机构

3.2 传感系统设计

      本装置的传感器主要有超声波传感器,蓝牙模块和语音模块组成。通过相应的传感器和接收模块将外部环境信号转化为计算机可以识别的电信号并传递给CPU进行处理,最终通过总线传递给各I/O口从而指挥末端执行器进行相应运作。

      如下图所示,HC-06蓝牙模块采用BlueCore4-Ext芯片,支持UART,USB,SPI,PCM等接口,支持SPP蓝牙串口协议,相较其他蓝牙模块具有体积小,成本低的优势。

蓝牙模块

        超声波传感器用于帮助机械手判断距离以准确抓取,通过定时发送脉冲并计算回波时间确定具体距离。

超声波传感器

      LD3320语音识别芯片采用的是ASR技术。它对大量的语音数据经语言学家语音模型分析, 建立数学模型, 并经过反复训练提取基元语音的细节特征, 以及提取各基元间的特征差异, 得到在统计概率最优化意义上的各个基元语音特征, 最后才由资深工程师将算法以及语音模型转换成硬件芯片并应用在嵌入式系统中[5]。

LD3320语音识别模块

4. 工作过程

      本章将会大致说明该装置的定时工作流程,其中包含了软件控制和机构的实际运动。定时过程:在手机APP(APP具体界面见附录)上选择需要定时的时长(时段间可以叠加),并将最终结果发送给HC-06蓝牙模块,蓝牙模块的串口与开发板相连,最终依靠开发板的软件延时实现定时功能。定时结束后,小车延规划的指定路线行走至终点,同时机械臂进入待命状态。短暂停顿后收纳药品的收纳格转出,机械臂的关节1驱动机械臂转至相应方向,超声波传感器以50Hz的频率发送脉冲,并计算回波时间,运用公式  将回波时间换算成以厘米为单位的长度。若小于指定长度,关节2、关节3将协同运动使机械爪移动至药品正上方,通过舵机驱动夹取药品。最终放置在在载物平台上并通过剪叉机构上升至指定高度。

5. 示例程序

//#define Trig 2 //引脚Tring 连接 IO D2

//#define Echo 3 //引脚Echo 连接 IO D3

#include <Servo.h>

//左边的电机控制引脚

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;

      }

   }

6. 装置创新点

      ① 本作品采用机械结构的交叉布置方法,使不同机构间既不会产生干涉,又可以提高不同功能间的联系。使机械臂,剪叉机构这种体积较为庞大的机构布置更为紧凑。同时结构的选择缩短了家用服务机器人产品的研发周期,降低了开发成本。

      ② 项目具有很大的发展前景,目前已经取得的成果可以作为一个广泛的服务平台。

      ③ 本装置已集成多种控制模块与传感模块,可以使用多种控制方式以适应不同老年人的身体状况,同时专属APP的开发使该装置的人机交互功能更加完善。

7. 总结与分析

7.1 作品应用前景

      本装置主要应用于辅助行动不便的老人的日常生活,目前已经解决了向老年人定时递送相应药物,辅助老年人取物等核心功能。同时多自由度的机械臂具有大范围工作能力,将装置的应用场景进一步拓宽,具有较强适应性,可以实现一体多用,功能集成化。正如前文所说21世纪是人类社会大步发展的时代,采用一种轻量化,智能化,普及化的生活方案是众多年轻人所追求的,面对照顾老人这一方面也是如此,本装置的智能化高,可以基本实现一个临时工照顾老人的基本流程,例如打扫卫生,提醒用药等。此外。本装置结构简单紧凑,生产成本低,人机交互性好,易于操作,这些特点利于其被投入广泛的应用。

7.2 市场前景

      家用服务机器人尤其是养老服务机器人目前具有较大市场缺口,一是市面上的服务机器人功能单一,无法让人放心其是否具有照顾好行动不便的老人的能力;二是此类机器人售价过高,相较其实际功能性价比不高,所以除了一些养老院鲜有人入手。然而家用服务机器人的市场一部分也是当前家政服务行业的市场,具有广泛的受众群体。只要出现一款价格适中,功能全面的家用服务机器人必能打破当前市场壁垒,赢取更大的收益平台。

7.3 不足与改进方向

      虽然当前我们的机器人已经具有相当全面的功能,但未来依然需要在以下方面进行改进。

      ① 增加远程监护功能,装置加装摄像头并采用图像识别技术识别老人的身体状态,若老人的身体出现异样能够及时报警并通知其他家庭成员。

      ② 完善人机交互功能,实现机器人与老人的互动交流,消解老人生活中的孤单与无聊

      ③ 升级陪护功能,帮助老人在家中行走,上厕所等功能。

参考文献

[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】智能扶老助残辅助管家

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/198939.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于单片机环境监测温湿度PM2.5系统设计

**单片机设计介绍&#xff0c;基于单片机环境监测温湿度PM2.5系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 设计一个基于单片机环境监测温湿度PM2.5的系统是一个非常有意义的项目。以下是一个基本的介绍&#xff1a; …

云原生实战课大纲<2>

我们pod的数据挂载文件可以使用 pv-pvc的方式 1. 创建pv池 2. 在pv池中创建pv&#xff0c;并且设置pv的模式 3. 编写pod 写对应的pvc 申请书 就可以了这就是我们k8s中的pv和pvc 基于pv池创建pv的时候会有容量限制呢么关于配置呢&#xff0c;我们以前会有这种场景 比如说在dock…

Android Studio导入项目一直显示正在下载Gradle项目

如题&#xff0c;问题图类似如下&#xff1a; &#xff08;此图是解决以后截的&#xff0c;之前遇到问题没截图&#xff09; 解决方法 先找到你正在下载的gradle的版本是哪个 然后在链接中 ​​​​​​Gradle Distributions 找到你所对于gradle的版本&#xff0c;下载对应…

Centos7安装配置nginx

快捷查看指令 ctrlf 进行搜索会直接定位到需要的知识点和命令讲解&#xff08;如有不正确的地方欢迎各位小伙伴在评论区提意见&#xff0c;小编会及时修改&#xff09; Centos7安装配置nginx Nginx介绍 Nginx (engine x) 是一个高性能的 HTTP 和 反向代理 服务&#xff0c;也…

Spring Security 6.x 系列(6)—— 显式设置和修改登录态信息

一、前言 此篇是对上篇 Spring Security 6.x 系列&#xff08;5&#xff09;—— Servlet 认证体系结构介绍 中4.9章节显式调用SecurityContextRepository#saveContext进行详解分析。 二、设置和修改登录态 2.1 登录态存储形式 使用Spring Security框架&#xff0c;认证成功…

34 - 记一次线上SQL死锁事故:如何避免死锁?

之前我参与过一个项目&#xff0c;在项目初期&#xff0c;我们是没有将读写表分离的&#xff0c;而是基于一个主库完成读写操作。在业务量逐渐增大的时候&#xff0c;我们偶尔会收到系统的异常报警信息&#xff0c;DBA 通知我们数据库出现了死锁异常。 按理说业务开始是比较简…

业务逻辑漏洞

业务逻辑漏洞 扫描器扫不出来 漏洞包括 暴力破解任意用户/密码登陆短信/邮箱轰炸验证码绕过/爆破/重放/回传用户名/手机号枚举(用户名枚举&#xff1a;当用户登录时&#xff0c;显示用户名不存在&#xff0c;或密码不正确&#xff0c;两个其中一个不正确就称为用户名枚举)越…

MySQL系列 - 数据类型

MySQL是一种常用的关系型数据库管理系统&#xff0c;它支持多种数据类型&#xff0c;包括整数、浮点数、字符串、日期和时间等。在本文中&#xff0c;我们将介绍MySQL中常用的数据类型及其用法。 MySQL数据类型介绍&#xff1a; 1、整数类型&#xff1a; MySQL提供了多种整数…

微信小程序 老年人心血管健康知识科普系统

本系统的功能有管理员&#xff1a;个人中心&#xff0c;用户管理&#xff0c;热点信息管理&#xff0c;疾病管理&#xff0c;疾病类型管理&#xff0c;治疗管理&#xff0c;治疗类型管理&#xff0c;护理管理&#xff0c;护理类型管理&#xff0c;科普管理&#xff0c;科普类型…

Elasticsearch 线上实战问题及解决方案探讨

1、reindex相关问题 1.1 问题描述 我有 1tb 的一个大索引若干&#xff0c;要迁移到另外一个新集群去&#xff0c;有没有好办法&#xff1f;reindex好像会中断...... reindex 是不是就算设置了频率也会莫名的中断&#xff0c;而且没地方查到错误&#xff1f;1000多万的数据&…

『 Linux 』进程优先级

文章目录 什么是优先级Linux下的进程优先级PRI与NI使用top查看进程以及对进程的优先级的修改 进程优先级的其他概念竞争性与独立性并发与并行 什么是优先级 优先级,顾名思义,即在同一环境下不同单位对同一个资源的享有顺序; 一般优先级高的单位将优先占有该资源; 在进程当中进…

海翔云平台 getylist_login.do SQL 注入漏洞复现

0x01 产品简介 海翔云平台一站式整体解决方案提供商&#xff0c;业务涵盖 批发、连锁、零售行业ERP解决方案、wms仓储解决方案、电商、外勤、移动终端&#xff08;PDA、APP、小程序&#xff09;解决方案。 0x02 漏洞概述 海翔云平台getylist_login.do接口处存在SQL注入漏洞&am…

wmvcore.dll丢失怎么办?解决电脑出现wmvcore.dll丢失问题5个方法

wmvcore.dll缺失5个解决方法与wmvcore.dll丢失原因及文件介绍 引言&#xff1a; 在日常使用电脑的过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是wmvcore.dll缺失。wmvcore.dll是Windows Media Video编码解码相关动态链接库文件之一&#xff0c;它对…

vue3 element plus 表单验证 数组嵌套对象格式验证 动态验证等

基本结构 model 表单数据对象 rules 验证对象 prop model 的键名 <template><el-form ref"ruleFormRef" :model"ruleForm" :rules"rules"><el-form-item label"手机号" prop"mobile"><el-input v-mod…

使用opencv实现更换证件照背景颜色

1 概述 生活中经常要用到各种要求的证件照电子版&#xff0c;红底&#xff0c;蓝底&#xff0c;白底等&#xff0c;大部分情况我们只有其中一种&#xff0c;本文通过opencv实现证件照背景的颜色替换。 1.1 opencv介绍 OpenCV&#xff08;Open Source Computer Vision Librar…

Java第十二篇:连接安全版kafka(Kerberos认证)出现的问题解答

Could not find a ‘KafkaClient’ entry in the JAAS configuration 问题现象 问题原因 原因没有找到&#xff0c;怎么引起的倒是很清楚。原因就是找到不到指定路径下的kafka_client_jaas.conf文件&#xff0c;别看我的路径带了两个//&#xff0c;但没问题的&#xff0c;等同…

Semaphore源码解析

Semaphore源码解析 文章目录 Semaphore源码解析一、Semaphore二、Semaphore 中 Sync、FairSync、NonfairSync2.1 Sync、FairSync、NonfairSync2.2 NonfairSync 下的 tryAcquireShared()2.3 FairSync下的 tryAcquireShared()2.4 tryReleaseShared() 三、semaphore.acquire()四、…

0 NLP: 数据获取与EDA

0数据准备与分析 二分类任务&#xff0c;正负样本共计6W&#xff1b; 数据集下载 https://github.com/SophonPlus/ChineseNlpCorpus/raw/master/datasets/online_shopping_10_cats/online_shopping_10_cats.zip 样本的分布 正负样本中评论字段的长度 &#xff0c;超过500的都…

工具及方法 - 如何阅读epub文件:使用Adobe Digital Editions

EPUB&#xff08;Electronic Publication的缩写&#xff0c;电子出版&#xff09;是一种电子图书标准&#xff0c;由国际数字出版论坛&#xff08;IDPF&#xff09;提出&#xff1b;其中包括3种文件格式标准&#xff08;文件的扩展名为.epub&#xff09;&#xff0c;这个格式已…

哈希和unordered系列封装(C++)

哈希和unordered系列封装 一、哈希1. 概念2. 哈希函数&#xff0c;哈希碰撞哈希函数&#xff08;常用的两个&#xff09;哈希冲突&#xff08;碰撞&#xff09;小结 3. 解决哈希碰撞闭散列线性探测二次探测代码实现载荷因子&#xff08;扩容&#xff09; 开散列哈希桶代码实现扩…