创建手语翻译的故事

背景知识


在本学年开始(17-18)时,我们挚爱的学习场所的行政部门告诉我们:“到了年底,你们每个人都必须保护一个单独的项目。 那些不保护该项目的人将有一名院士。 债务和高利贷(GIA-9),它们将不被允许。” 事实证明,这是一篇论文(在9年级,只是超级)。 从大约9月到12月,我的朋友Kirill( kkirra )和我决定了我们将要进行的项目类型:我想要的东西执行起来不是很困难,但同时又要壮观而新颖。 最后,我们决定:我们决定制作一个人的手的模型,甚至使它运行的是android设备(今年,我和西里尔(Cyril)和我偶然基于我们的学习场所进入了三星IT学校,因此我们想在项目中使用获得的知识)她将输入的文本翻译成手语。

软件部分


Android应用


在截止日期之前约一个月,我们开始了该项目的工作。 工作的第一阶段是开发android应用程序。

老实说,应用程序的布局对我来说一直是,现在仍然是最困难的:我对这些布局及其类型有疑问(我还是九年级学生,甚至来自物理和数学)。 使应用程序在所有设备上看起来同样漂亮也很困难。

除标记外,另一项艰巨的任务是将蓝牙连接到应用程序(我们决定通过蓝牙实现android设备与模型之间的连接):我们在三星学校课程中并未教过此程序,但在互联网上没有太多关于它的信息(我的意思是有关由设备控制的android设备和arduino之间的连接实现的信息。

现在介绍一下代码本身(在文章的最后部分链接到GitHub)。 该程序包括四个活动:“开始”屏幕和每个控制模式的一个活动。

  • 第一种控制模式是文本输入模式,当用户手动输入文本时
  • 第二个-借助语音,该应用程序可以识别用户的语音。
  • 第三是手动模式。 用户可以手动更改手指的位置以描绘程序未提供的手势。

老实说,我为自己的代码感到ham愧:它看起来还没有完成。 事实是,我可以将蓝牙连接封装在一个单独的类中,创建连接方法,发送数据,断开连接等,但是相反,在每个活动中,我再次注册了所有上述内容,因为封装导致了(不是很大)问题。 但是,要解决这些问题,必须花一些时间研究蓝牙的工作,而我也急于编写代码,以便有时间开发和实现硬件。

Arduino编程


在实现软件部分的过程中,需要对Arduino微控制器进行编程,该微控制器从智能手机接收数据并控制操纵器。 编写了一个库,其中包含有关将伺服器连接到Arduino的数据(将伺服器连接到Arduino的触点)以及将文本翻译成手语的方法。 该库的主要部分是一个矩阵,其中包含有关每个手指的位置,俄语字母的相应字母以及简化代码的各种方法的信息。 矩阵如下。

const int navigate [Hand::n][Hand::m]= { {224, 180, 180, 180, 180, 180},// {225, 90, 0, 180, 180, 180},// {226, 0, 0, 0, 0, 0},// {227, 0, 90, 180, 180, 180},// {228, 180, 0, 0,180, 180},// {229, 90, 180, 180, 90, 90},// {230, 90, 180, 180, 90, 90},// {231, 180, 0, 180, 180, 180},// {232, 180, 180, 180, 0, 0},// {233, 180, 180, 180, 0, 0},// {234, 180, 0, 0,180, 180},// {235, 180, 90, 90, 180, 180},// {236, 180, 90, 90, 90, 180},// {237, 180, 0, 0, 180, 0},// {238, 90, 180, 0, 0, 0},// {239, 180, 90, 90, 180, 180},// {240, 180, 0, 180, 0, 0},// {241, 90, 90, 90, 90, 90},// {242, 180, 90, 90, 90, 180},// {243, 0, 180, 180, 180, 0},// {244, 0, 90, 90, 90, 90},// {245, 0, 0, 180, 180, 180},// {246, 180, 0, 0, 180, 180},// {247, 0, 90, 180, 180, 180},// {248, 180, 0, 0, 0, 180},// {249, 180, 0, 0, 0, 180},// {250, 0, 0, 180, 180, 180},// {251, 0, 90, 180, 180, 90},// {252, 0, 0, 180, 180, 180},// {253, 90, 90, 180, 180, 180},// {254, 0, 90, 90, 90, 0},// {255, 90, 90, 90, 180, 180}};// 

“手”是一个库头文件(扩展名为“ .h”),其中包含函数和常量的原型。

现在谈谈翻译方法。 字符转换方法接收字母编码作为输入,搜索所需的行(矩阵的每一行的第一个元素是符号代码),然后根据该行中指示的旋转角度设置伺服器(将符号代码放置在表格中,以便可以根据需要更改编码)表格,而无需更改整个代码),则它会等待几秒钟,以便可以读取这些手势,并且它们不会一个接一个地跟随。 句子翻译方法将句子拆分为字符并使用字符翻译方法。

字符的翻译方法:

 void Hand :: SymbolTranslate(unsigned char a){ //    int str=-1; int i; for(i=0; i<n; i++){ if(navigate[i][0]==(int)(a)){ str=i; break; } } if(str==-1){ return; } else{ First.write(navigate[str][1]); //     Second.write(navigate[str][2]); Third.write(navigate[str][3]); Fourth.write(navigate[str][4]); Fifth.write(navigate[str][5]); delay(200); Serial.println(str); Serial.println("Succsessfull"); } } 

提案翻译方法:

 void Hand :: SentenceTranslate(char* s){ //    unsigned char a; for(int i=0; i< strlen(s); i++){ a=s[i]; SymbolTranslate(a); delay(2000); } } 

该方法还记录带有可接受文本和翻译结果(打印为“ Succsessfull”)的消息,这在调试空闲的 arduino代码时对我们有很大帮助。

硬体


该项目的此阶段的实施是由上述kkirra进行的 。 在开始工作之前,似乎要绘制机械手的图纸并进行组装是一项非常简单的任务,但事实并非如此。

最初,我们想在3D打印机上打印操纵器的详细信息,我们从一家开放的法国项目银行中提取了蓝图(我们也画了自己的蓝图,但后来决定最好从开源中获取它),但是将蓝图发送给打印后,我们了解到了打印的知识。我们的零件将需要数周的时间,而那时我们还没有。 然后,我们决定用简易材料组装机械手:前臂由金属板制成,手指由胶合板制成。 手指在Arduino微控制器的控制下由于伺服而弯曲。 下面是一个示例图。

图片

  • 红色-手指的旋转轴(如果您看着人​​的手指)-这些是关节
  • 绿色-松紧的小松紧带使手指恢复到原始位置(即肌腱)

结论


总结一下。 我们已经组装并编写了手语解释器(我们将其外观简称为“树桩”)。 我们的项目允许不懂手语的人使用俄语手语字母与听力障碍的人进行交流。 该软件的实现允许您快速更改代码,并且在不破坏任何内容的情况下,向其添加其他手语(例如英语)。
将来,我们计划在3D打印机上打印先前选择的模型并进行组装(当我们从考试和其他废话中休息时,将执行此操作)。

总的来说,虽然在固件和外观上不是很漂亮,但结果还是不错的,但主要的是工作草案。 在开展该项目的过程中,我们学到了很多东西(例如,我们需要在全年,年初,而不是交付之前的几周内开始为整个项目设计的事实),为此,我们非常感谢帮助我们的老师,尤其是达米尔我们的科学科学家Muratovich帮助我们解决了与该项目有关的大多数问题。

感谢您阅读到底!

如果您对它感兴趣,那么所有项目材料(包括工作文本,演示文稿等)都可以在此处公开获得。

再次感谢您的关注!

Source: https://habr.com/ru/post/zh-CN415681/


All Articles