极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1344|回复: 0

机器人制作开源方案 | 图书管理助手

[复制链接]
发表于 2024-1-15 11:20:53 | 显示全部楼层 |阅读模式
本帖最后由 机器谱 于 2024-1-15 11:20 编辑

作者:丁位 朱红磊 程国正 杨秀萍 丁语林
单位:黑龙江科技大学
指导老师:邵文冕 刘安平

1. 场景调研
1.1 研究背景及意义
     通过查阅资料,我们团队了解到自2015年起中国公共图书馆图书流通人次逐年增加,2019年中国公共图书馆图书流通人次达90135万人次,较2018年增加了8103万人次,同比增长9.88%,2020年受新冠肺炎疫情影响,中国公共图书馆图书流通人次大幅下滑,2020年中国公共图书馆图书流通人次为54145.81万人次,较2019年减少了35989.19万人次,同比减少39.93%。据统计2021年末全国共有公共图书馆3215个,比上年末增加3个;从业人员59301人,增加1321人;其中具有高级职称人员7413人,占12.5%;具有中级职称人员18979人,占32.0%。
       随着中国公共图书馆图书流通人次的增加,书刊文献外借册次也随之增长,2019年中国公共图书馆书刊文献外借册次达61373万册次,较2018年增加了3363万册次,同比增长5.80%,2020年受新冠肺炎疫情影响,中国公共图书馆书刊文献外借册次大幅下滑,2020年中国公共图书馆书刊文献外借册次为42087.15万册次,较2019年减少了19285.85万册次,同比减少31.42%。2019年中国公共图书馆书刊文献外借人次达26609万人次,较2018年增加了795万人次,同比增长3.08%,2020年受新冠肺炎疫情影响,中国公共图书馆书刊文献外借人次大幅下滑,2020年中国公共图书馆书刊文献外借人次为17466.62万人次,较2019年减少了9142.38万人次,同比减少34.36%。
       通过研究数据发现,在图书馆的日常管理中,图书的归类、搬运和上下架等作业需要花费大量人力和时间,增加了图书馆员的劳动强度,有时还会出现图书归类错误和上架错误等现象。目前,多数图书馆利用二维条码和数据库技术实现了图书信息系统管理,即图书采购、图书典藏、读者借还书等环节的信息化管理,提升了图书馆的管理和服务水平。在信息化浪潮中,图书馆缺少以机械化为基础的自动化装置。图书馆作业的自动化和智能化,能够从根本上减轻图书馆员的劳动强度、提高工作效半,尤其适用于采用闭架借阅图书的图书馆。在博物馆和档案馆,重要文献资料需要在恒温、恒湿环境下保存。利用机器人实现图书和文献资料的归类、自动存取操作,不仅能碱少馆员频繁进出馆灏室对重要文献的保存环境造成扰动和破坏,更有利于文献保护。因此,自动化技术和信息技术的有效融合,是未来图书馆的重要发展趋势。
       中国已经进入老龄化社会,如果能将图书馆信息资理系统、图书自动存取系统和物流配送系统结合起来,可以实现读者居家借阅和归还图书的目标,满足高龄读者自由借闵图书的需要。因此研究和开发图书自动存取装置是一项有社会和经济价值的研究项目。
1.2 图书馆图书自动存取装置的发展现状
       目前大部分图书馆都是利用人工整理、清点、查找和上下架阁书,耗费了大量的时间和劳动力。为了提高图书馆自动化平,图书馆图书自动存取机器人应运而生。目前图书馆机器人主要用于图书的搬运和自动存取,自动存取的主要形式有3种:
       ① 自助图书馆,它是基于书架的自动化,辅助自动传送系统来实现图书自动存取。
       ② 自动仓储式阁书馆,它基于移动搬运机器人与自动化立体仓库的配合,完成图书的自动存取。
       ③ 移动式阁书馆机器人,它完全依赖于移动式服务机器人来完成图书的自动存取。
       基于项目背景调研情况,本项目决定研究一款基于轨迹规划的图书归还机器人。


2. 机器人本体技术路线说明
      项目的设计分为电气设计、机械设计、算法设计及外观设计,以下将主要论述机器人实现自动路径规划与抓取搬运的技术路线分析。
2.1 电路设计
      主板使用基于Arduino开源方案的开发者套件的Basra板加BigFish拓展版,主板CPU 采用AVR ATMEGA328型控制芯片,支持C语言编程方式。该系统的硬件电路包括:电源电路、串口通信电路、MCU基本电路、烧写接口、显示模块、AD/DA转换模块、输入模块、IIC存储模块等其他电路模块电路。通过5V电源输入为主板供电,经拓展版为舵机、电机及各模块供电。
2.2 机械设计
      机械臂采用串联式机械臂(也叫关节机械臂),通过四个关节舵机实现四自由度伸展控制。各个关节位置及端点的位置被固定,端点的位置处各个关节却可以有多个不同位置。抓取机构通过齿轮啮合实现由一个舵机精准控制完成抓取动作。车体结构设计通过万向轮实现简化车体地盘结构设计,为更多模块的搭载提供空间。


2.3 功能实现路线
      该项目行走轨迹采用循迹加路径规划,通过灰度传感器加白标传感器形成循迹系统,后采用路径规划算法,实现机器人行程轨迹的控制与自动调整。通过外红外模块感应到达指定位置后进入已完成设定的抓取或放置程序完成整个的工作流程。


3. 作品创新点
      ① 便捷性:机器人通过路径规划自主归还图书,节约了许多的人力资源。
      ② 经济性:充分考虑到机器人整体结构以及整体构件的选择,使其装配更加经济便捷。
      ③ 工作效率高:通过机器人自主归还和取放图书可以节约更多的人力以及物力资源。
      ④ 可移动性更高:机器人采用万向轮作为移动轮,可以在狭窄的两书架之间更好的移动。在对图书馆机器人进行结构设计时,首先要考患其工作坏境。图书馆机器人进行图书自动存取的工作空间为两书相之间,空问较狭车设计时必须限制机器人最大宽度。


4. 作品难点及解决方案
      ① 机械臂的抓取力不足,导致在取书或者还书程中,对于书本的抓取可能存在松懈,使得书本掉落。
      解决方案:通过提供输出电压更大的设备来控制舵机,使其机械臂的抓取力得到提升,以便于能更好的抓取图书。
      ② 灰度传感器以及白标传感器形成的循迹系统传感器感应不良,传感器感应精度存在误差,可能使其在通过轨迹规划过程归还图书的过程中存在一定的轨迹偏差,以及错位等情况。
      解决办法:在传感器精度不良的情况下我们添加了蓝牙遥控装置,使得小车在归还书籍的过程中,能够更加精确的把图书归还到相应的位置,蓝牙遥控装置的作用是防止其轨迹偏离航线。


5. 经济效益
      对于目前国内图书馆以及高校图书馆而言,大部分图书馆的借还图书过程都是通过人为手动进行,而只有极少数的图书馆或者高校图书馆配备了自动还书机器人,所以对于我们这一款图书管理助手而言,如果能够实现研发并且投入生产,能产生比较可观的经济效益以及价值。


6. 示例程序
  1. #include<MsTimer2.h>

  2. #include <Servo.h>

  3. int a,b,c,d,e;

  4. int pin[3] = {A0, A4, A3}; //如上图,从左至右对应

  5. int velocity; //定义速率

  6. int temp; //设置标志量

  7. byte value;

  8. byte value_his = 0; //记录上一次的传感器值

  9. //抓取定义***********起

  10. Servo servo_pin_4;

  11. Servo servo_pin_7;

  12. Servo servo_pin_11;

  13. Servo servo_pin_3;

  14. Servo servo_pin_8;

  15. Servo servo_pin_12;

  16. int D3[]={15,76,76,15,76};

  17. int D8[]={110,110,110,110,110};

  18. int D7[]={160,70,160,70};

  19. int D11[]={160,75,160,75};

  20. int D4[]={190,190,190,190};

  21. //抓取定义***********止

  22. void setup()

  23. {

  24. pinMode( 5 , OUTPUT);

  25. pinMode( 6 , OUTPUT);

  26. pinMode( 9 , OUTPUT);

  27. pinMode( 10 , OUTPUT);

  28. MsTimer2::set(50,flash); //每 50ms 溢出一次

  29. MsTimer2::start();

  30. //抓取初始化***********起

  31. servo_pin_3.attach(3);

  32. servo_pin_8.attach(8);

  33. servo_pin_7.attach(7);

  34. servo_pin_11.attach(11);

  35. servo_pin_4.attach(4);

  36. //抓取初始化***********止

  37. delay(1000);

  38. }

  39. void flash(){

  40. if(!(digitalRead(16))) //A2 口接近红外

  41. {

  42. velocity=150;

  43. temp=1;

  44. }

  45. }

  46. void loop()

  47. {

  48. while(temp==1)

  49. {

  50. value = 0;

  51. for(int i=0; i<3; i++)

  52. {

  53. value |= (digitalRead(pin[i]) << i);

  54. }

  55. if(value == 0x07)

  56. { //当传感器都没有触发时默认为上一次的值

  57. value = value_his;

  58. }

  59. switch (value)

  60. {

  61. case 0x00: //全部触发

  62. Forwards();

  63. break;

  64. case 0x01: //触发右边两个

  65. while(digitalRead(pin[1])){ //通过 while 循环使小车回到跑道中间

  66. Right();

  67. }

  68. break;

  69. case 0x03: //触发右边一个

  70. while(digitalRead(pin[1]))

  71. {

  72. Right();

  73. }

  74. break;

  75. case 0x04: //触发左边两个

  76. while(digitalRead(pin[1]))

  77. {

  78. Left();

  79. }

  80. break;

  81. case 0x05: //触发中间一个

  82. Forwards();

  83. break;

  84. case 0x06: //触发左边一个

  85. while(digitalRead(pin[1]))

  86. {

  87. Left();

  88. }

  89. break;

  90. default:

  91. Stop();

  92. }

  93. value_his = value;

  94. if(!(digitalRead(16)))

  95. {

  96. temp=0;

  97. }

  98. }

  99. velocity=0;

  100. }

  101. void Left()

  102. {

  103. //analogWrite( 5 , velocity );

  104. //analogWrite( 6 , 0 );

  105. //analogWrite( 9 , 0 );

  106. //analogWrite( 10 , 0 );

  107. digitalWrite( 5 , HIGH );

  108. digitalWrite( 6 , LOW );

  109. digitalWrite( 9 , LOW );

  110. digitalWrite( 10 , LOW );

  111. }

  112. void Right()

  113. {

  114. //analogWrite( 5 , 0 );

  115. //analogWrite( 6 , 0 );

  116. //analogWrite( 9 , velocity );

  117. //analogWrite( 10 , 0 );

  118. digitalWrite( 5 , LOW );

  119. digitalWrite( 6 , LOW );

  120. digitalWrite( 9 , HIGH );

  121. digitalWrite( 10 , LOW );

  122. }

  123. void Forwards()

  124. {

  125. //analogWrite( 5 , velocity );

  126. //analogWrite( 6 , 0 );

  127. //analogWrite( 9 , velocity );

  128. //analogWrite( 10 , 0 );

  129. digitalWrite( 5 , HIGH );

  130. digitalWrite( 6 , LOW );

  131. digitalWrite( 9 , HIGH );

  132. digitalWrite( 10 , LOW );

  133. }

  134. void Stop()

  135. {

  136. //analogWrite( 5 , 0 );

  137. //analogWrite( 6 , 0 );

  138. //analogWrite( 9 , 0 );

  139. //analogWrite( 10 , 0 );

  140. digitalWrite( 5 , LOW );

  141. digitalWrite( 6 , LOW );

  142. digitalWrite( 9 , LOW );

  143. digitalWrite( 10 , LOW );

  144. }

  145. void zhuaqu()//抓取函数

  146. {

  147. for(a=100;a<=169;a+=1)

  148. {servo_pin_3.write(a);delay(60);}

  149. delay(1000);

  150. for(a=130;a<=170;a+=1)

  151. {servo_pin_12.write(a);delay(60);}

  152. delay(1000);

  153. for(b=175;b>=155;b-=1)

  154. {servo_pin_11.write(b);delay(60);}

  155. for(a=190;a>=165;a-=1)

  156. {servo_pin_7.write(a);delay(60);}

  157. delay(1000);

  158. for(b=155;b>=115;b-=1)

  159. {servo_pin_11.write(b);delay(60);}

  160. for(a=165;a>=135;a-=1)

  161. {servo_pin_7.write(a);delay(60);}

  162. delay(1000);

  163. for(b=115;b>=75;b-=1)

  164. {servo_pin_11.write(b);delay(60);}

  165. for(a=135;a>=110;a-=1)

  166. {servo_pin_7.write(a);delay(60);}

  167. delay(1600);

  168. //for(c=170;c>=114;c-=1)

  169. //{servo_pin_4.write(c);delay(60);}

  170. //delay(2000);

  171. for(c=170;c>=130;c-=1)

  172. {servo_pin_12.write(c);delay(60);}

  173. delay(2000);

  174. for(b=75;b<=125;b+=1)

  175. {servo_pin_11.write(b);delay(60);}

  176. for(a=110;a<=150;a+=1)

  177. {servo_pin_7.write(a);delay(60);}

  178. for(b=125;b<=175;b+=1)

  179. {servo_pin_11.write(b);delay(60);}

  180. for(a=150;a<=190;a+=1)

  181. {servo_pin_7.write(a);delay(60);}

  182. delay(2000);

  183. delay(23000);

  184. //下场景

  185. for(b=175;b>=155;b-=1)

  186. {servo_pin_11.write(b);delay(60);}

  187. for(a=190;a>=165;a-=1)

  188. {servo_pin_7.write(a);delay(60);}

  189. delay(1000);

  190. for(b=155;b>=115;b-=1)

  191. {servo_pin_11.write(b);delay(60);}

  192. for(a=165;a>=135;a-=1)

  193. {servo_pin_7.write(a);delay(60);}

  194. delay(1000);

  195. for(b=115;b>=75;b-=1)

  196. {servo_pin_11.write(b);delay(60);}

  197. for(a=135;a>=110;a-=1)

  198. {servo_pin_7.write(a);delay(60);}

  199. delay(1600);

  200. //for(c=114;c<=170;c+=1)

  201. //{servo_pin_4.write(c);delay(60);}

  202. //delay(1000);

  203. for(c=130;c<=170;c+=1)

  204. {servo_pin_12.write(c);delay(60);}

  205. delay(1000);

  206. for(b=75;b<=125;b+=1)

  207. {servo_pin_11.write(b);delay(60);}

  208. for(a=110;a<=150;a+=1)

  209. {servo_pin_7.write(a);delay(60);}

  210. for(b=125;b<=175;b+=1)

  211. {servo_pin_11.write(b);delay(60);}

  212. for(a=150;a<=190;a+=1)

  213. {servo_pin_7.write(a);delay(60);}

  214. delay(1000);

  215. for(a=169;a>=100;a-=1)

  216. {servo_pin_3.write(a);delay(60);}

  217. delay(200000);

  218. }
复制代码

更多详情请见: 【S059】图书管理助手 https://www.robotway.com/h-col-326.html


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-28 00:00 , Processed in 0.044646 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表