├── hardware
├── plate.cb
├── plate.dxf
├── plate.gcode
└── plate.svg
├── readme.markdown
└── src
├── ai
├── camera_capture.sh
├── camera_watch.sh
├── explore_generate_data.ipynb
├── explore_run.ipynb
├── explore_train.ipynb
├── generate_data.py
├── run.py
├── train.py
└── video.py
└── nodebot
├── nodebot.js
├── package.json
├── tm1640_led_screen.js
├── tm1640_test.js
└── udp_receive.js
/hardware/plate.cb:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 0
6 |
7 |
8 |
9 | 0
10 |
11 |
12 | 3
13 |
14 |
15 | 20,109.899891,0
16 | 20,20,0
17 | 134.899721,20,0
18 | 134.899721,109.899891,0
19 |
20 |
21 |
22 | 3
23 |
24 |
25 | 33.570998,31.57118,0
26 | 32.999861,32.950246,0
27 | 34.95006,34.899888,0
28 | 36.899709,32.950246,0
29 | 34.95006,31.000034,0
30 |
31 |
32 |
33 | 3
34 |
35 |
36 | 116.328645,98.329249,0
37 | 116.899788,96.950192,0
38 | 116.328646,95.571133,0
39 | 114.949587,94.999991,0
40 | 112.999939,96.950192,0
41 | 114.949587,98.90039,0
42 |
43 |
44 |
45 | 3
46 |
47 |
48 | 116.32865,31.57118,0
49 | 114.949587,31.000034,0
50 | 112.999939,32.950246,0
51 | 114.949587,34.899888,0
52 | 116.899788,32.950246,0
53 |
54 |
55 |
56 | 3
57 |
58 |
59 | 33.571003,98.329249,0
60 | 34.95006,98.90039,0
61 | 36.899709,96.950192,0
62 | 34.95006,94.999991,0
63 | 33.571002,95.571133,0
64 | 32.999861,96.950192,0
65 |
66 |
67 |
68 |
69 |
70 |
71 | -1
72 |
73 | 0,0
74 | 0,0
75 | 255,165,0
76 |
77 | Unspecified
78 |
79 |
80 |
81 |
82 |
83 |
84 | -0.4
85 | 0.4
86 | 0
87 | DepthFirst
88 | 0
89 | 0
90 | 3
91 | CW
92 | 60
93 | 0
94 | Undefined
95 |
96 | 36
97 | 33
98 | 35
99 | 34
100 |
101 | XY
102 | Experimental
103 | Roughing
104 | 0
105 | 0
106 | Unspecified
107 | 300
108 | 300
109 | 0.7
110 |
111 |
112 |
113 | Holes
114 |
115 |
116 | -0.4
117 | 0.2
118 | 0
119 | DepthFirst
120 | 0
121 | 0
122 | 3
123 | CW
124 | 50
125 | 0
126 | Undefined
127 |
128 | 32
129 |
130 | XY
131 | Experimental
132 | Roughing
133 | 0
134 | 0
135 | Unspecified
136 | 300
137 | 600
138 | 0.7
139 |
140 |
141 |
142 | Outside
143 |
144 |
145 |
146 | 0,0
147 | 0,0
148 | 255,165,0
149 |
150 | Unspecified
151 |
152 |
153 |
154 | None
155 | 0
156 |
157 |
158 |
159 |
160 | All
161 | Base
162 | Part1
163 |
--------------------------------------------------------------------------------
/hardware/plate.dxf:
--------------------------------------------------------------------------------
1 | 0
2 | SECTION
3 | 2
4 | HEADER
5 | 9
6 | $ACADVER
7 | 1
8 | AC1014
9 | 9
10 | $HANDSEED
11 | 5
12 | FFFF
13 | 9
14 | $MEASUREMENT
15 | 70
16 | 1
17 | 0
18 | ENDSEC
19 | 0
20 | SECTION
21 | 2
22 | TABLES
23 | 0
24 | TABLE
25 | 2
26 | VPORT
27 | 5
28 | 8
29 | 330
30 | 0
31 | 100
32 | AcDbSymbolTable
33 | 70
34 | 4
35 | 0
36 | VPORT
37 | 5
38 | 2E
39 | 330
40 | 8
41 | 100
42 | AcDbSymbolTableRecord
43 | 100
44 | AcDbViewportTableRecord
45 | 2
46 | *ACTIVE
47 | 70
48 | 0
49 | 10
50 | 0.0
51 | 20
52 | 0.0
53 | 11
54 | 1.0
55 | 21
56 | 1.0
57 | 12
58 | 210.0
59 | 22
60 | 148.5
61 | 13
62 | 0.0
63 | 23
64 | 0.0
65 | 14
66 | 10.0
67 | 24
68 | 10.0
69 | 15
70 | 10.0
71 | 25
72 | 10.0
73 | 16
74 | 0.0
75 | 26
76 | 0.0
77 | 36
78 | 1.0
79 | 17
80 | 0.0
81 | 27
82 | 0.0
83 | 37
84 | 0.0
85 | 40
86 | 341.0
87 | 41
88 | 1.24
89 | 42
90 | 50.0
91 | 43
92 | 0.0
93 | 44
94 | 0.0
95 | 50
96 | 0.0
97 | 51
98 | 0.0
99 | 71
100 | 0
101 | 72
102 | 100
103 | 73
104 | 1
105 | 74
106 | 3
107 | 75
108 | 0
109 | 76
110 | 0
111 | 77
112 | 0
113 | 78
114 | 0
115 | 0
116 | ENDTAB
117 | 0
118 | TABLE
119 | 2
120 | LTYPE
121 | 5
122 | 5
123 | 330
124 | 0
125 | 100
126 | AcDbSymbolTable
127 | 70
128 | 1
129 | 0
130 | LTYPE
131 | 5
132 | 14
133 | 330
134 | 5
135 | 100
136 | AcDbSymbolTableRecord
137 | 100
138 | AcDbLinetypeTableRecord
139 | 2
140 | BYBLOCK
141 | 70
142 | 0
143 | 3
144 |
145 | 72
146 | 65
147 | 73
148 | 0
149 | 40
150 | 0.0
151 | 0
152 | LTYPE
153 | 5
154 | 15
155 | 330
156 | 5
157 | 100
158 | AcDbSymbolTableRecord
159 | 100
160 | AcDbLinetypeTableRecord
161 | 2
162 | BYLAYER
163 | 70
164 | 0
165 | 3
166 |
167 | 72
168 | 65
169 | 73
170 | 0
171 | 40
172 | 0.0
173 | 0
174 | LTYPE
175 | 5
176 | 16
177 | 330
178 | 5
179 | 100
180 | AcDbSymbolTableRecord
181 | 100
182 | AcDbLinetypeTableRecord
183 | 2
184 | CONTINUOUS
185 | 70
186 | 0
187 | 3
188 | Solid line
189 | 72
190 | 65
191 | 73
192 | 0
193 | 40
194 | 0.0
195 | 0
196 | ENDTAB
197 | 0
198 | TABLE
199 | 2
200 | LAYER
201 | 5
202 | 2
203 | 100
204 | AcDbSymbolTable
205 | 70
206 | 2
207 | 0
208 | LAYER
209 | 5
210 | 50
211 | 100
212 | AcDbSymbolTableRecord
213 | 100
214 | AcDbLayerTableRecord
215 | 2
216 | 0
217 | 70
218 | 0
219 | 6
220 | CONTINUOUS
221 | 0
222 | LAYER
223 | 5
224 | 51
225 | 100
226 | AcDbSymbolTableRecord
227 | 100
228 | AcDbLayerTableRecord
229 | 2
230 | Base
231 | 70
232 | 0
233 | 6
234 | CONTINUOUS
235 | 0
236 | ENDTAB
237 | 0
238 | TABLE
239 | 2
240 | STYLE
241 | 5
242 | 3
243 | 330
244 | 0
245 | 100
246 | AcDbSymbolTable
247 | 70
248 | 1
249 | 0
250 | STYLE
251 | 5
252 | 11
253 | 330
254 | 3
255 | 100
256 | AcDbSymbolTableRecord
257 | 100
258 | AcDbTextStyleTableRecord
259 | 2
260 | STANDARD
261 | 70
262 | 0
263 | 40
264 | 0.0
265 | 41
266 | 1.0
267 | 50
268 | 0.0
269 | 71
270 | 0
271 | 42
272 | 2.5
273 | 3
274 | txt
275 | 4
276 |
277 | 0
278 | ENDTAB
279 | 0
280 | TABLE
281 | 2
282 | VIEW
283 | 5
284 | 6
285 | 330
286 | 0
287 | 100
288 | AcDbSymbolTable
289 | 70
290 | 0
291 | 0
292 | ENDTAB
293 | 0
294 | TABLE
295 | 2
296 | UCS
297 | 5
298 | 7
299 | 330
300 | 0
301 | 100
302 | AcDbSymbolTable
303 | 70
304 | 0
305 | 0
306 | ENDTAB
307 | 0
308 | TABLE
309 | 2
310 | APPID
311 | 5
312 | 9
313 | 330
314 | 0
315 | 100
316 | AcDbSymbolTable
317 | 70
318 | 2
319 | 0
320 | APPID
321 | 5
322 | 12
323 | 330
324 | 9
325 | 100
326 | AcDbSymbolTableRecord
327 | 100
328 | AcDbRegAppTableRecord
329 | 2
330 | ACAD
331 | 70
332 | 0
333 | 0
334 | ENDTAB
335 | 0
336 | TABLE
337 | 2
338 | DIMSTYLE
339 | 5
340 | A
341 | 330
342 | 0
343 | 100
344 | AcDbSymbolTable
345 | 70
346 | 1
347 | 0
348 | DIMSTYLE
349 | 105
350 | 27
351 | 330
352 | A
353 | 100
354 | AcDbSymbolTableRecord
355 | 100
356 | AcDbDimStyleTableRecord
357 | 2
358 | ISO-25
359 | 70
360 | 0
361 | 3
362 |
363 | 4
364 |
365 | 5
366 |
367 | 6
368 |
369 | 7
370 |
371 | 40
372 | 1.0
373 | 41
374 | 2.5
375 | 42
376 | 0.625
377 | 43
378 | 3.75
379 | 44
380 | 1.25
381 | 45
382 | 0.0
383 | 46
384 | 0.0
385 | 47
386 | 0.0
387 | 48
388 | 0.0
389 | 140
390 | 2.5
391 | 141
392 | 2.5
393 | 142
394 | 0.0
395 | 143
396 | 0.03937007874016
397 | 144
398 | 1.0
399 | 145
400 | 0.0
401 | 146
402 | 1.0
403 | 147
404 | 0.625
405 | 71
406 | 0
407 | 72
408 | 0
409 | 73
410 | 0
411 | 74
412 | 0
413 | 75
414 | 0
415 | 76
416 | 0
417 | 77
418 | 1
419 | 78
420 | 8
421 | 170
422 | 0
423 | 171
424 | 3
425 | 172
426 | 1
427 | 173
428 | 0
429 | 174
430 | 0
431 | 175
432 | 0
433 | 176
434 | 0
435 | 177
436 | 0
437 | 178
438 | 0
439 | 270
440 | 2
441 | 271
442 | 2
443 | 272
444 | 2
445 | 273
446 | 2
447 | 274
448 | 3
449 | 340
450 | 11
451 | 275
452 | 0
453 | 280
454 | 0
455 | 281
456 | 0
457 | 282
458 | 0
459 | 283
460 | 0
461 | 284
462 | 8
463 | 285
464 | 0
465 | 286
466 | 0
467 | 287
468 | 3
469 | 288
470 | 0
471 | 0
472 | ENDTAB
473 | 0
474 | TABLE
475 | 2
476 | BLOCK_RECORD
477 | 5
478 | 1
479 | 330
480 | 0
481 | 100
482 | AcDbSymbolTable
483 | 70
484 | 1
485 | 0
486 | BLOCK_RECORD
487 | 5
488 | 1F
489 | 330
490 | 1
491 | 100
492 | AcDbSymbolTableRecord
493 | 100
494 | AcDbBlockTableRecord
495 | 2
496 | *MODEL_SPACE
497 | 0
498 | BLOCK_RECORD
499 | 5
500 | 1B
501 | 330
502 | 1
503 | 100
504 | AcDbSymbolTableRecord
505 | 100
506 | AcDbBlockTableRecord
507 | 2
508 | *PAPER_SPACE
509 | 0
510 | ENDTAB
511 | 0
512 | ENDSEC
513 | 0
514 | SECTION
515 | 2
516 | BLOCKS
517 | 0
518 | BLOCK
519 | 5
520 | 20
521 | 330
522 | 1F
523 | 100
524 | AcDbEntity
525 | 8
526 | 0
527 | 100
528 | AcDbBlockBegin
529 | 2
530 | *MODEL_SPACE
531 | 70
532 | 0
533 | 10
534 | 0.0
535 | 20
536 | 0.0
537 | 30
538 | 0.0
539 | 3
540 | *MODEL_SPACE
541 | 1
542 |
543 | 0
544 | ENDBLK
545 | 5
546 | 21
547 | 330
548 | 1F
549 | 100
550 | AcDbEntity
551 | 8
552 | 0
553 | 100
554 | AcDbBlockEnd
555 | 0
556 | BLOCK
557 | 5
558 | 1C
559 | 330
560 | 1B
561 | 100
562 | AcDbEntity
563 | 67
564 | 1
565 | 8
566 | 0
567 | 100
568 | AcDbBlockBegin
569 | 2
570 | *PAPER_SPACE
571 | 1
572 |
573 | 0
574 | ENDBLK
575 | 5
576 | 1D
577 | 330
578 | 1B
579 | 100
580 | AcDbEntity
581 | 67
582 | 1
583 | 8
584 | 0
585 | 100
586 | AcDbBlockEnd
587 | 0
588 | ENDSEC
589 | 0
590 | SECTION
591 | 2
592 | ENTITIES
593 | 0
594 | LINE
595 | 5
596 | 100
597 | 100
598 | AcDbEntity
599 | 8
600 | Base
601 | 62
602 | 7
603 | 100
604 | AcDbLine
605 | 10
606 | 0.050161
607 | 20
608 | 89.949761
609 | 30
610 | 0.0
611 | 11
612 | 0.050161
613 | 21
614 | 0.049870
615 | 31
616 | 0.0
617 | 0
618 | LINE
619 | 5
620 | 101
621 | 100
622 | AcDbEntity
623 | 8
624 | Base
625 | 62
626 | 7
627 | 100
628 | AcDbLine
629 | 10
630 | 0.050161
631 | 20
632 | 0.049870
633 | 30
634 | 0.0
635 | 11
636 | 114.949882
637 | 21
638 | 0.049870
639 | 31
640 | 0.0
641 | 0
642 | LINE
643 | 5
644 | 102
645 | 100
646 | AcDbEntity
647 | 8
648 | Base
649 | 62
650 | 7
651 | 100
652 | AcDbLine
653 | 10
654 | 114.949882
655 | 20
656 | 0.049870
657 | 30
658 | 0.0
659 | 11
660 | 114.949882
661 | 21
662 | 89.949761
663 | 31
664 | 0.0
665 | 0
666 | LINE
667 | 5
668 | 103
669 | 100
670 | AcDbEntity
671 | 8
672 | Base
673 | 62
674 | 7
675 | 100
676 | AcDbLine
677 | 10
678 | 114.949882
679 | 20
680 | 89.949761
681 | 30
682 | 0.0
683 | 11
684 | 0.050161
685 | 21
686 | 89.949761
687 | 31
688 | 0.0
689 | 0
690 | LINE
691 | 5
692 | 104
693 | 100
694 | AcDbEntity
695 | 8
696 | Base
697 | 62
698 | 7
699 | 100
700 | AcDbLine
701 | 10
702 | 0.050161
703 | 20
704 | 89.949761
705 | 30
706 | 0.0
707 | 11
708 | 0.050161
709 | 21
710 | 89.949761
711 | 31
712 | 0.0
713 | 0
714 | SPLINE
715 | 5
716 | 105
717 | 100
718 | AcDbEntity
719 | 8
720 | Base
721 | 62
722 | 7
723 | 100
724 | AcDbSpline
725 | 70
726 | 8
727 | 71
728 | 3
729 | 72
730 | 8
731 | 73
732 | 4
733 | 74
734 | 0
735 | 40
736 | 0
737 | 40
738 | 0
739 | 40
740 | 0
741 | 40
742 | 0
743 | 40
744 | 1
745 | 40
746 | 1
747 | 40
748 | 1
749 | 40
750 | 1
751 | 10
752 | 15.000221
753 | 20
754 | 78.950260
755 | 30
756 | 0.0
757 | 10
758 | 16.077117
759 | 20
760 | 78.950066
761 | 30
762 | 0.0
763 | 10
764 | 16.949979
765 | 20
766 | 78.076957
767 | 30
768 | 0.0
769 | 10
770 | 16.949870
771 | 20
772 | 77.000062
773 | 30
774 | 0.0
775 | 0
776 | SPLINE
777 | 5
778 | 106
779 | 100
780 | AcDbEntity
781 | 8
782 | Base
783 | 62
784 | 7
785 | 100
786 | AcDbSpline
787 | 70
788 | 8
789 | 71
790 | 3
791 | 72
792 | 8
793 | 73
794 | 4
795 | 74
796 | 0
797 | 40
798 | 0
799 | 40
800 | 0
801 | 40
802 | 0
803 | 40
804 | 0
805 | 40
806 | 1
807 | 40
808 | 1
809 | 40
810 | 1
811 | 40
812 | 1
813 | 10
814 | 16.949870
815 | 20
816 | 77.000062
817 | 30
818 | 0.0
819 | 10
820 | 16.949981
821 | 20
822 | 75.923165
823 | 30
824 | 0.0
825 | 10
826 | 16.077118
827 | 20
828 | 75.050055
829 | 30
830 | 0.0
831 | 10
832 | 15.000221
833 | 20
834 | 75.049861
835 | 30
836 | 0.0
837 | 0
838 | SPLINE
839 | 5
840 | 107
841 | 100
842 | AcDbEntity
843 | 8
844 | Base
845 | 62
846 | 7
847 | 100
848 | AcDbSpline
849 | 70
850 | 8
851 | 71
852 | 3
853 | 72
854 | 8
855 | 73
856 | 4
857 | 74
858 | 0
859 | 40
860 | 0
861 | 40
862 | 0
863 | 40
864 | 0
865 | 40
866 | 0
867 | 40
868 | 1
869 | 40
870 | 1
871 | 40
872 | 1
873 | 40
874 | 1
875 | 10
876 | 15.000221
877 | 20
878 | 75.049861
879 | 30
880 | 0.0
881 | 10
882 | 14.482980
883 | 20
884 | 75.049808
885 | 30
886 | 0.0
887 | 10
888 | 13.986908
889 | 20
890 | 75.255258
891 | 30
892 | 0.0
893 | 10
894 | 13.621163
895 | 20
896 | 75.621003
897 | 30
898 | 0.0
899 | 0
900 | SPLINE
901 | 5
902 | 108
903 | 100
904 | AcDbEntity
905 | 8
906 | Base
907 | 62
908 | 7
909 | 100
910 | AcDbSpline
911 | 70
912 | 8
913 | 71
914 | 3
915 | 72
916 | 8
917 | 73
918 | 4
919 | 74
920 | 0
921 | 40
922 | 0
923 | 40
924 | 0
925 | 40
926 | 0
927 | 40
928 | 0
929 | 40
930 | 1
931 | 40
932 | 1
933 | 40
934 | 1
935 | 40
936 | 1
937 | 10
938 | 13.621163
939 | 20
940 | 75.621003
941 | 30
942 | 0.0
943 | 10
944 | 13.255418
945 | 20
946 | 75.986748
947 | 30
948 | 0.0
949 | 10
950 | 13.049968
951 | 20
952 | 76.482820
953 | 30
954 | 0.0
955 | 10
956 | 13.050022
957 | 20
958 | 77.000062
959 | 30
960 | 0.0
961 | 0
962 | SPLINE
963 | 5
964 | 109
965 | 100
966 | AcDbEntity
967 | 8
968 | Base
969 | 62
970 | 7
971 | 100
972 | AcDbSpline
973 | 70
974 | 8
975 | 71
976 | 3
977 | 72
978 | 8
979 | 73
980 | 4
981 | 74
982 | 0
983 | 40
984 | 0
985 | 40
986 | 0
987 | 40
988 | 0
989 | 40
990 | 0
991 | 40
992 | 1
993 | 40
994 | 1
995 | 40
996 | 1
997 | 40
998 | 1
999 | 10
1000 | 13.050022
1001 | 20
1002 | 77.000062
1003 | 30
1004 | 0.0
1005 | 10
1006 | 13.049969
1007 | 20
1008 | 77.517303
1009 | 30
1010 | 0.0
1011 | 10
1012 | 13.255419
1013 | 20
1014 | 78.013374
1015 | 30
1016 | 0.0
1017 | 10
1018 | 13.621164
1019 | 20
1020 | 78.379119
1021 | 30
1022 | 0.0
1023 | 0
1024 | SPLINE
1025 | 5
1026 | 10a
1027 | 100
1028 | AcDbEntity
1029 | 8
1030 | Base
1031 | 62
1032 | 7
1033 | 100
1034 | AcDbSpline
1035 | 70
1036 | 8
1037 | 71
1038 | 3
1039 | 72
1040 | 8
1041 | 73
1042 | 4
1043 | 74
1044 | 0
1045 | 40
1046 | 0
1047 | 40
1048 | 0
1049 | 40
1050 | 0
1051 | 40
1052 | 0
1053 | 40
1054 | 1
1055 | 40
1056 | 1
1057 | 40
1058 | 1
1059 | 40
1060 | 1
1061 | 10
1062 | 13.621164
1063 | 20
1064 | 78.379119
1065 | 30
1066 | 0.0
1067 | 10
1068 | 13.986909
1069 | 20
1070 | 78.744863
1071 | 30
1072 | 0.0
1073 | 10
1074 | 14.482980
1075 | 20
1076 | 78.950313
1077 | 30
1078 | 0.0
1079 | 10
1080 | 15.000221
1081 | 20
1082 | 78.950260
1083 | 30
1084 | 0.0
1085 | 0
1086 | LINE
1087 | 5
1088 | 10b
1089 | 100
1090 | AcDbEntity
1091 | 8
1092 | Base
1093 | 62
1094 | 7
1095 | 100
1096 | AcDbLine
1097 | 10
1098 | 15.000221
1099 | 20
1100 | 78.950260
1101 | 30
1102 | 0.0
1103 | 11
1104 | 15.000221
1105 | 21
1106 | 78.950260
1107 | 31
1108 | 0.0
1109 | 0
1110 | SPLINE
1111 | 5
1112 | 10c
1113 | 100
1114 | AcDbEntity
1115 | 8
1116 | Base
1117 | 62
1118 | 7
1119 | 100
1120 | AcDbSpline
1121 | 70
1122 | 8
1123 | 71
1124 | 3
1125 | 72
1126 | 8
1127 | 73
1128 | 4
1129 | 74
1130 | 0
1131 | 40
1132 | 0
1133 | 40
1134 | 0
1135 | 40
1136 | 0
1137 | 40
1138 | 0
1139 | 40
1140 | 1
1141 | 40
1142 | 1
1143 | 40
1144 | 1
1145 | 40
1146 | 1
1147 | 10
1148 | 94.999748
1149 | 20
1150 | 78.950260
1151 | 30
1152 | 0.0
1153 | 10
1154 | 95.516989
1155 | 20
1156 | 78.950313
1157 | 30
1158 | 0.0
1159 | 10
1160 | 96.013061
1161 | 20
1162 | 78.744863
1163 | 30
1164 | 0.0
1165 | 10
1166 | 96.378806
1167 | 20
1168 | 78.379119
1169 | 30
1170 | 0.0
1171 | 0
1172 | SPLINE
1173 | 5
1174 | 10d
1175 | 100
1176 | AcDbEntity
1177 | 8
1178 | Base
1179 | 62
1180 | 7
1181 | 100
1182 | AcDbSpline
1183 | 70
1184 | 8
1185 | 71
1186 | 3
1187 | 72
1188 | 8
1189 | 73
1190 | 4
1191 | 74
1192 | 0
1193 | 40
1194 | 0
1195 | 40
1196 | 0
1197 | 40
1198 | 0
1199 | 40
1200 | 0
1201 | 40
1202 | 1
1203 | 40
1204 | 1
1205 | 40
1206 | 1
1207 | 40
1208 | 1
1209 | 10
1210 | 96.378806
1211 | 20
1212 | 78.379119
1213 | 30
1214 | 0.0
1215 | 10
1216 | 96.744551
1217 | 20
1218 | 78.013374
1219 | 30
1220 | 0.0
1221 | 10
1222 | 96.950001
1223 | 20
1224 | 77.517303
1225 | 30
1226 | 0.0
1227 | 10
1228 | 96.949949
1229 | 20
1230 | 77.000062
1231 | 30
1232 | 0.0
1233 | 0
1234 | SPLINE
1235 | 5
1236 | 10e
1237 | 100
1238 | AcDbEntity
1239 | 8
1240 | Base
1241 | 62
1242 | 7
1243 | 100
1244 | AcDbSpline
1245 | 70
1246 | 8
1247 | 71
1248 | 3
1249 | 72
1250 | 8
1251 | 73
1252 | 4
1253 | 74
1254 | 0
1255 | 40
1256 | 0
1257 | 40
1258 | 0
1259 | 40
1260 | 0
1261 | 40
1262 | 0
1263 | 40
1264 | 1
1265 | 40
1266 | 1
1267 | 40
1268 | 1
1269 | 40
1270 | 1
1271 | 10
1272 | 96.949949
1273 | 20
1274 | 77.000062
1275 | 30
1276 | 0.0
1277 | 10
1278 | 96.950002
1279 | 20
1280 | 76.482820
1281 | 30
1282 | 0.0
1283 | 10
1284 | 96.744552
1285 | 20
1286 | 75.986748
1287 | 30
1288 | 0.0
1289 | 10
1290 | 96.378807
1291 | 20
1292 | 75.621003
1293 | 30
1294 | 0.0
1295 | 0
1296 | SPLINE
1297 | 5
1298 | 10f
1299 | 100
1300 | AcDbEntity
1301 | 8
1302 | Base
1303 | 62
1304 | 7
1305 | 100
1306 | AcDbSpline
1307 | 70
1308 | 8
1309 | 71
1310 | 3
1311 | 72
1312 | 8
1313 | 73
1314 | 4
1315 | 74
1316 | 0
1317 | 40
1318 | 0
1319 | 40
1320 | 0
1321 | 40
1322 | 0
1323 | 40
1324 | 0
1325 | 40
1326 | 1
1327 | 40
1328 | 1
1329 | 40
1330 | 1
1331 | 40
1332 | 1
1333 | 10
1334 | 96.378807
1335 | 20
1336 | 75.621003
1337 | 30
1338 | 0.0
1339 | 10
1340 | 96.013062
1341 | 20
1342 | 75.255258
1343 | 30
1344 | 0.0
1345 | 10
1346 | 95.516990
1347 | 20
1348 | 75.049808
1349 | 30
1350 | 0.0
1351 | 10
1352 | 94.999748
1353 | 20
1354 | 75.049861
1355 | 30
1356 | 0.0
1357 | 0
1358 | SPLINE
1359 | 5
1360 | 110
1361 | 100
1362 | AcDbEntity
1363 | 8
1364 | Base
1365 | 62
1366 | 7
1367 | 100
1368 | AcDbSpline
1369 | 70
1370 | 8
1371 | 71
1372 | 3
1373 | 72
1374 | 8
1375 | 73
1376 | 4
1377 | 74
1378 | 0
1379 | 40
1380 | 0
1381 | 40
1382 | 0
1383 | 40
1384 | 0
1385 | 40
1386 | 0
1387 | 40
1388 | 1
1389 | 40
1390 | 1
1391 | 40
1392 | 1
1393 | 40
1394 | 1
1395 | 10
1396 | 94.999748
1397 | 20
1398 | 75.049861
1399 | 30
1400 | 0.0
1401 | 10
1402 | 93.922852
1403 | 20
1404 | 75.050056
1405 | 30
1406 | 0.0
1407 | 10
1408 | 93.049989
1409 | 20
1410 | 75.923166
1411 | 30
1412 | 0.0
1413 | 10
1414 | 93.050100
1415 | 20
1416 | 77.000062
1417 | 30
1418 | 0.0
1419 | 0
1420 | SPLINE
1421 | 5
1422 | 111
1423 | 100
1424 | AcDbEntity
1425 | 8
1426 | Base
1427 | 62
1428 | 7
1429 | 100
1430 | AcDbSpline
1431 | 70
1432 | 8
1433 | 71
1434 | 3
1435 | 72
1436 | 8
1437 | 73
1438 | 4
1439 | 74
1440 | 0
1441 | 40
1442 | 0
1443 | 40
1444 | 0
1445 | 40
1446 | 0
1447 | 40
1448 | 0
1449 | 40
1450 | 1
1451 | 40
1452 | 1
1453 | 40
1454 | 1
1455 | 40
1456 | 1
1457 | 10
1458 | 93.050100
1459 | 20
1460 | 77.000062
1461 | 30
1462 | 0.0
1463 | 10
1464 | 93.049991
1465 | 20
1466 | 78.076957
1467 | 30
1468 | 0.0
1469 | 10
1470 | 93.922853
1471 | 20
1472 | 78.950065
1473 | 30
1474 | 0.0
1475 | 10
1476 | 94.999748
1477 | 20
1478 | 78.950260
1479 | 30
1480 | 0.0
1481 | 0
1482 | LINE
1483 | 5
1484 | 112
1485 | 100
1486 | AcDbEntity
1487 | 8
1488 | Base
1489 | 62
1490 | 7
1491 | 100
1492 | AcDbLine
1493 | 10
1494 | 94.999748
1495 | 20
1496 | 78.950260
1497 | 30
1498 | 0.0
1499 | 11
1500 | 94.999748
1501 | 21
1502 | 78.950260
1503 | 31
1504 | 0.0
1505 | 0
1506 | SPLINE
1507 | 5
1508 | 113
1509 | 100
1510 | AcDbEntity
1511 | 8
1512 | Base
1513 | 62
1514 | 7
1515 | 100
1516 | AcDbSpline
1517 | 70
1518 | 8
1519 | 71
1520 | 3
1521 | 72
1522 | 8
1523 | 73
1524 | 4
1525 | 74
1526 | 0
1527 | 40
1528 | 0
1529 | 40
1530 | 0
1531 | 40
1532 | 0
1533 | 40
1534 | 0
1535 | 40
1536 | 1
1537 | 40
1538 | 1
1539 | 40
1540 | 1
1541 | 40
1542 | 1
1543 | 10
1544 | 15.000221
1545 | 20
1546 | 14.949758
1547 | 30
1548 | 0.0
1549 | 10
1550 | 16.076900
1551 | 20
1552 | 14.949564
1553 | 30
1554 | 0.0
1555 | 10
1556 | 16.949672
1557 | 20
1558 | 14.076795
1559 | 30
1560 | 0.0
1561 | 10
1562 | 16.949870
1563 | 20
1564 | 13.000116
1565 | 30
1566 | 0.0
1567 | 0
1568 | SPLINE
1569 | 5
1570 | 114
1571 | 100
1572 | AcDbEntity
1573 | 8
1574 | Base
1575 | 62
1576 | 7
1577 | 100
1578 | AcDbSpline
1579 | 70
1580 | 8
1581 | 71
1582 | 3
1583 | 72
1584 | 8
1585 | 73
1586 | 4
1587 | 74
1588 | 0
1589 | 40
1590 | 0
1591 | 40
1592 | 0
1593 | 40
1594 | 0
1595 | 40
1596 | 0
1597 | 40
1598 | 1
1599 | 40
1600 | 1
1601 | 40
1602 | 1
1603 | 40
1604 | 1
1605 | 10
1606 | 16.949870
1607 | 20
1608 | 13.000116
1609 | 30
1610 | 0.0
1611 | 10
1612 | 16.949987
1613 | 20
1614 | 11.923216
1615 | 30
1616 | 0.0
1617 | 10
1618 | 16.077122
1619 | 20
1620 | 11.050099
1621 | 30
1622 | 0.0
1623 | 10
1624 | 15.000221
1625 | 20
1626 | 11.049904
1627 | 30
1628 | 0.0
1629 | 0
1630 | SPLINE
1631 | 5
1632 | 115
1633 | 100
1634 | AcDbEntity
1635 | 8
1636 | Base
1637 | 62
1638 | 7
1639 | 100
1640 | AcDbSpline
1641 | 70
1642 | 8
1643 | 71
1644 | 3
1645 | 72
1646 | 8
1647 | 73
1648 | 4
1649 | 74
1650 | 0
1651 | 40
1652 | 0
1653 | 40
1654 | 0
1655 | 40
1656 | 0
1657 | 40
1658 | 0
1659 | 40
1660 | 1
1661 | 40
1662 | 1
1663 | 40
1664 | 1
1665 | 40
1666 | 1
1667 | 10
1668 | 15.000221
1669 | 20
1670 | 11.049904
1671 | 30
1672 | 0.0
1673 | 10
1674 | 14.482978
1675 | 20
1676 | 11.049851
1677 | 30
1678 | 0.0
1679 | 10
1680 | 13.986904
1681 | 20
1682 | 11.255303
1683 | 30
1684 | 0.0
1685 | 10
1686 | 13.621159
1687 | 20
1688 | 11.621050
1689 | 30
1690 | 0.0
1691 | 0
1692 | SPLINE
1693 | 5
1694 | 116
1695 | 100
1696 | AcDbEntity
1697 | 8
1698 | Base
1699 | 62
1700 | 7
1701 | 100
1702 | AcDbSpline
1703 | 70
1704 | 8
1705 | 71
1706 | 3
1707 | 72
1708 | 8
1709 | 73
1710 | 4
1711 | 74
1712 | 0
1713 | 40
1714 | 0
1715 | 40
1716 | 0
1717 | 40
1718 | 0
1719 | 40
1720 | 0
1721 | 40
1722 | 1
1723 | 40
1724 | 1
1725 | 40
1726 | 1
1727 | 40
1728 | 1
1729 | 10
1730 | 13.621159
1731 | 20
1732 | 11.621050
1733 | 30
1734 | 0.0
1735 | 10
1736 | 13.255414
1737 | 20
1738 | 11.986798
1739 | 30
1740 | 0.0
1741 | 10
1742 | 13.049965
1743 | 20
1744 | 12.482873
1745 | 30
1746 | 0.0
1747 | 10
1748 | 13.050022
1749 | 20
1750 | 13.000116
1751 | 30
1752 | 0.0
1753 | 0
1754 | SPLINE
1755 | 5
1756 | 117
1757 | 100
1758 | AcDbEntity
1759 | 8
1760 | Base
1761 | 62
1762 | 7
1763 | 100
1764 | AcDbSpline
1765 | 70
1766 | 8
1767 | 71
1768 | 3
1769 | 72
1770 | 8
1771 | 73
1772 | 4
1773 | 74
1774 | 0
1775 | 40
1776 | 0
1777 | 40
1778 | 0
1779 | 40
1780 | 0
1781 | 40
1782 | 0
1783 | 40
1784 | 1
1785 | 40
1786 | 1
1787 | 40
1788 | 1
1789 | 40
1790 | 1
1791 | 10
1792 | 13.050022
1793 | 20
1794 | 13.000116
1795 | 30
1796 | 0.0
1797 | 10
1798 | 13.050219
1799 | 20
1800 | 14.077010
1801 | 30
1802 | 0.0
1803 | 10
1804 | 13.923328
1805 | 20
1806 | 14.949869
1807 | 30
1808 | 0.0
1809 | 10
1810 | 15.000221
1811 | 20
1812 | 14.949758
1813 | 30
1814 | 0.0
1815 | 0
1816 | LINE
1817 | 5
1818 | 118
1819 | 100
1820 | AcDbEntity
1821 | 8
1822 | Base
1823 | 62
1824 | 7
1825 | 100
1826 | AcDbLine
1827 | 10
1828 | 15.000221
1829 | 20
1830 | 14.949758
1831 | 30
1832 | 0.0
1833 | 11
1834 | 15.000221
1835 | 21
1836 | 14.949758
1837 | 31
1838 | 0.0
1839 | 0
1840 | SPLINE
1841 | 5
1842 | 119
1843 | 100
1844 | AcDbEntity
1845 | 8
1846 | Base
1847 | 62
1848 | 7
1849 | 100
1850 | AcDbSpline
1851 | 70
1852 | 8
1853 | 71
1854 | 3
1855 | 72
1856 | 8
1857 | 73
1858 | 4
1859 | 74
1860 | 0
1861 | 40
1862 | 0
1863 | 40
1864 | 0
1865 | 40
1866 | 0
1867 | 40
1868 | 0
1869 | 40
1870 | 1
1871 | 40
1872 | 1
1873 | 40
1874 | 1
1875 | 40
1876 | 1
1877 | 10
1878 | 94.999748
1879 | 20
1880 | 14.949758
1881 | 30
1882 | 0.0
1883 | 10
1884 | 96.076642
1885 | 20
1886 | 14.949869
1887 | 30
1888 | 0.0
1889 | 10
1890 | 96.949751
1891 | 20
1892 | 14.077010
1893 | 30
1894 | 0.0
1895 | 10
1896 | 96.949949
1897 | 20
1898 | 13.000116
1899 | 30
1900 | 0.0
1901 | 0
1902 | SPLINE
1903 | 5
1904 | 11a
1905 | 100
1906 | AcDbEntity
1907 | 8
1908 | Base
1909 | 62
1910 | 7
1911 | 100
1912 | AcDbSpline
1913 | 70
1914 | 8
1915 | 71
1916 | 3
1917 | 72
1918 | 8
1919 | 73
1920 | 4
1921 | 74
1922 | 0
1923 | 40
1924 | 0
1925 | 40
1926 | 0
1927 | 40
1928 | 0
1929 | 40
1930 | 0
1931 | 40
1932 | 1
1933 | 40
1934 | 1
1935 | 40
1936 | 1
1937 | 40
1938 | 1
1939 | 10
1940 | 96.949949
1941 | 20
1942 | 13.000116
1943 | 30
1944 | 0.0
1945 | 10
1946 | 96.950005
1947 | 20
1948 | 12.482873
1949 | 30
1950 | 0.0
1951 | 10
1952 | 96.744556
1953 | 20
1954 | 11.986798
1955 | 30
1956 | 0.0
1957 | 10
1958 | 96.378811
1959 | 20
1960 | 11.621050
1961 | 30
1962 | 0.0
1963 | 0
1964 | SPLINE
1965 | 5
1966 | 11b
1967 | 100
1968 | AcDbEntity
1969 | 8
1970 | Base
1971 | 62
1972 | 7
1973 | 100
1974 | AcDbSpline
1975 | 70
1976 | 8
1977 | 71
1978 | 3
1979 | 72
1980 | 8
1981 | 73
1982 | 4
1983 | 74
1984 | 0
1985 | 40
1986 | 0
1987 | 40
1988 | 0
1989 | 40
1990 | 0
1991 | 40
1992 | 0
1993 | 40
1994 | 1
1995 | 40
1996 | 1
1997 | 40
1998 | 1
1999 | 40
2000 | 1
2001 | 10
2002 | 96.378811
2003 | 20
2004 | 11.621050
2005 | 30
2006 | 0.0
2007 | 10
2008 | 96.013065
2009 | 20
2010 | 11.255303
2011 | 30
2012 | 0.0
2013 | 10
2014 | 95.516992
2015 | 20
2016 | 11.049851
2017 | 30
2018 | 0.0
2019 | 10
2020 | 94.999748
2021 | 20
2022 | 11.049904
2023 | 30
2024 | 0.0
2025 | 0
2026 | SPLINE
2027 | 5
2028 | 11c
2029 | 100
2030 | AcDbEntity
2031 | 8
2032 | Base
2033 | 62
2034 | 7
2035 | 100
2036 | AcDbSpline
2037 | 70
2038 | 8
2039 | 71
2040 | 3
2041 | 72
2042 | 8
2043 | 73
2044 | 4
2045 | 74
2046 | 0
2047 | 40
2048 | 0
2049 | 40
2050 | 0
2051 | 40
2052 | 0
2053 | 40
2054 | 0
2055 | 40
2056 | 1
2057 | 40
2058 | 1
2059 | 40
2060 | 1
2061 | 40
2062 | 1
2063 | 10
2064 | 94.999748
2065 | 20
2066 | 11.049904
2067 | 30
2068 | 0.0
2069 | 10
2070 | 93.922848
2071 | 20
2072 | 11.050099
2073 | 30
2074 | 0.0
2075 | 10
2076 | 93.049983
2077 | 20
2078 | 11.923216
2079 | 30
2080 | 0.0
2081 | 10
2082 | 93.050100
2083 | 20
2084 | 13.000116
2085 | 30
2086 | 0.0
2087 | 0
2088 | SPLINE
2089 | 5
2090 | 11d
2091 | 100
2092 | AcDbEntity
2093 | 8
2094 | Base
2095 | 62
2096 | 7
2097 | 100
2098 | AcDbSpline
2099 | 70
2100 | 8
2101 | 71
2102 | 3
2103 | 72
2104 | 8
2105 | 73
2106 | 4
2107 | 74
2108 | 0
2109 | 40
2110 | 0
2111 | 40
2112 | 0
2113 | 40
2114 | 0
2115 | 40
2116 | 0
2117 | 40
2118 | 1
2119 | 40
2120 | 1
2121 | 40
2122 | 1
2123 | 40
2124 | 1
2125 | 10
2126 | 93.050100
2127 | 20
2128 | 13.000116
2129 | 30
2130 | 0.0
2131 | 10
2132 | 93.050298
2133 | 20
2134 | 14.076794
2135 | 30
2136 | 0.0
2137 | 10
2138 | 93.923070
2139 | 20
2140 | 14.949564
2141 | 30
2142 | 0.0
2143 | 10
2144 | 94.999748
2145 | 20
2146 | 14.949758
2147 | 30
2148 | 0.0
2149 | 0
2150 | LINE
2151 | 5
2152 | 11e
2153 | 100
2154 | AcDbEntity
2155 | 8
2156 | Base
2157 | 62
2158 | 7
2159 | 100
2160 | AcDbLine
2161 | 10
2162 | 94.999748
2163 | 20
2164 | 14.949758
2165 | 30
2166 | 0.0
2167 | 11
2168 | 94.999748
2169 | 21
2170 | 14.949758
2171 | 31
2172 | 0.0
2173 | 0
2174 | ENDSEC
2175 | 0
2176 | SECTION
2177 | 2
2178 | OBJECTS
2179 | 0
2180 | DICTIONARY
2181 | 5
2182 | C
2183 | 330
2184 | 0
2185 | 100
2186 | AcDbDictionary
2187 | 3
2188 | ACAD_GROUP
2189 | 350
2190 | D
2191 | 3
2192 | ACAD_MLINESTYLE
2193 | 350
2194 | 17
2195 | 0
2196 | DICTIONARY
2197 | 5
2198 | D
2199 | 330
2200 | C
2201 | 100
2202 | AcDbDictionary
2203 | 0
2204 | DICTIONARY
2205 | 5
2206 | 1A
2207 | 330
2208 | C
2209 | 100
2210 | AcDbDictionary
2211 | 0
2212 | DICTIONARY
2213 | 5
2214 | 17
2215 | 330
2216 | C
2217 | 100
2218 | AcDbDictionary
2219 | 3
2220 | STANDARD
2221 | 350
2222 | 18
2223 | 0
2224 | DICTIONARY
2225 | 5
2226 | 19
2227 | 330
2228 | C
2229 | 100
2230 | AcDbDictionary
2231 | 0
2232 | ENDSEC
2233 | 0
2234 | EOF
2235 |
--------------------------------------------------------------------------------
/hardware/plate.gcode:
--------------------------------------------------------------------------------
1 | M5
2 | G21 G90 G64 G40
3 | G0 Z3.0
4 | T0 M6
5 | G17
6 | G0 X18.571 Y98.3292
7 | G0 Z1.0
8 | G1 F300.0 Z-0.4
9 | M3 S100
10 | G2 F100.0 X19.9501 Y98.9004 I1.3789 J-1.3789
11 | G2 X21.8997 Y96.9502 I-0.0004 J-1.95
12 | G2 X19.9501 Y95.0 I-1.95 J-0.0002
13 | G2 X18.571 Y95.5711 I-0.0002 J1.95
14 | G2 X17.9999 Y96.9502 I1.3789 J1.3789
15 | G2 X18.571 Y98.3292 I1.95 J0.0002
16 | M5
17 | G0 Z3.0
18 | G0 X19.9087 Y34.8995
19 | G0 Z1.0
20 | G1 F300.0 Z-0.4
21 | M3 S100
22 | G2 F100.0 X19.9501 Y34.8999 I0.0411 J-1.9496
23 | G2 X21.8997 Y32.9502 I-0.0004 J-1.95
24 | G2 X19.9501 Y31.0 I-1.95 J-0.0002
25 | G2 X18.571 Y31.5712 I-0.0002 J1.95
26 | G2 X17.9999 Y32.9502 I1.3788 J1.3788
27 | G2 X19.9087 Y34.8995 I1.95 J-0.0004
28 | M5
29 | G0 Z3.0
30 | G0 X98.0005 Y32.9974
31 | G0 Z1.0
32 | G1 F300.0 Z-0.4
33 | M3 S100
34 | G2 F100.0 X99.9496 Y34.8999 I1.9494 J-0.0475
35 | G2 X101.8998 Y32.9502 I0.0002 J-1.95
36 | G2 X101.3287 Y31.5712 I-1.95 J-0.0002
37 | G2 X99.9496 Y31.0 I-1.3789 J1.3789
38 | G2 X97.9999 Y32.9502 I0.0004 J1.95
39 | G2 X98.0005 Y32.9974 I1.95 J-0.0004
40 | M5
41 | G0 Z3.0
42 | G0 X99.8905 Y95.0009
43 | G0 Z1.0
44 | G1 F300.0 Z-0.4
45 | M3 S100
46 | G2 F100.0 X97.9999 Y96.9502 I0.0594 J1.9491
47 | G2 X99.9496 Y98.9004 I1.95 J0.0002
48 | G2 X101.3286 Y98.3292 I0.0002 J-1.95
49 | G2 X101.8998 Y96.9502 I-1.3788 J-1.3789
50 | G2 X101.3286 Y95.5711 I-1.95 J-0.0002
51 | G2 X99.9496 Y95.0 I-1.3789 J1.3789
52 | G2 X99.8905 Y95.0009 I0.0004 J1.95
53 | M5
54 | G0 Z3.0
55 | G0 X5.0 Y109.8999
56 | G0 Z1.0
57 | G1 F300.0 Z-0.2
58 | M3 S90
59 | G1 F200.0 Y20.0
60 | G1 X119.8997
61 | G1 Y109.8999
62 | G1 X5.0
63 | G1 F300.0 Z-0.4
64 | G1 F200.0 Y20.0
65 | G1 X119.8997
66 | G1 Y109.8999
67 | G1 X5.0
68 | M5
69 | G0 Z3.0
70 | G28
71 | M30
72 |
--------------------------------------------------------------------------------
/hardware/plate.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
71 |
--------------------------------------------------------------------------------
/readme.markdown:
--------------------------------------------------------------------------------
1 | NodeBot AI project(s)
2 | =====================
3 |
4 | Contents
5 | --------
6 | - [Hardware](#hardware)
7 | - [Hardware assembly](#hardware-assembly)
8 | - [Hardware power supply](#hardware-power-supply)
9 | - [Software installation](#software-installation)
10 |
11 |
12 | Hardware
13 | --------
14 |
15 |
16 | Hardware assembly
17 | -----------------
18 |
19 | See [Hardware directory](hardware)
20 |
21 |
22 | Hardware power supply
23 | ---------------------
24 |
25 | All measurements at 5 VDC. Raspberry Pi 2 has Wi-Pi (USB Wi-Fi dongle).
26 |
27 | - mBot idle (with LED matrix, line following, etc): 0.15 mA
28 | - mBot motors running (@ 100 out of 255): 0.21 mA
29 | - mBot motors starting/spinning up: 0.27 mA
30 | - Pixy camera starting up: 0.25 mA
31 | - Pixy camera idle: 0.18 mA
32 | - RPi2 starting up: 0.38 mA
33 | - RPi2 idle: 0.28 mA
34 | - RPi2 Wi-Fi data transfer: 0.38 mA to 0.44 mA
35 | - RPi2 capturing video: 0.46 mA (note: CPU is idling)
36 | - RPi2 capturing video and Wi-Fi data transfer: 0.66 mA
37 | - RPi2 one CPU thread busy loop (25%): 0.31 mA
38 | - RPi2 four CPU threads busy loop (100%): 0.41 mA
39 | - RPi2 CPU 100%, video and Wi-Fi transfer: 0.76 mA
40 |
41 | All up: RPi2 0.76 mA + Pixy 0.25 mA + mBot 0.27 mA = 1.28 mA total
42 |
43 |
44 | ## Software installation
45 |
46 | ### Node:
47 |
48 | * Make sure NodeJS is installed (pref V6 branch)
49 | * cd to src/nodebot and run `npm install`
50 |
51 | ### mBot Firmware
52 |
53 | Ensure `./node_modules/.bin` is on $PATH then:
54 |
55 | ```
56 | interchange install git+https://github.com/Makeblock-official/mbot_nodebots -a uno --firmata=usb
57 | ```
58 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/src/ai/camera_capture.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | #
3 | # Local video capture sent over GStreamer RTP/H.264/UDP to local/remote hosts
4 |
5 | REMOTE_HOST=nomad.local # classify_video.py
6 | REMOTE_PORT=5001 # " "
7 |
8 | if [ $# -ge 1 ]; then
9 | REMOTE_HOST=$1
10 | fi
11 |
12 | if [ $# -ge 2 ]; then
13 | REMOTE_PORT=$2
14 | fi
15 |
16 | # Raspberry Pi camera
17 | #
18 | BIT_RATE=1000000
19 | FPS=10
20 | # Ratio 16:9 1.777
21 | WIDTH=512
22 | HEIGHT=288
23 |
24 | # Local host UDP stream
25 | #
26 | HOST_L=127.0.0.1
27 | PORT_L=5000
28 | FPS_L=10/1
29 | # Ratio: 1:1
30 | WIDTH_L=128
31 | HEIGHT_L=128
32 |
33 | # Remote host UDP stream
34 | #
35 | HOST_R=$REMOTE_HOST
36 | PORT_R=$REMOTE_PORT
37 | FPS_R=10/1
38 | # Ratio 16:9 1.777
39 | WIDTH_R=512
40 | HEIGHT_R=288
41 |
42 | # If remote host can't be found, then stream to localhost
43 | #
44 | ping -c 1 -q $HOST_R >/dev/null 2>&1
45 |
46 | if [ $? != 0 ]; then
47 | HOST_R=127.0.0.1
48 | fi
49 |
50 | echo Remote camera stream: $HOST_R:$PORT_R
51 |
52 | OS=`uname`
53 |
54 | if [ $OS = "Darwin" ]; then
55 | H264_DECODE=avdec_h264
56 | # H264_ENCODE=x264enc
57 | # H264_ENCODE=avenc_mpeg4 # software encoder
58 | H264_ENCODE=vtenc_h264
59 |
60 | OVERLAY='queue'
61 | else
62 | H264_DECODE=omxh264dec
63 | H264_ENCODE=omxh264enc
64 |
65 | OVERLAY='timeoverlay halignment=right valignment=top text="Elapsed: " shaded-background=true ! clockoverlay halignment=left valignment=top time-format="%Y/%m/%d %H:%M:%S" shaded-background=true'
66 | fi
67 |
68 | grep -q BCM270. /proc/cpuinfo >/dev/null 2>&1
69 |
70 | if [ $? = 0 ]; then
71 | RASPIVID="raspivid --flush -hf -vf -n -t 0 -b $BIT_RATE -fps $FPS -w $WIDTH -h $HEIGHT -o -"
72 | CAMERA_SOURCE="fdsrc ! h264parse ! $H264_DECODE"
73 | else
74 | RASPIVID="echo"
75 | CAMERA_SOURCE=autovideosrc
76 | fi
77 |
78 | $RASPIVID | gst-launch-1.0 $CAMERA_SOURCE ! \
79 | tee name=tee_local ! queue ! \
80 | videoscale ! videorate ! videoconvert ! \
81 | video/x-raw,width=$WIDTH_L,height=$HEIGHT_L,framerate=$FPS_L ! \
82 | $H264_ENCODE ! \
83 | rtph264pay config-interval=5 pt=96 ! \
84 | udpsink host=$HOST_L port=$PORT_L sync=false async=true \
85 | tee_local. ! queue ! \
86 | tee name=tee_remote ! queue ! \
87 | videoscale ! videorate ! videoconvert ! \
88 | video/x-raw,width=$WIDTH_R,height=$HEIGHT_R,framerate=$FPS_R ! \
89 | $OVERLAY ! \
90 | $H264_ENCODE ! \
91 | video/x-h264,width=$WIDTH_R,height=$HEIGHT_R,framerate=$FPS_R ! \
92 | rtph264pay config-interval=5 pt=96 ! \
93 | udpsink host=$HOST_R port=$PORT_R sync=false async=true
94 |
--------------------------------------------------------------------------------
/src/ai/camera_watch.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | #
3 | # Watch remote GStreamer RTP/H.264/UDP video stream
4 |
5 | LOCAL_PORT=5001
6 |
7 | if [ $# = 1 ]; then
8 | LOCAL_PORT=$1
9 | fi
10 |
11 | # sync=f: Play as soon as data arrives
12 | # sync=t: Play depending upon video buffer timestamps
13 | #
14 | VIDEO_SYNC="sync=f"
15 | VIDEO_SINK=ximagesink
16 |
17 | OS=`uname`
18 |
19 | if [ $OS = "Darwin" ]; then
20 | VIDEO_SINK=osxvideosink
21 | fi
22 |
23 | gst-launch-1.0 udpsrc port=$LOCAL_PORT \
24 | caps='application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264' ! \
25 | rtph264depay ! avdec_h264 ! videoconvert ! $VIDEO_SINK $VIDEO_SYNC
26 |
--------------------------------------------------------------------------------
/src/ai/explore_generate_data.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {
7 | "collapsed": false
8 | },
9 | "outputs": [],
10 | "source": [
11 | "import numpy as np\n",
12 | "from skimage.draw import polygon"
13 | ]
14 | },
15 | {
16 | "cell_type": "code",
17 | "execution_count": 2,
18 | "metadata": {
19 | "collapsed": false
20 | },
21 | "outputs": [],
22 | "source": [
23 | "import matplotlib.pyplot as plt\n",
24 | "%matplotlib inline"
25 | ]
26 | },
27 | {
28 | "cell_type": "code",
29 | "execution_count": 3,
30 | "metadata": {
31 | "collapsed": false
32 | },
33 | "outputs": [],
34 | "source": [
35 | "%load_ext autoreload\n",
36 | "%autoreload 1\n",
37 | "%aimport generate_data\n",
38 | "from generate_data import *"
39 | ]
40 | },
41 | {
42 | "cell_type": "code",
43 | "execution_count": 4,
44 | "metadata": {
45 | "collapsed": false
46 | },
47 | "outputs": [
48 | {
49 | "data": {
50 | "text/plain": [
51 | ""
52 | ]
53 | },
54 | "execution_count": 4,
55 | "metadata": {},
56 | "output_type": "execute_result"
57 | },
58 | {
59 | "data": {
60 | "image/png": "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\n",
61 | "text/plain": [
62 | ""
63 | ]
64 | },
65 | "metadata": {},
66 | "output_type": "display_data"
67 | }
68 | ],
69 | "source": [
70 | "plt.imshow(generate_data.create_road(64, 64, offset = -21)[:,:,0], interpolation='nearest')"
71 | ]
72 | },
73 | {
74 | "cell_type": "code",
75 | "execution_count": 5,
76 | "metadata": {
77 | "collapsed": false
78 | },
79 | "outputs": [
80 | {
81 | "name": "stdout",
82 | "output_type": "stream",
83 | "text": [
84 | "8.44379322716\n"
85 | ]
86 | },
87 | {
88 | "data": {
89 | "text/plain": [
90 | ""
91 | ]
92 | },
93 | "execution_count": 5,
94 | "metadata": {},
95 | "output_type": "execute_result"
96 | },
97 | {
98 | "data": {
99 | "image/png": "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\n",
100 | "text/plain": [
101 | ""
102 | ]
103 | },
104 | "metadata": {},
105 | "output_type": "display_data"
106 | }
107 | ],
108 | "source": [
109 | "image, offset = generate_data.random_road(64, 64)\n",
110 | "print(offset)\n",
111 | "plt.imshow(image[:,:,0])"
112 | ]
113 | },
114 | {
115 | "cell_type": "code",
116 | "execution_count": 6,
117 | "metadata": {
118 | "collapsed": false
119 | },
120 | "outputs": [
121 | {
122 | "name": "stdout",
123 | "output_type": "stream",
124 | "text": [
125 | "[ 0.06889187 0.20798574]\n"
126 | ]
127 | },
128 | {
129 | "data": {
130 | "image/png": "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\nAAAAAElFTkSuQmCC\n",
131 | "text/plain": [
132 | ""
133 | ]
134 | },
135 | "metadata": {},
136 | "output_type": "display_data"
137 | },
138 | {
139 | "data": {
140 | "text/plain": [
141 | ""
142 | ]
143 | },
144 | "execution_count": 6,
145 | "metadata": {},
146 | "output_type": "execute_result"
147 | },
148 | {
149 | "data": {
150 | "image/png": "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\nRK5CYII=\n",
151 | "text/plain": [
152 | ""
153 | ]
154 | },
155 | "metadata": {},
156 | "output_type": "display_data"
157 | }
158 | ],
159 | "source": [
160 | "input_data, label_data = generate_data.generate_batch(64, 64, 2)\n",
161 | "print(label_data)\n",
162 | "plt.imshow(input_data[0,:,:,0])\n",
163 | "plt.show()\n",
164 | "plt.imshow(input_data[1,:,:,0])"
165 | ]
166 | },
167 | {
168 | "cell_type": "code",
169 | "execution_count": null,
170 | "metadata": {
171 | "collapsed": true
172 | },
173 | "outputs": [],
174 | "source": []
175 | }
176 | ],
177 | "metadata": {
178 | "kernelspec": {
179 | "display_name": "Python 2",
180 | "language": "python",
181 | "name": "python2"
182 | },
183 | "language_info": {
184 | "codemirror_mode": {
185 | "name": "ipython",
186 | "version": 2
187 | },
188 | "file_extension": ".py",
189 | "mimetype": "text/x-python",
190 | "name": "python",
191 | "nbconvert_exporter": "python",
192 | "pygments_lexer": "ipython2",
193 | "version": "2.7.12"
194 | }
195 | },
196 | "nbformat": 4,
197 | "nbformat_minor": 0
198 | }
199 |
--------------------------------------------------------------------------------
/src/ai/explore_run.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {
7 | "collapsed": true
8 | },
9 | "outputs": [],
10 | "source": [
11 | "import numpy as np"
12 | ]
13 | },
14 | {
15 | "cell_type": "code",
16 | "execution_count": 2,
17 | "metadata": {
18 | "collapsed": true
19 | },
20 | "outputs": [],
21 | "source": [
22 | "import tensorflow as tf\n",
23 | "import tflearn"
24 | ]
25 | },
26 | {
27 | "cell_type": "code",
28 | "execution_count": 3,
29 | "metadata": {
30 | "collapsed": false
31 | },
32 | "outputs": [],
33 | "source": [
34 | "%reload_ext autoreload\n",
35 | "%autoreload 1\n",
36 | "%aimport train\n",
37 | "%aimport generate_data"
38 | ]
39 | },
40 | {
41 | "cell_type": "code",
42 | "execution_count": 4,
43 | "metadata": {
44 | "collapsed": false
45 | },
46 | "outputs": [],
47 | "source": [
48 | "tf.reset_default_graph()\n",
49 | "model = train.build_model()"
50 | ]
51 | },
52 | {
53 | "cell_type": "code",
54 | "execution_count": 68,
55 | "metadata": {
56 | "collapsed": false
57 | },
58 | "outputs": [],
59 | "source": [
60 | "model.load('checkpoints/road_model1-800')"
61 | ]
62 | },
63 | {
64 | "cell_type": "code",
65 | "execution_count": 69,
66 | "metadata": {
67 | "collapsed": false
68 | },
69 | "outputs": [],
70 | "source": [
71 | "input_size = 128\n",
72 | "data_size = 1\n",
73 | "\n",
74 | "image_data, label_data = \\\n",
75 | " generate_data.generate_batch(\n",
76 | " height=input_size,\n",
77 | " width=input_size,\n",
78 | " minibatch_size=data_size)"
79 | ]
80 | },
81 | {
82 | "cell_type": "code",
83 | "execution_count": 70,
84 | "metadata": {
85 | "collapsed": false
86 | },
87 | "outputs": [],
88 | "source": [
89 | "pr = model.predict(image_data)"
90 | ]
91 | },
92 | {
93 | "cell_type": "code",
94 | "execution_count": 71,
95 | "metadata": {
96 | "collapsed": true
97 | },
98 | "outputs": [],
99 | "source": [
100 | "%matplotlib inline\n",
101 | "import matplotlib.pyplot as plt"
102 | ]
103 | },
104 | {
105 | "cell_type": "code",
106 | "execution_count": 72,
107 | "metadata": {
108 | "collapsed": false
109 | },
110 | "outputs": [
111 | {
112 | "name": "stdout",
113 | "output_type": "stream",
114 | "text": [
115 | "[0.27134162187576294]\n"
116 | ]
117 | },
118 | {
119 | "data": {
120 | "image/png": "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\nWCOSk6+uAAAAAElFTkSuQmCC\n",
121 | "text/plain": [
122 | ""
123 | ]
124 | },
125 | "metadata": {},
126 | "output_type": "display_data"
127 | }
128 | ],
129 | "source": [
130 | "plt.imshow(image_data[0,:,:,0])\n",
131 | "print(pr[0])"
132 | ]
133 | },
134 | {
135 | "cell_type": "code",
136 | "execution_count": 73,
137 | "metadata": {
138 | "collapsed": false
139 | },
140 | "outputs": [],
141 | "source": [
142 | "g = model.net.graph"
143 | ]
144 | },
145 | {
146 | "cell_type": "code",
147 | "execution_count": 74,
148 | "metadata": {
149 | "collapsed": false
150 | },
151 | "outputs": [
152 | {
153 | "data": {
154 | "text/plain": [
155 | "['input/X',\n",
156 | " 'Conv2D/W',\n",
157 | " 'Conv2D/W/Initializer/random_uniform/shape',\n",
158 | " 'Conv2D/W/Initializer/random_uniform/min',\n",
159 | " 'Conv2D/W/Initializer/random_uniform/max',\n",
160 | " 'Conv2D/W/Initializer/random_uniform/RandomUniform',\n",
161 | " 'Conv2D/W/Initializer/random_uniform/sub',\n",
162 | " 'Conv2D/W/Initializer/random_uniform/mul',\n",
163 | " 'Conv2D/W/Initializer/random_uniform',\n",
164 | " 'Conv2D/W/Assign',\n",
165 | " 'Conv2D/W/read',\n",
166 | " 'Conv2D/b',\n",
167 | " 'Conv2D/b/Initializer/Const',\n",
168 | " 'Conv2D/b/Assign',\n",
169 | " 'Conv2D/b/read',\n",
170 | " 'Conv2D/Conv2D',\n",
171 | " 'Conv2D/BiasAdd',\n",
172 | " 'Conv2D/Tanh',\n",
173 | " 'FullyConnected/W',\n",
174 | " 'FullyConnected/W/Initializer/truncated_normal/shape',\n",
175 | " 'FullyConnected/W/Initializer/truncated_normal/mean',\n",
176 | " 'FullyConnected/W/Initializer/truncated_normal/stddev',\n",
177 | " 'FullyConnected/W/Initializer/truncated_normal/TruncatedNormal',\n",
178 | " 'FullyConnected/W/Initializer/truncated_normal/mul',\n",
179 | " 'FullyConnected/W/Initializer/truncated_normal',\n",
180 | " 'FullyConnected/W/Assign',\n",
181 | " 'FullyConnected/W/read',\n",
182 | " 'FullyConnected/b',\n",
183 | " 'FullyConnected/b/Initializer/Const',\n",
184 | " 'FullyConnected/b/Assign',\n",
185 | " 'FullyConnected/b/read',\n",
186 | " 'FullyConnected/Reshape/shape',\n",
187 | " 'FullyConnected/Reshape',\n",
188 | " 'FullyConnected/MatMul',\n",
189 | " 'FullyConnected/BiasAdd',\n",
190 | " 'target/Y',\n",
191 | " 'Accuracy/ArgMax/dimension',\n",
192 | " 'Accuracy/ArgMax',\n",
193 | " 'Accuracy/ArgMax_1/dimension',\n",
194 | " 'Accuracy/ArgMax_1',\n",
195 | " 'Accuracy/Equal',\n",
196 | " 'Accuracy/Cast',\n",
197 | " 'Accuracy/Const',\n",
198 | " 'Accuracy/Mean',\n",
199 | " 'MeanSquare/sub',\n",
200 | " 'MeanSquare/Square',\n",
201 | " 'MeanSquare/Const',\n",
202 | " 'MeanSquare/Mean',\n",
203 | " 'Training_step/initial_value',\n",
204 | " 'Training_step',\n",
205 | " 'Training_step/Assign',\n",
206 | " 'Training_step/read',\n",
207 | " 'is_training',\n",
208 | " 'is_training/Initializer/Const',\n",
209 | " 'is_training/Assign',\n",
210 | " 'is_training/read',\n",
211 | " 'Assign/value',\n",
212 | " 'Assign',\n",
213 | " 'Assign_1/value',\n",
214 | " 'Assign_1',\n",
215 | " 'Global_Step/initial_value',\n",
216 | " 'Global_Step',\n",
217 | " 'Global_Step/Assign',\n",
218 | " 'Global_Step/read',\n",
219 | " 'Add/y',\n",
220 | " 'Add',\n",
221 | " 'Assign_2',\n",
222 | " 'val_loss/initial_value',\n",
223 | " 'val_loss',\n",
224 | " 'val_loss/Assign',\n",
225 | " 'val_loss/read',\n",
226 | " 'val_acc/initial_value',\n",
227 | " 'val_acc',\n",
228 | " 'val_acc/Assign',\n",
229 | " 'val_acc/read',\n",
230 | " 'zeros',\n",
231 | " 'Accuracy/Mean/moving_avg',\n",
232 | " 'Accuracy/Mean/moving_avg/Assign',\n",
233 | " 'Accuracy/Mean/moving_avg/read',\n",
234 | " 'moving_avg/decay',\n",
235 | " 'moving_avg/add/x',\n",
236 | " 'moving_avg/add',\n",
237 | " 'moving_avg/add_1/x',\n",
238 | " 'moving_avg/add_1',\n",
239 | " 'moving_avg/truediv',\n",
240 | " 'moving_avg/Minimum',\n",
241 | " 'moving_avg/AssignMovingAvg/sub/x',\n",
242 | " 'moving_avg/AssignMovingAvg/sub',\n",
243 | " 'moving_avg/AssignMovingAvg/sub_1',\n",
244 | " 'moving_avg/AssignMovingAvg/mul',\n",
245 | " 'moving_avg/AssignMovingAvg',\n",
246 | " 'moving_avg',\n",
247 | " 'SGD/Total_Loss',\n",
248 | " 'SGD/zeros',\n",
249 | " 'SGD/MeanSquare/Mean/moving_avg',\n",
250 | " 'SGD/MeanSquare/Mean/moving_avg/Assign',\n",
251 | " 'SGD/MeanSquare/Mean/moving_avg/read',\n",
252 | " 'SGD/moving_avg/decay',\n",
253 | " 'SGD/moving_avg/add/x',\n",
254 | " 'SGD/moving_avg/add',\n",
255 | " 'SGD/moving_avg/add_1/x',\n",
256 | " 'SGD/moving_avg/add_1',\n",
257 | " 'SGD/moving_avg/truediv',\n",
258 | " 'SGD/moving_avg/Minimum',\n",
259 | " 'SGD/moving_avg/AssignMovingAvg/sub/x',\n",
260 | " 'SGD/moving_avg/AssignMovingAvg/sub',\n",
261 | " 'SGD/moving_avg/AssignMovingAvg/sub_1',\n",
262 | " 'SGD/moving_avg/AssignMovingAvg/mul',\n",
263 | " 'SGD/moving_avg/AssignMovingAvg',\n",
264 | " 'SGD/moving_avg',\n",
265 | " 'SGD/ScalarSummary/tags',\n",
266 | " 'SGD/ScalarSummary',\n",
267 | " 'SGD/ScalarSummary_1/tags',\n",
268 | " 'SGD/ScalarSummary_1',\n",
269 | " 'SGD/gradients/Shape',\n",
270 | " 'SGD/gradients/Const',\n",
271 | " 'SGD/gradients/Fill',\n",
272 | " 'SGD/gradients/MeanSquare/Mean_grad/Reshape/shape',\n",
273 | " 'SGD/gradients/MeanSquare/Mean_grad/Reshape',\n",
274 | " 'SGD/gradients/MeanSquare/Mean_grad/Shape',\n",
275 | " 'SGD/gradients/MeanSquare/Mean_grad/Tile',\n",
276 | " 'SGD/gradients/MeanSquare/Mean_grad/Shape_1',\n",
277 | " 'SGD/gradients/MeanSquare/Mean_grad/Shape_2',\n",
278 | " 'SGD/gradients/MeanSquare/Mean_grad/Const',\n",
279 | " 'SGD/gradients/MeanSquare/Mean_grad/Prod',\n",
280 | " 'SGD/gradients/MeanSquare/Mean_grad/Const_1',\n",
281 | " 'SGD/gradients/MeanSquare/Mean_grad/Prod_1',\n",
282 | " 'SGD/gradients/MeanSquare/Mean_grad/Maximum/y',\n",
283 | " 'SGD/gradients/MeanSquare/Mean_grad/Maximum',\n",
284 | " 'SGD/gradients/MeanSquare/Mean_grad/floordiv',\n",
285 | " 'SGD/gradients/MeanSquare/Mean_grad/Cast',\n",
286 | " 'SGD/gradients/MeanSquare/Mean_grad/truediv',\n",
287 | " 'SGD/gradients/MeanSquare/Square_grad/mul/x',\n",
288 | " 'SGD/gradients/MeanSquare/Square_grad/mul',\n",
289 | " 'SGD/gradients/MeanSquare/Square_grad/mul_1',\n",
290 | " 'SGD/gradients/MeanSquare/sub_grad/Shape',\n",
291 | " 'SGD/gradients/MeanSquare/sub_grad/Shape_1',\n",
292 | " 'SGD/gradients/MeanSquare/sub_grad/BroadcastGradientArgs',\n",
293 | " 'SGD/gradients/MeanSquare/sub_grad/Sum',\n",
294 | " 'SGD/gradients/MeanSquare/sub_grad/Reshape',\n",
295 | " 'SGD/gradients/MeanSquare/sub_grad/Sum_1',\n",
296 | " 'SGD/gradients/MeanSquare/sub_grad/Neg',\n",
297 | " 'SGD/gradients/MeanSquare/sub_grad/Reshape_1',\n",
298 | " 'SGD/gradients/FullyConnected/BiasAdd_grad/BiasAddGrad',\n",
299 | " 'SGD/gradients/FullyConnected/MatMul_grad/MatMul',\n",
300 | " 'SGD/gradients/FullyConnected/MatMul_grad/MatMul_1',\n",
301 | " 'SGD/gradients/FullyConnected/Reshape_grad/Shape',\n",
302 | " 'SGD/gradients/FullyConnected/Reshape_grad/Reshape',\n",
303 | " 'SGD/gradients/Conv2D/Tanh_grad/TanhGrad',\n",
304 | " 'SGD/gradients/Conv2D/BiasAdd_grad/BiasAddGrad',\n",
305 | " 'SGD/gradients/Conv2D/Conv2D_grad/Shape',\n",
306 | " 'SGD/gradients/Conv2D/Conv2D_grad/Conv2DBackpropInput',\n",
307 | " 'SGD/gradients/Conv2D/Conv2D_grad/Shape_1',\n",
308 | " 'SGD/gradients/Conv2D/Conv2D_grad/Conv2DBackpropFilter',\n",
309 | " 'SGD/global_norm/L2Loss',\n",
310 | " 'SGD/global_norm/L2Loss_1',\n",
311 | " 'SGD/global_norm/L2Loss_2',\n",
312 | " 'SGD/global_norm/L2Loss_3',\n",
313 | " 'SGD/global_norm/pack',\n",
314 | " 'SGD/global_norm/Const',\n",
315 | " 'SGD/global_norm/Sum',\n",
316 | " 'SGD/global_norm/Const_1',\n",
317 | " 'SGD/global_norm/mul',\n",
318 | " 'SGD/global_norm/global_norm',\n",
319 | " 'SGD/clip_by_global_norm/truediv/x',\n",
320 | " 'SGD/clip_by_global_norm/truediv',\n",
321 | " 'SGD/clip_by_global_norm/Const',\n",
322 | " 'SGD/clip_by_global_norm/Minimum',\n",
323 | " 'SGD/clip_by_global_norm/mul/x',\n",
324 | " 'SGD/clip_by_global_norm/mul',\n",
325 | " 'SGD/clip_by_global_norm/mul_1',\n",
326 | " 'SGD/clip_by_global_norm/SGD/clip_by_global_norm/_0',\n",
327 | " 'SGD/clip_by_global_norm/mul_2',\n",
328 | " 'SGD/clip_by_global_norm/SGD/clip_by_global_norm/_1',\n",
329 | " 'SGD/clip_by_global_norm/mul_3',\n",
330 | " 'SGD/clip_by_global_norm/SGD/clip_by_global_norm/_2',\n",
331 | " 'SGD/clip_by_global_norm/mul_4',\n",
332 | " 'SGD/clip_by_global_norm/SGD/clip_by_global_norm/_3',\n",
333 | " 'SGD/apply_grad_op_0/learning_rate',\n",
334 | " 'SGD/apply_grad_op_0/update_Conv2D/W/ApplyGradientDescent',\n",
335 | " 'SGD/apply_grad_op_0/update_Conv2D/b/ApplyGradientDescent',\n",
336 | " 'SGD/apply_grad_op_0/update_FullyConnected/W/ApplyGradientDescent',\n",
337 | " 'SGD/apply_grad_op_0/update_FullyConnected/b/ApplyGradientDescent',\n",
338 | " 'SGD/apply_grad_op_0/update',\n",
339 | " 'SGD/apply_grad_op_0/value',\n",
340 | " 'SGD/apply_grad_op_0',\n",
341 | " 'SGD/MergeSummary/MergeSummary',\n",
342 | " 'SGD/train_op_0',\n",
343 | " 'save/Const',\n",
344 | " 'save/save/tensor_names',\n",
345 | " 'save/save/shapes_and_slices',\n",
346 | " 'save/save',\n",
347 | " 'save/control_dependency',\n",
348 | " 'save/restore_slice/tensor_name',\n",
349 | " 'save/restore_slice/shape_and_slice',\n",
350 | " 'save/restore_slice',\n",
351 | " 'save/Assign',\n",
352 | " 'save/restore_slice_1/tensor_name',\n",
353 | " 'save/restore_slice_1/shape_and_slice',\n",
354 | " 'save/restore_slice_1',\n",
355 | " 'save/Assign_1',\n",
356 | " 'save/restore_slice_2/tensor_name',\n",
357 | " 'save/restore_slice_2/shape_and_slice',\n",
358 | " 'save/restore_slice_2',\n",
359 | " 'save/Assign_2',\n",
360 | " 'save/restore_slice_3/tensor_name',\n",
361 | " 'save/restore_slice_3/shape_and_slice',\n",
362 | " 'save/restore_slice_3',\n",
363 | " 'save/Assign_3',\n",
364 | " 'save/restore_slice_4/tensor_name',\n",
365 | " 'save/restore_slice_4/shape_and_slice',\n",
366 | " 'save/restore_slice_4',\n",
367 | " 'save/Assign_4',\n",
368 | " 'save/restore_slice_5/tensor_name',\n",
369 | " 'save/restore_slice_5/shape_and_slice',\n",
370 | " 'save/restore_slice_5',\n",
371 | " 'save/Assign_5',\n",
372 | " 'save/restore_slice_6/tensor_name',\n",
373 | " 'save/restore_slice_6/shape_and_slice',\n",
374 | " 'save/restore_slice_6',\n",
375 | " 'save/Assign_6',\n",
376 | " 'save/restore_slice_7/tensor_name',\n",
377 | " 'save/restore_slice_7/shape_and_slice',\n",
378 | " 'save/restore_slice_7',\n",
379 | " 'save/Assign_7',\n",
380 | " 'save/restore_slice_8/tensor_name',\n",
381 | " 'save/restore_slice_8/shape_and_slice',\n",
382 | " 'save/restore_slice_8',\n",
383 | " 'save/Assign_8',\n",
384 | " 'save/restore_slice_9/tensor_name',\n",
385 | " 'save/restore_slice_9/shape_and_slice',\n",
386 | " 'save/restore_slice_9',\n",
387 | " 'save/Assign_9',\n",
388 | " 'save/restore_slice_10/tensor_name',\n",
389 | " 'save/restore_slice_10/shape_and_slice',\n",
390 | " 'save/restore_slice_10',\n",
391 | " 'save/Assign_10',\n",
392 | " 'save/restore_all',\n",
393 | " 'save_1/Const',\n",
394 | " 'save_1/save/tensor_names',\n",
395 | " 'save_1/save/shapes_and_slices',\n",
396 | " 'save_1/save',\n",
397 | " 'save_1/control_dependency',\n",
398 | " 'save_1/restore_slice/tensor_name',\n",
399 | " 'save_1/restore_slice/shape_and_slice',\n",
400 | " 'save_1/restore_slice',\n",
401 | " 'save_1/Assign',\n",
402 | " 'save_1/restore_slice_1/tensor_name',\n",
403 | " 'save_1/restore_slice_1/shape_and_slice',\n",
404 | " 'save_1/restore_slice_1',\n",
405 | " 'save_1/Assign_1',\n",
406 | " 'save_1/restore_slice_2/tensor_name',\n",
407 | " 'save_1/restore_slice_2/shape_and_slice',\n",
408 | " 'save_1/restore_slice_2',\n",
409 | " 'save_1/Assign_2',\n",
410 | " 'save_1/restore_slice_3/tensor_name',\n",
411 | " 'save_1/restore_slice_3/shape_and_slice',\n",
412 | " 'save_1/restore_slice_3',\n",
413 | " 'save_1/Assign_3',\n",
414 | " 'save_1/restore_slice_4/tensor_name',\n",
415 | " 'save_1/restore_slice_4/shape_and_slice',\n",
416 | " 'save_1/restore_slice_4',\n",
417 | " 'save_1/Assign_4',\n",
418 | " 'save_1/restore_slice_5/tensor_name',\n",
419 | " 'save_1/restore_slice_5/shape_and_slice',\n",
420 | " 'save_1/restore_slice_5',\n",
421 | " 'save_1/Assign_5',\n",
422 | " 'save_1/restore_slice_6/tensor_name',\n",
423 | " 'save_1/restore_slice_6/shape_and_slice',\n",
424 | " 'save_1/restore_slice_6',\n",
425 | " 'save_1/Assign_6',\n",
426 | " 'save_1/restore_slice_7/tensor_name',\n",
427 | " 'save_1/restore_slice_7/shape_and_slice',\n",
428 | " 'save_1/restore_slice_7',\n",
429 | " 'save_1/Assign_7',\n",
430 | " 'save_1/restore_slice_8/tensor_name',\n",
431 | " 'save_1/restore_slice_8/shape_and_slice',\n",
432 | " 'save_1/restore_slice_8',\n",
433 | " 'save_1/Assign_8',\n",
434 | " 'save_1/restore_slice_9/tensor_name',\n",
435 | " 'save_1/restore_slice_9/shape_and_slice',\n",
436 | " 'save_1/restore_slice_9',\n",
437 | " 'save_1/Assign_9',\n",
438 | " 'save_1/restore_slice_10/tensor_name',\n",
439 | " 'save_1/restore_slice_10/shape_and_slice',\n",
440 | " 'save_1/restore_slice_10',\n",
441 | " 'save_1/Assign_10',\n",
442 | " 'save_1/restore_all',\n",
443 | " 'init',\n",
444 | " 'save_2/Const',\n",
445 | " 'save_2/save/tensor_names',\n",
446 | " 'save_2/save/shapes_and_slices',\n",
447 | " 'save_2/save',\n",
448 | " 'save_2/control_dependency',\n",
449 | " 'save_2/restore_slice/tensor_name',\n",
450 | " 'save_2/restore_slice/shape_and_slice',\n",
451 | " 'save_2/restore_slice',\n",
452 | " 'save_2/Assign',\n",
453 | " 'save_2/restore_slice_1/tensor_name',\n",
454 | " 'save_2/restore_slice_1/shape_and_slice',\n",
455 | " 'save_2/restore_slice_1',\n",
456 | " 'save_2/Assign_1',\n",
457 | " 'save_2/restore_slice_2/tensor_name',\n",
458 | " 'save_2/restore_slice_2/shape_and_slice',\n",
459 | " 'save_2/restore_slice_2',\n",
460 | " 'save_2/Assign_2',\n",
461 | " 'save_2/restore_slice_3/tensor_name',\n",
462 | " 'save_2/restore_slice_3/shape_and_slice',\n",
463 | " 'save_2/restore_slice_3',\n",
464 | " 'save_2/Assign_3',\n",
465 | " 'save_2/restore_slice_4/tensor_name',\n",
466 | " 'save_2/restore_slice_4/shape_and_slice',\n",
467 | " 'save_2/restore_slice_4',\n",
468 | " 'save_2/Assign_4',\n",
469 | " 'save_2/restore_slice_5/tensor_name',\n",
470 | " 'save_2/restore_slice_5/shape_and_slice',\n",
471 | " 'save_2/restore_slice_5',\n",
472 | " 'save_2/Assign_5',\n",
473 | " 'save_2/restore_slice_6/tensor_name',\n",
474 | " 'save_2/restore_slice_6/shape_and_slice',\n",
475 | " 'save_2/restore_slice_6',\n",
476 | " 'save_2/Assign_6',\n",
477 | " 'save_2/restore_slice_7/tensor_name',\n",
478 | " 'save_2/restore_slice_7/shape_and_slice',\n",
479 | " 'save_2/restore_slice_7',\n",
480 | " 'save_2/Assign_7',\n",
481 | " 'save_2/restore_slice_8/tensor_name',\n",
482 | " 'save_2/restore_slice_8/shape_and_slice',\n",
483 | " 'save_2/restore_slice_8',\n",
484 | " 'save_2/Assign_8',\n",
485 | " 'save_2/restore_slice_9/tensor_name',\n",
486 | " 'save_2/restore_slice_9/shape_and_slice',\n",
487 | " 'save_2/restore_slice_9',\n",
488 | " 'save_2/Assign_9',\n",
489 | " 'save_2/restore_slice_10/tensor_name',\n",
490 | " 'save_2/restore_slice_10/shape_and_slice',\n",
491 | " 'save_2/restore_slice_10',\n",
492 | " 'save_2/Assign_10',\n",
493 | " 'save_2/restore_all',\n",
494 | " 'init_1',\n",
495 | " 'save_3/Const',\n",
496 | " 'save_3/save/tensor_names',\n",
497 | " 'save_3/save/shapes_and_slices',\n",
498 | " 'save_3/save',\n",
499 | " 'save_3/control_dependency',\n",
500 | " 'save_3/restore_slice/tensor_name',\n",
501 | " 'save_3/restore_slice/shape_and_slice',\n",
502 | " 'save_3/restore_slice',\n",
503 | " 'save_3/Assign',\n",
504 | " 'save_3/restore_slice_1/tensor_name',\n",
505 | " 'save_3/restore_slice_1/shape_and_slice',\n",
506 | " 'save_3/restore_slice_1',\n",
507 | " 'save_3/Assign_1',\n",
508 | " 'save_3/restore_slice_2/tensor_name',\n",
509 | " 'save_3/restore_slice_2/shape_and_slice',\n",
510 | " 'save_3/restore_slice_2',\n",
511 | " 'save_3/Assign_2',\n",
512 | " 'save_3/restore_slice_3/tensor_name',\n",
513 | " 'save_3/restore_slice_3/shape_and_slice',\n",
514 | " 'save_3/restore_slice_3',\n",
515 | " 'save_3/Assign_3',\n",
516 | " 'save_3/restore_slice_4/tensor_name',\n",
517 | " 'save_3/restore_slice_4/shape_and_slice',\n",
518 | " 'save_3/restore_slice_4',\n",
519 | " 'save_3/Assign_4',\n",
520 | " 'save_3/restore_slice_5/tensor_name',\n",
521 | " 'save_3/restore_slice_5/shape_and_slice',\n",
522 | " 'save_3/restore_slice_5',\n",
523 | " 'save_3/Assign_5',\n",
524 | " 'save_3/restore_slice_6/tensor_name',\n",
525 | " 'save_3/restore_slice_6/shape_and_slice',\n",
526 | " 'save_3/restore_slice_6',\n",
527 | " 'save_3/Assign_6',\n",
528 | " 'save_3/restore_slice_7/tensor_name',\n",
529 | " 'save_3/restore_slice_7/shape_and_slice',\n",
530 | " 'save_3/restore_slice_7',\n",
531 | " 'save_3/Assign_7',\n",
532 | " 'save_3/restore_slice_8/tensor_name',\n",
533 | " 'save_3/restore_slice_8/shape_and_slice',\n",
534 | " 'save_3/restore_slice_8',\n",
535 | " 'save_3/Assign_8',\n",
536 | " 'save_3/restore_slice_9/tensor_name',\n",
537 | " 'save_3/restore_slice_9/shape_and_slice',\n",
538 | " 'save_3/restore_slice_9',\n",
539 | " 'save_3/Assign_9',\n",
540 | " 'save_3/restore_slice_10/tensor_name',\n",
541 | " 'save_3/restore_slice_10/shape_and_slice',\n",
542 | " 'save_3/restore_slice_10',\n",
543 | " 'save_3/Assign_10',\n",
544 | " 'save_3/restore_all',\n",
545 | " 'init_2',\n",
546 | " 'save_4/Const',\n",
547 | " 'save_4/save/tensor_names',\n",
548 | " 'save_4/save/shapes_and_slices',\n",
549 | " 'save_4/save',\n",
550 | " 'save_4/control_dependency',\n",
551 | " 'save_4/restore_slice/tensor_name',\n",
552 | " 'save_4/restore_slice/shape_and_slice',\n",
553 | " 'save_4/restore_slice',\n",
554 | " 'save_4/Assign',\n",
555 | " 'save_4/restore_slice_1/tensor_name',\n",
556 | " 'save_4/restore_slice_1/shape_and_slice',\n",
557 | " 'save_4/restore_slice_1',\n",
558 | " 'save_4/Assign_1',\n",
559 | " 'save_4/restore_slice_2/tensor_name',\n",
560 | " 'save_4/restore_slice_2/shape_and_slice',\n",
561 | " 'save_4/restore_slice_2',\n",
562 | " 'save_4/Assign_2',\n",
563 | " 'save_4/restore_slice_3/tensor_name',\n",
564 | " 'save_4/restore_slice_3/shape_and_slice',\n",
565 | " 'save_4/restore_slice_3',\n",
566 | " 'save_4/Assign_3',\n",
567 | " 'save_4/restore_slice_4/tensor_name',\n",
568 | " 'save_4/restore_slice_4/shape_and_slice',\n",
569 | " 'save_4/restore_slice_4',\n",
570 | " 'save_4/Assign_4',\n",
571 | " 'save_4/restore_slice_5/tensor_name',\n",
572 | " 'save_4/restore_slice_5/shape_and_slice',\n",
573 | " 'save_4/restore_slice_5',\n",
574 | " 'save_4/Assign_5',\n",
575 | " 'save_4/restore_slice_6/tensor_name',\n",
576 | " 'save_4/restore_slice_6/shape_and_slice',\n",
577 | " 'save_4/restore_slice_6',\n",
578 | " 'save_4/Assign_6',\n",
579 | " 'save_4/restore_slice_7/tensor_name',\n",
580 | " 'save_4/restore_slice_7/shape_and_slice',\n",
581 | " 'save_4/restore_slice_7',\n",
582 | " 'save_4/Assign_7',\n",
583 | " 'save_4/restore_slice_8/tensor_name',\n",
584 | " 'save_4/restore_slice_8/shape_and_slice',\n",
585 | " 'save_4/restore_slice_8',\n",
586 | " 'save_4/Assign_8',\n",
587 | " 'save_4/restore_slice_9/tensor_name',\n",
588 | " 'save_4/restore_slice_9/shape_and_slice',\n",
589 | " 'save_4/restore_slice_9',\n",
590 | " 'save_4/Assign_9',\n",
591 | " 'save_4/restore_slice_10/tensor_name',\n",
592 | " 'save_4/restore_slice_10/shape_and_slice',\n",
593 | " 'save_4/restore_slice_10',\n",
594 | " 'save_4/Assign_10',\n",
595 | " 'save_4/restore_all',\n",
596 | " 'init_3',\n",
597 | " 'save_5/Const',\n",
598 | " 'save_5/save/tensor_names',\n",
599 | " 'save_5/save/shapes_and_slices',\n",
600 | " 'save_5/save',\n",
601 | " 'save_5/control_dependency',\n",
602 | " 'save_5/restore_slice/tensor_name',\n",
603 | " 'save_5/restore_slice/shape_and_slice',\n",
604 | " 'save_5/restore_slice',\n",
605 | " 'save_5/Assign',\n",
606 | " 'save_5/restore_slice_1/tensor_name',\n",
607 | " 'save_5/restore_slice_1/shape_and_slice',\n",
608 | " 'save_5/restore_slice_1',\n",
609 | " 'save_5/Assign_1',\n",
610 | " 'save_5/restore_slice_2/tensor_name',\n",
611 | " 'save_5/restore_slice_2/shape_and_slice',\n",
612 | " 'save_5/restore_slice_2',\n",
613 | " 'save_5/Assign_2',\n",
614 | " 'save_5/restore_slice_3/tensor_name',\n",
615 | " 'save_5/restore_slice_3/shape_and_slice',\n",
616 | " 'save_5/restore_slice_3',\n",
617 | " 'save_5/Assign_3',\n",
618 | " 'save_5/restore_slice_4/tensor_name',\n",
619 | " 'save_5/restore_slice_4/shape_and_slice',\n",
620 | " 'save_5/restore_slice_4',\n",
621 | " 'save_5/Assign_4',\n",
622 | " 'save_5/restore_slice_5/tensor_name',\n",
623 | " 'save_5/restore_slice_5/shape_and_slice',\n",
624 | " 'save_5/restore_slice_5',\n",
625 | " 'save_5/Assign_5',\n",
626 | " 'save_5/restore_slice_6/tensor_name',\n",
627 | " 'save_5/restore_slice_6/shape_and_slice',\n",
628 | " 'save_5/restore_slice_6',\n",
629 | " 'save_5/Assign_6',\n",
630 | " 'save_5/restore_slice_7/tensor_name',\n",
631 | " 'save_5/restore_slice_7/shape_and_slice',\n",
632 | " 'save_5/restore_slice_7',\n",
633 | " 'save_5/Assign_7',\n",
634 | " 'save_5/restore_slice_8/tensor_name',\n",
635 | " 'save_5/restore_slice_8/shape_and_slice',\n",
636 | " 'save_5/restore_slice_8',\n",
637 | " 'save_5/Assign_8',\n",
638 | " 'save_5/restore_slice_9/tensor_name',\n",
639 | " 'save_5/restore_slice_9/shape_and_slice',\n",
640 | " 'save_5/restore_slice_9',\n",
641 | " 'save_5/Assign_9',\n",
642 | " 'save_5/restore_slice_10/tensor_name',\n",
643 | " 'save_5/restore_slice_10/shape_and_slice',\n",
644 | " 'save_5/restore_slice_10',\n",
645 | " 'save_5/Assign_10',\n",
646 | " 'save_5/restore_all',\n",
647 | " 'init_4',\n",
648 | " 'save_6/Const',\n",
649 | " 'save_6/save/tensor_names',\n",
650 | " 'save_6/save/shapes_and_slices',\n",
651 | " 'save_6/save',\n",
652 | " 'save_6/control_dependency',\n",
653 | " 'save_6/restore_slice/tensor_name',\n",
654 | " 'save_6/restore_slice/shape_and_slice',\n",
655 | " 'save_6/restore_slice',\n",
656 | " 'save_6/Assign',\n",
657 | " 'save_6/restore_slice_1/tensor_name',\n",
658 | " 'save_6/restore_slice_1/shape_and_slice',\n",
659 | " 'save_6/restore_slice_1',\n",
660 | " 'save_6/Assign_1',\n",
661 | " 'save_6/restore_slice_2/tensor_name',\n",
662 | " 'save_6/restore_slice_2/shape_and_slice',\n",
663 | " 'save_6/restore_slice_2',\n",
664 | " 'save_6/Assign_2',\n",
665 | " 'save_6/restore_slice_3/tensor_name',\n",
666 | " 'save_6/restore_slice_3/shape_and_slice',\n",
667 | " 'save_6/restore_slice_3',\n",
668 | " 'save_6/Assign_3',\n",
669 | " 'save_6/restore_slice_4/tensor_name',\n",
670 | " 'save_6/restore_slice_4/shape_and_slice',\n",
671 | " 'save_6/restore_slice_4',\n",
672 | " 'save_6/Assign_4',\n",
673 | " 'save_6/restore_slice_5/tensor_name',\n",
674 | " 'save_6/restore_slice_5/shape_and_slice',\n",
675 | " 'save_6/restore_slice_5',\n",
676 | " 'save_6/Assign_5',\n",
677 | " 'save_6/restore_slice_6/tensor_name',\n",
678 | " 'save_6/restore_slice_6/shape_and_slice',\n",
679 | " 'save_6/restore_slice_6',\n",
680 | " 'save_6/Assign_6',\n",
681 | " 'save_6/restore_slice_7/tensor_name',\n",
682 | " 'save_6/restore_slice_7/shape_and_slice',\n",
683 | " 'save_6/restore_slice_7',\n",
684 | " 'save_6/Assign_7',\n",
685 | " 'save_6/restore_slice_8/tensor_name',\n",
686 | " 'save_6/restore_slice_8/shape_and_slice',\n",
687 | " 'save_6/restore_slice_8',\n",
688 | " 'save_6/Assign_8',\n",
689 | " 'save_6/restore_slice_9/tensor_name',\n",
690 | " 'save_6/restore_slice_9/shape_and_slice',\n",
691 | " 'save_6/restore_slice_9',\n",
692 | " 'save_6/Assign_9',\n",
693 | " 'save_6/restore_slice_10/tensor_name',\n",
694 | " 'save_6/restore_slice_10/shape_and_slice',\n",
695 | " 'save_6/restore_slice_10',\n",
696 | " 'save_6/Assign_10',\n",
697 | " 'save_6/restore_all',\n",
698 | " 'init_5',\n",
699 | " 'init_6',\n",
700 | " 'save_7/Const',\n",
701 | " 'save_7/save/tensor_names',\n",
702 | " 'save_7/save/shapes_and_slices',\n",
703 | " 'save_7/save',\n",
704 | " 'save_7/control_dependency',\n",
705 | " 'save_7/restore_slice/tensor_name',\n",
706 | " 'save_7/restore_slice/shape_and_slice',\n",
707 | " 'save_7/restore_slice',\n",
708 | " 'save_7/Assign',\n",
709 | " 'save_7/restore_slice_1/tensor_name',\n",
710 | " 'save_7/restore_slice_1/shape_and_slice',\n",
711 | " 'save_7/restore_slice_1',\n",
712 | " 'save_7/Assign_1',\n",
713 | " 'save_7/restore_slice_2/tensor_name',\n",
714 | " 'save_7/restore_slice_2/shape_and_slice',\n",
715 | " 'save_7/restore_slice_2',\n",
716 | " 'save_7/Assign_2',\n",
717 | " 'save_7/restore_slice_3/tensor_name',\n",
718 | " 'save_7/restore_slice_3/shape_and_slice',\n",
719 | " 'save_7/restore_slice_3',\n",
720 | " 'save_7/Assign_3',\n",
721 | " 'save_7/restore_slice_4/tensor_name',\n",
722 | " 'save_7/restore_slice_4/shape_and_slice',\n",
723 | " 'save_7/restore_slice_4',\n",
724 | " 'save_7/Assign_4',\n",
725 | " 'save_7/restore_slice_5/tensor_name',\n",
726 | " 'save_7/restore_slice_5/shape_and_slice',\n",
727 | " 'save_7/restore_slice_5',\n",
728 | " 'save_7/Assign_5',\n",
729 | " 'save_7/restore_slice_6/tensor_name',\n",
730 | " 'save_7/restore_slice_6/shape_and_slice',\n",
731 | " 'save_7/restore_slice_6',\n",
732 | " 'save_7/Assign_6',\n",
733 | " 'save_7/restore_slice_7/tensor_name',\n",
734 | " 'save_7/restore_slice_7/shape_and_slice',\n",
735 | " 'save_7/restore_slice_7',\n",
736 | " 'save_7/Assign_7',\n",
737 | " 'save_7/restore_slice_8/tensor_name',\n",
738 | " 'save_7/restore_slice_8/shape_and_slice',\n",
739 | " 'save_7/restore_slice_8',\n",
740 | " 'save_7/Assign_8',\n",
741 | " 'save_7/restore_slice_9/tensor_name',\n",
742 | " 'save_7/restore_slice_9/shape_and_slice',\n",
743 | " 'save_7/restore_slice_9',\n",
744 | " 'save_7/Assign_9',\n",
745 | " 'save_7/restore_slice_10/tensor_name',\n",
746 | " 'save_7/restore_slice_10/shape_and_slice',\n",
747 | " 'save_7/restore_slice_10',\n",
748 | " 'save_7/Assign_10',\n",
749 | " 'save_7/restore_all']"
750 | ]
751 | },
752 | "execution_count": 74,
753 | "metadata": {},
754 | "output_type": "execute_result"
755 | }
756 | ],
757 | "source": [
758 | "[op.name for op in g.get_operations()]"
759 | ]
760 | },
761 | {
762 | "cell_type": "code",
763 | "execution_count": 75,
764 | "metadata": {
765 | "collapsed": false
766 | },
767 | "outputs": [],
768 | "source": [
769 | "conv2_tensor = g.get_tensor_by_name('Conv2D/Tanh:0')\n",
770 | "shape = conv2_tensor.get_shape()\n",
771 | "\n",
772 | "fc_W_tensor = g.get_tensor_by_name('FullyConnected/W:0')\n",
773 | "fc_W = fc_W_tensor.eval(session=model.session)\n",
774 | "fc_W = fc_W.reshape(*shape[1:])"
775 | ]
776 | },
777 | {
778 | "cell_type": "code",
779 | "execution_count": 76,
780 | "metadata": {
781 | "collapsed": false
782 | },
783 | "outputs": [],
784 | "source": [
785 | "%matplotlib inline\n",
786 | "import matplotlib.pyplot as plt"
787 | ]
788 | },
789 | {
790 | "cell_type": "code",
791 | "execution_count": 77,
792 | "metadata": {
793 | "collapsed": false
794 | },
795 | "outputs": [
796 | {
797 | "data": {
798 | "text/plain": [
799 | ""
800 | ]
801 | },
802 | "execution_count": 77,
803 | "metadata": {},
804 | "output_type": "execute_result"
805 | },
806 | {
807 | "data": {
808 | "image/png": "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\n",
809 | "text/plain": [
810 | ""
811 | ]
812 | },
813 | "metadata": {},
814 | "output_type": "display_data"
815 | }
816 | ],
817 | "source": [
818 | "plt.matshow(fc_W[:,:,0])"
819 | ]
820 | },
821 | {
822 | "cell_type": "code",
823 | "execution_count": null,
824 | "metadata": {
825 | "collapsed": true
826 | },
827 | "outputs": [],
828 | "source": []
829 | }
830 | ],
831 | "metadata": {
832 | "kernelspec": {
833 | "display_name": "Python [py3]",
834 | "language": "python",
835 | "name": "Python [py3]"
836 | },
837 | "language_info": {
838 | "codemirror_mode": {
839 | "name": "ipython",
840 | "version": 3
841 | },
842 | "file_extension": ".py",
843 | "mimetype": "text/x-python",
844 | "name": "python",
845 | "nbconvert_exporter": "python",
846 | "pygments_lexer": "ipython3",
847 | "version": "3.5.2"
848 | }
849 | },
850 | "nbformat": 4,
851 | "nbformat_minor": 0
852 | }
853 |
--------------------------------------------------------------------------------
/src/ai/explore_train.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 3,
6 | "metadata": {
7 | "collapsed": true
8 | },
9 | "outputs": [],
10 | "source": [
11 | "import numpy as np"
12 | ]
13 | },
14 | {
15 | "cell_type": "code",
16 | "execution_count": 4,
17 | "metadata": {
18 | "collapsed": true
19 | },
20 | "outputs": [],
21 | "source": [
22 | "import tensorflow as tf"
23 | ]
24 | },
25 | {
26 | "cell_type": "code",
27 | "execution_count": 5,
28 | "metadata": {
29 | "collapsed": true
30 | },
31 | "outputs": [],
32 | "source": [
33 | "import tflearn"
34 | ]
35 | },
36 | {
37 | "cell_type": "code",
38 | "execution_count": 7,
39 | "metadata": {
40 | "collapsed": false
41 | },
42 | "outputs": [],
43 | "source": [
44 | "%reload_ext autoreload\n",
45 | "%aimport generate_data"
46 | ]
47 | },
48 | {
49 | "cell_type": "code",
50 | "execution_count": 45,
51 | "metadata": {
52 | "collapsed": false
53 | },
54 | "outputs": [],
55 | "source": [
56 | "input_size = 128\n",
57 | "minibatch_size = 10000\n",
58 | "image_data, label_data = generate_data.generate_batch(height=input_size, width=input_size, minibatch_size=minibatch_size)"
59 | ]
60 | },
61 | {
62 | "cell_type": "code",
63 | "execution_count": 26,
64 | "metadata": {
65 | "collapsed": true
66 | },
67 | "outputs": [],
68 | "source": [
69 | "from tflearn.layers.core import input_data, dropout, fully_connected\n",
70 | "from tflearn.layers.conv import conv_2d, max_pool_2d\n",
71 | "from tflearn.layers.normalization import local_response_normalization\n",
72 | "from tflearn.layers.estimator import regression"
73 | ]
74 | },
75 | {
76 | "cell_type": "code",
77 | "execution_count": 49,
78 | "metadata": {
79 | "collapsed": true
80 | },
81 | "outputs": [],
82 | "source": [
83 | "tf.reset_default_graph()"
84 | ]
85 | },
86 | {
87 | "cell_type": "code",
88 | "execution_count": 50,
89 | "metadata": {
90 | "collapsed": false
91 | },
92 | "outputs": [],
93 | "source": [
94 | "# Building convolutional network\n",
95 | "network = input_data(shape=[None, 128, 128, 1], name='input')\n",
96 | "network = conv_2d(network, nb_filter=2, filter_size=5, strides=1, activation='tanh')\n",
97 | "network = fully_connected(network, 1, activation='linear')\n",
98 | "network = regression(network, optimizer='adam', learning_rate=0.001,\n",
99 | " loss='mean_square', name='target')"
100 | ]
101 | },
102 | {
103 | "cell_type": "code",
104 | "execution_count": 51,
105 | "metadata": {
106 | "collapsed": false
107 | },
108 | "outputs": [
109 | {
110 | "name": "stdout",
111 | "output_type": "stream",
112 | "text": [
113 | "Training Step: 138 | total loss: \u001b[1m\u001b[32m0.04324\u001b[0m\u001b[0m\n",
114 | "\u001b[2K\r",
115 | "| Adam | epoch: 000 | loss: 0.04324 - acc: 1.0000 -- iter: 08832/10000\n"
116 | ]
117 | },
118 | {
119 | "ename": "KeyboardInterrupt",
120 | "evalue": "",
121 | "output_type": "error",
122 | "traceback": [
123 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
124 | "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
125 | "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mmodel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtflearn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDNN\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnetwork\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtensorboard_verbose\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m model.fit({'input': X}, {'target': Y}, n_epoch=100,\n\u001b[0;32m----> 7\u001b[0;31m snapshot_step=100, show_metric=True, run_id='road_model1')\n\u001b[0m",
126 | "\u001b[0;32m/Users/andy/anaconda/envs/py3/lib/python3.5/site-packages/tflearn/models/dnn.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, X_inputs, Y_targets, n_epoch, validation_set, show_metric, batch_size, shuffle, snapshot_epoch, snapshot_step, excl_trainops, run_id)\u001b[0m\n\u001b[1;32m 186\u001b[0m \u001b[0mdaug_dict\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdaug_dict\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 187\u001b[0m \u001b[0mexcl_trainops\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mexcl_trainops\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 188\u001b[0;31m run_id=run_id)\n\u001b[0m\u001b[1;32m 189\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 190\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mpredict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mX\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
127 | "\u001b[0;32m/Users/andy/anaconda/envs/py3/lib/python3.5/site-packages/tflearn/helpers/trainer.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, feed_dicts, n_epoch, val_feed_dicts, show_metric, snapshot_step, snapshot_epoch, shuffle_all, dprep_dict, daug_dict, excl_trainops, run_id)\u001b[0m\n\u001b[1;32m 275\u001b[0m \u001b[0msnapshot_epoch\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 276\u001b[0m \u001b[0msnapshot_step\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 277\u001b[0;31m show_metric)\n\u001b[0m\u001b[1;32m 278\u001b[0m \u001b[0mglobal_loss\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0mtrain_op\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mloss_value\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 279\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtrain_op\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0macc_value\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mglobal_acc\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
128 | "\u001b[0;32m/Users/andy/anaconda/envs/py3/lib/python3.5/site-packages/tflearn/helpers/trainer.py\u001b[0m in \u001b[0;36m_train\u001b[0;34m(self, training_step, snapshot_epoch, snapshot_step, show_metric)\u001b[0m\n\u001b[1;32m 682\u001b[0m \u001b[0mtflearn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_training\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msession\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msession\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 683\u001b[0m _, train_summ_str = self.session.run([self.train, self.summ_op],\n\u001b[0;32m--> 684\u001b[0;31m feed_batch)\n\u001b[0m\u001b[1;32m 685\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 686\u001b[0m \u001b[0;31m# Retrieve loss value from summary string\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
129 | "\u001b[0;32m/Users/andy/anaconda/envs/py3/lib/python3.5/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36mrun\u001b[0;34m(self, fetches, feed_dict, options, run_metadata)\u001b[0m\n\u001b[1;32m 370\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 371\u001b[0m result = self._run(None, fetches, feed_dict, options_ptr,\n\u001b[0;32m--> 372\u001b[0;31m run_metadata_ptr)\n\u001b[0m\u001b[1;32m 373\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mrun_metadata\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 374\u001b[0m \u001b[0mproto_data\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtf_session\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTF_GetBuffer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrun_metadata_ptr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
130 | "\u001b[0;32m/Users/andy/anaconda/envs/py3/lib/python3.5/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_run\u001b[0;34m(self, handle, fetches, feed_dict, options, run_metadata)\u001b[0m\n\u001b[1;32m 634\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 635\u001b[0m results = self._do_run(handle, target_list, unique_fetches,\n\u001b[0;32m--> 636\u001b[0;31m feed_dict_string, options, run_metadata)\n\u001b[0m\u001b[1;32m 637\u001b[0m \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 638\u001b[0m \u001b[0;31m# The movers are no longer used. Delete them.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
131 | "\u001b[0;32m/Users/andy/anaconda/envs/py3/lib/python3.5/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_do_run\u001b[0;34m(self, handle, target_list, fetch_list, feed_dict, options, run_metadata)\u001b[0m\n\u001b[1;32m 706\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mhandle\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 707\u001b[0m return self._do_call(_run_fn, self._session, feed_dict, fetch_list,\n\u001b[0;32m--> 708\u001b[0;31m target_list, options, run_metadata)\n\u001b[0m\u001b[1;32m 709\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 710\u001b[0m return self._do_call(_prun_fn, self._session, handle, feed_dict,\n",
132 | "\u001b[0;32m/Users/andy/anaconda/envs/py3/lib/python3.5/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_do_call\u001b[0;34m(self, fn, *args)\u001b[0m\n\u001b[1;32m 713\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_do_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 714\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 715\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 716\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0merrors\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mOpError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 717\u001b[0m \u001b[0mmessage\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcompat\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mas_text\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmessage\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
133 | "\u001b[0;32m/Users/andy/anaconda/envs/py3/lib/python3.5/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_run_fn\u001b[0;34m(session, feed_dict, fetch_list, target_list, options, run_metadata)\u001b[0m\n\u001b[1;32m 695\u001b[0m return tf_session.TF_Run(session, options,\n\u001b[1;32m 696\u001b[0m \u001b[0mfeed_dict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfetch_list\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtarget_list\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 697\u001b[0;31m status, run_metadata)\n\u001b[0m\u001b[1;32m 698\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 699\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_prun_fn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msession\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhandle\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfeed_dict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfetch_list\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
134 | "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
135 | ]
136 | }
137 | ],
138 | "source": [
139 | "X = image_data\n",
140 | "Y = label_data[:,np.newaxis]\n",
141 | "\n",
142 | "# Train\n",
143 | "model = tflearn.DNN(network, tensorboard_verbose=0)\n",
144 | "model.fit({'input': X}, {'target': Y}, n_epoch=100,\n",
145 | " snapshot_step=100, show_metric=True, run_id='road_model1')"
146 | ]
147 | },
148 | {
149 | "cell_type": "code",
150 | "execution_count": 52,
151 | "metadata": {
152 | "collapsed": true
153 | },
154 | "outputs": [],
155 | "source": [
156 | "? model.fit"
157 | ]
158 | },
159 | {
160 | "cell_type": "code",
161 | "execution_count": null,
162 | "metadata": {
163 | "collapsed": true
164 | },
165 | "outputs": [],
166 | "source": []
167 | }
168 | ],
169 | "metadata": {
170 | "anaconda-cloud": {},
171 | "kernelspec": {
172 | "display_name": "Python [py3]",
173 | "language": "python",
174 | "name": "Python [py3]"
175 | },
176 | "language_info": {
177 | "codemirror_mode": {
178 | "name": "ipython",
179 | "version": 3
180 | },
181 | "file_extension": ".py",
182 | "mimetype": "text/x-python",
183 | "name": "python",
184 | "nbconvert_exporter": "python",
185 | "pygments_lexer": "ipython3",
186 | "version": "3.5.2"
187 | }
188 | },
189 | "nbformat": 4,
190 | "nbformat_minor": 0
191 | }
192 |
--------------------------------------------------------------------------------
/src/ai/generate_data.py:
--------------------------------------------------------------------------------
1 | import math
2 | import numpy as np
3 | import skimage
4 | import skimage.draw
5 |
6 | def create_road(height=128, width=128, offset=0.0):
7 | image = np.zeros((height, width), dtype=np.uint8)
8 | left_edge = width / 3
9 | right_edge = width - left_edge
10 |
11 | if (math.fabs(offset) > left_edge):
12 | offset = math.copysign(left_edge, offset)
13 |
14 | rows, columns = skimage.draw.polygon( \
15 | [0, height, height, 0], \
16 | [left_edge + offset, left_edge, right_edge, right_edge + offset])
17 | image[rows, columns] = 1
18 | image = image[:, :, np.newaxis]
19 | return image
20 |
21 |
22 | def random_road(height=128, width=128):
23 | offset = (np.random.rand() * 256 - 128) / 3
24 | image = create_road(height, width, offset)
25 | return image, offset
26 |
27 |
28 | def normal_distribution(images):
29 | np.add(images, -.5, out=images)
30 | np.multiply(images, 4, out=images)
31 |
32 |
33 | def generate_batch(height=128, width=128, minibatch_size=10):
34 | input_data = np.zeros([minibatch_size, height, width, 1], dtype=np.float32)
35 | label_data = np.zeros([minibatch_size], dtype=np.float32)
36 |
37 | for i in range(minibatch_size):
38 | image, offset = random_road(height, width)
39 | input_data[i, :, :, :] = image
40 | label_data[i] = offset / width
41 |
42 | normal_distribution(input_data)
43 |
44 | return input_data, label_data
45 |
--------------------------------------------------------------------------------
/src/ai/run.py:
--------------------------------------------------------------------------------
1 | import tensorflow as tf
2 | import tflearn
3 |
4 | import train
5 | import generate_data
6 |
7 | tf.reset_default_graph()
8 | model = train.build_model()
9 |
10 | model.load('checkpoints/road_model1-72')
11 |
12 | input_size = 128
13 | data_size = 1
14 |
15 | image_data, label_data = \
16 | generate_data.generate_batch(
17 | height=input_size,
18 | width=input_size,
19 | minibatch_size=data_size)
20 |
21 | pr = model.predict(image_data)
22 |
23 | import matplotlib.pyplot as plt
24 |
25 | print(pr[0])
26 | plt.imshow(image_data[0,:,:,0], interpolation='nearest')
27 | plt.colorbar()
28 | plt.show()
29 |
--------------------------------------------------------------------------------
/src/ai/train.py:
--------------------------------------------------------------------------------
1 | import os
2 |
3 | import numpy as np
4 | from numpy import newaxis
5 | import tensorflow as tf
6 |
7 | import tflearn
8 | from tflearn.layers.core import input_data, fully_connected
9 | from tflearn.layers.conv import conv_2d
10 | from tflearn.layers.estimator import regression
11 |
12 | import generate_data
13 |
14 | learning_rate = 0.001
15 | num_iterations = 1000
16 |
17 | def build_model():
18 | init = tf.truncated_normal_initializer(stddev=1e-4)
19 |
20 | network = input_data(shape=[None, 128, 128, 1], name='input')
21 | network = conv_2d(network, nb_filter=2, filter_size=5, strides=2, activation='tanh', weights_init=init)
22 | network = fully_connected(network, 1, activation='tanh', weights_init=init)
23 | network = regression(network, optimizer='sgd', learning_rate=learning_rate,
24 | loss='mean_square', name='target')
25 |
26 | model = tflearn.DNN(network, tensorboard_verbose=0, checkpoint_path='checkpoints/road_model1')
27 | return model
28 |
29 |
30 | if __name__ == '__main__':
31 | input_size = 128
32 | minibatch_size = 16
33 | batch_size = 3200
34 |
35 | checkpoint_path = 'checkpoints'
36 | if not os.path.exists(checkpoint_path):
37 | os.makedirs(checkpoint_path)
38 |
39 | model = build_model()
40 |
41 | # Train
42 | for i in range(num_iterations):
43 | image_data, label_data = \
44 | generate_data.generate_batch(
45 | height=input_size,
46 | width=input_size,
47 | minibatch_size=batch_size)
48 |
49 | X = image_data
50 | Y = label_data[:,newaxis]
51 |
52 | model.fit({'input': X}, {'target': Y},
53 | n_epoch=1,
54 | batch_size=minibatch_size,
55 | snapshot_epoch=True, show_metric=True, run_id='road_model1')
56 |
--------------------------------------------------------------------------------
/src/ai/video.py:
--------------------------------------------------------------------------------
1 | from __future__ import print_function
2 |
3 | import cv2
4 | import numpy as np
5 | import tensorflow as tf
6 | import socket
7 |
8 | video_output = True
9 |
10 | from time import time
11 | time_next = time()
12 |
13 | if video_output:
14 | time_delay = 0.2
15 | else:
16 | time_delay = 0.05
17 |
18 | import train
19 |
20 | udp_host = "localhost"
21 | udp_port = 4000
22 | sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
23 |
24 | key_wait_time = 10
25 | input_size = 128
26 |
27 | capture = cv2.VideoCapture(0)
28 |
29 | # video_size = (int(capture.get(cv2.CAP_PROP_FRAME_WIDTH)),
30 | # int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
31 | # print "Video width, height: " + str(video_size)
32 |
33 | model = train.build_model()
34 | model.load('checkpoints/road_model1-360')
35 |
36 | def process_frame(frame):
37 | pr = model.predict(frame[np.newaxis, :, :, np.newaxis])
38 | return pr[0][0]
39 |
40 | while capture.isOpened():
41 | success, frame = capture.read()
42 |
43 | if success:
44 | time_now = time()
45 | if time_now >= time_next:
46 | time_next = time_now + time_delay
47 |
48 | frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
49 | frame_small = cv2.resize(frame_gray, (128, 128))
50 | # frame_small = cv2.resize(frame_gray, (128, 128 + 95))
51 | frame_small = cv2.flip(frame_small, 0) # horizontal flip
52 | frame_small = cv2.flip(frame_small, 1) # vertical flip
53 | # frame_small = frame_small[-128:,]
54 | if video_output:
55 | cv2.imshow('video', frame_small)
56 |
57 | output_value = process_frame(frame_small)
58 | print(output_value)
59 | sock.sendto('ai: %.6f' % output_value, (udp_host, udp_port))
60 |
61 | ch = cv2.waitKey(key_wait_time) & 0xFF
62 | if ch == 27:
63 | break
64 | if ch == ord('q'):
65 | break
66 |
67 | capture.release()
68 | cv2.destroyAllWindows()
69 |
--------------------------------------------------------------------------------
/src/nodebot/nodebot.js:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 |
3 | /*
4 | * Usage
5 | * ~~~~~
6 | * node nodebot.js # keyboard enabled, search for port
7 | * node nodebot.js stdin_off # keyboard disabled, search for port
8 | * node nodebot.js port # specific Johnny-Five board port
9 | *
10 | * Operating
11 | * ~~~~~~~~~
12 | * - LED matrix: pin 14 clock, pin 15 data
13 | * - Ultrasonic sensor (ping): pin A3
14 | *
15 | * To Do
16 | * ~~~~~
17 | * - Implement "h" for help
18 | * - LED screen: Motor speed as vertical bars
19 | * - LED screen: AI output as horizontal bar
20 | * - LED screen: Current state: f, b, l, r, s, ai on / off
21 | *
22 | * - Implement line following: reflectance sensors
23 | * - Implement LEDs (pin 7 ?)
24 | * - Implement button sensor
25 | * - Implement light sensor
26 | * - Implement buzzer
27 | *
28 | * Resources
29 | * ~~~~~~~~~
30 | * github.com/Makeblock-official/mbot_nodebots/blob/master/examples/button.js
31 | *
32 | * github.com/Makeblock-official/mbot_nodebots/blob/master/examples/leds.js
33 | *
34 | * github.com/Makeblock-official/mbot_nodebots/blob/master/examples/light.js
35 | *
36 | * github.com/rwaldron/johnny-five/wiki/Motor
37 | * github.com/Makeblock-official/mbot_nodebots/blob/master/examples/motors.js
38 | *
39 | * github.com/Makeblock-official/mbot_nodebots/blob/master/examples/piezo.js
40 | *
41 | * github.com/Makeblock-official/mbot_nodebots/blob/master/examples/reflectance.js
42 | *
43 | * github.com/rwaldron/johnny-five/wiki/Proximity
44 | * github.com/Makeblock-official/mbot_nodebots/blob/master/examples/sonar.js
45 | * https://gist.githubusercontent.com/rwaldron/0519fcd5c48bfe43b827/raw/f17fb09b92ed04722953823d9416649ff380c35b/PingFirmata.ino
46 | */
47 |
48 | var board_port;
49 | var stdin_off = false;
50 |
51 | if (process.argv.length === 3) {
52 | if (process.argv[2] === 'stdin_off') {
53 | stdin_off = true;
54 | }
55 | else {
56 | board_port = process.argv[2]
57 | }
58 | }
59 |
60 | var UDP_PORT = 4000;
61 |
62 | var ai_fudge_factor = 0.011;
63 |
64 | var proximity_limit = 20.0; // centimeters
65 | var proximity_last = 0.0;
66 |
67 | var speed_min = 80;
68 | var speed_max = 120;
69 | var speed_factor = 0.5;
70 | var speed_motor = speed_factor * (speed_max - speed_min) + speed_min;
71 |
72 | var dgram = require('dgram');
73 | var johnny_five = require('johnny-five');
74 | var led_screen = require('./tm1640_led_screen');
75 |
76 | console.log('NodeBot: Connecting');
77 | var board = new johnny_five.Board({port: board_port});
78 |
79 | var motor_left, motor_right;
80 | var screen;
81 | var state = 'setup';
82 | var state_ai = false;
83 |
84 | board.on('ready', function(error) {
85 | if (error) {
86 | console.log(error);
87 | return;
88 | }
89 |
90 | console.log('NodeBot: Connected');
91 |
92 | screen = led_screen.initialize(johnny_five, board, 14, 15);
93 | led_screen.clear_screen(screen);
94 | led_screen.draw_character(screen, 6, 1, '?');
95 | led_screen.write_screen(screen);
96 |
97 | motor_left = new johnny_five.Motor({
98 | pins: { pwm: 6, dir: 7 }
99 | });
100 |
101 | motor_right = new johnny_five.Motor({
102 | pins: { pwm: 5, dir: 4 }
103 | });
104 |
105 | motor_left.stop();
106 | motor_right.stop();
107 | state = 'stop';
108 | console.log('State: ' + state + ', ai: ' + state_ai);
109 |
110 | var proximity = new johnny_five.Proximity({
111 | freq: 250,
112 | controller: 'HCSR04',
113 | pin: 'A3'
114 | });
115 |
116 | proximity.on('data', function() {
117 | var proximity = this.cm;
118 |
119 | var proximity_delta = Math.abs(proximity - proximity_last);
120 | if (proximity <= 100 && proximity_delta >= 1.0 ||
121 | proximity >= 100 && proximity_delta >= 10.0) {
122 |
123 | console.log('cm: ' + proximity.toFixed(0));
124 | proximity_last = proximity;
125 | }
126 |
127 | if (state === 'run' && proximity < proximity_limit) {
128 | motor_left.stop();
129 | motor_right.stop();
130 | state = 'pause';
131 | console.log('State: ' + state + ', ai: ' + state_ai);
132 | }
133 |
134 | if (state === 'pause' && proximity > proximity_limit) {
135 | motor_left.reverse(speed_motor);
136 | motor_right.forward(speed_motor);
137 | state = 'run';
138 | console.log('State: ' + state + ', ai: ' + state_ai);
139 | }
140 | });
141 |
142 | console.log('NodeBot: Ready');
143 | });
144 |
145 | function action(command) {
146 | if (state === 'setup') return;
147 |
148 | if (command >= '0' && command <= '9') {
149 | value = parseInt(command);
150 | if (value === 0) value = 10;
151 | speed_factor = value / 10;
152 | speed_motor = speed_factor * (speed_max - speed_min) + speed_min;
153 |
154 | motor_left.reverse(speed_motor);
155 | motor_right.forward(speed_motor);
156 | state = 'run';
157 | }
158 |
159 | switch (command) {
160 | case ' ':
161 | motor_left.stop();
162 | motor_right.stop();
163 | state = 'stop';
164 | console.log('State: ' + state + ', ai: ' + state_ai);
165 | break;
166 |
167 | case 'a':
168 | state_ai = ! state_ai;
169 | console.log('State: ' + state + ', ai: ' + state_ai);
170 | break;
171 |
172 | case 'f':
173 | motor_left.reverse(speed_motor);
174 | motor_right.forward(speed_motor);
175 | state = 'run';
176 | console.log('State: ' + state + ', ai: ' + state_ai);
177 | break;
178 |
179 | case 'b':
180 | motor_left.forward(speed_motor);
181 | motor_right.reverse(speed_motor);
182 | state = 'run';
183 | console.log('Turn: back');
184 | break;
185 |
186 | case 'l':
187 | motor_left.forward(speed_motor);
188 | motor_right.forward(speed_motor);
189 | state = 'run';
190 | console.log('Turn: left');
191 | break;
192 |
193 | case 'r':
194 | motor_left.reverse(speed_motor);
195 | motor_right.reverse(speed_motor);
196 | state = 'run';
197 | console.log('Turn: right');
198 | break;
199 |
200 | case 'q':
201 | console.log('Exiting');
202 | motor_left.stop();
203 | motor_right.stop();
204 | state = 'stop';
205 | process.exit();
206 | break;
207 |
208 | case 'mood:clear':
209 | led_screen.clear_screen(screen);
210 | led_screen.write_screen(screen);
211 | break;
212 |
213 | case 'mood:happy':
214 | screen.matrix = new Buffer([
215 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x88, 0x80,
216 | 0x80, 0x88, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00
217 | ]);
218 | led_screen.write_screen(screen);
219 | break;
220 |
221 | case 'mood:neutral':
222 | screen.matrix = new Buffer([
223 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x40,
224 | 0x40, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
225 | ]);
226 | led_screen.write_screen(screen);
227 | break;
228 |
229 | case 'mood:sad':
230 | screen.matrix = new Buffer([
231 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x48, 0x40,
232 | 0x40, 0x48, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00
233 | ]);
234 | led_screen.write_screen(screen);
235 | break;
236 | }
237 | }
238 |
239 | /*
240 | * There is no stdin when running in the background,
241 | * then create a stub stdin that does nothing.
242 | */
243 |
244 | if (stdin_off) {
245 | var Readable = require("stream").Readable;
246 | var util = require("util");
247 |
248 | function MyStream(options) {
249 | Readable.call(this, options);
250 | }
251 | MyStream.prototype._read = function() {};
252 |
253 | util.inherits(MyStream, Readable);
254 |
255 | process.__defineGetter__("stdin", function() {
256 | if (process.__stdin) return(process.__stdin);
257 | process.__stdin = new MyStream();
258 | return(process.__stdin);
259 | });
260 | }
261 | else {
262 | var stdin = process.stdin;
263 | stdin.setRawMode(true);
264 | stdin.resume();
265 | stdin.setEncoding('utf8');
266 |
267 | stdin.on('data', function(key) {
268 | action(key);
269 | });
270 | }
271 |
272 | var server = dgram.createSocket('udp4');
273 | var ai_output_last = 0.0;
274 |
275 | server.on('message', function (message, rinfo) {
276 | //console.log('Received: ' + rinfo.address + ':' + rinfo.port + ': ' + message);
277 | //console.log('Received: ' + message);
278 |
279 | message = message.toString();
280 |
281 | if (message.startsWith('ai:')) {
282 | if (state === 'run' && state_ai === true) {
283 | var ai_output = parseFloat(message.substring(3)) - ai_fudge_factor;
284 |
285 | if (Math.abs(ai_output - ai_output_last) >= 0.0) {
286 | ai_output_last = ai_output;
287 |
288 | var ai_motor_left = (-1.666 * ai_output) + 0.5;
289 | var ai_motor_right = 1.666 * (ai_output + 0.3);
290 |
291 | var precision = 2;
292 | console.log('ai: ' + ai_output.toFixed(precision) +
293 | ', ml: ' + ai_motor_left.toFixed(precision) +
294 | ', mr: ' + ai_motor_right.toFixed(precision) +
295 | ', ms: ' + speed_motor);
296 |
297 | motor_left.reverse(ai_motor_left * speed_motor * 2);
298 | motor_right.forward(ai_motor_right * speed_motor * 2);
299 | }
300 | }
301 | }
302 | else if (message.startsWith('mood:')) {
303 | action(message.substring(0, message.length -1)); // remove newline
304 | }
305 | else {
306 | action(message.substring(0,1)); // use first character
307 | }
308 | });
309 |
310 | server.bind(UDP_PORT);
311 |
--------------------------------------------------------------------------------
/src/nodebot/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "nodebot-ai",
3 | "version": "0.1.0",
4 | "description": "Nodebots code to support ai elements",
5 | "main": "nodebot.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "author": "",
10 | "license": "ISC",
11 | "dependencies": {
12 | "johnny-five": "^0.10.0",
13 | "nodebots-interchange": "^1.1.2"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/src/nodebot/tm1640_led_screen.js:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 |
3 | /*
4 | * Description
5 | * ~~~~~~~~~~~
6 | * NodeBots (Johnny-Five) support for MakeBlock LED Matrix peripheral.
7 | * Contains a simple driver for TM1640 16 x 8 LED driver IC.
8 | * Provides simple low-level graphics support, e.g clear screen,
9 | * draw point, line,horizontal line, vertical line, rectangle and cirle.
10 | *
11 | * Author(s): Andrew Fisher (@ajfisher) https://github.com/ajfisher
12 | * Andy Gelme (@geekscape) https://github.com/geekscape
13 | *
14 | * Requirements
15 | * ~~~~~~~~~~~~
16 | * An Arduino running Firmata with a MakeBlock TM1640 LED Matrix.
17 | *
18 | * npm install johnny-five
19 | * npm install oled-font-5x7
20 | *
21 | * Usage: NodeBot (NodeJS + Johnny-Five) module
22 | * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
23 | * Application code must maintain a reference to the "screen" variable.
24 | *
25 | * var five = require('johnny-five');
26 | * var board = five.Board();
27 | * var led_screen = require('./tm1640_led_screen');
28 | *
29 | * board.on('ready', function() {
30 | * var screen = led_screen.initialize(five, board, 14, 15);
31 | * led_screen.clear_screen(screen);
32 | * led_screen.draw_character(screen, 6, 0, '?');
33 | * led_screen.write_screen(screen);
34 | * screen.matrix = new Buffer([ // Checkerboard
35 | * 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55,
36 | * 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55
37 | * ]);
38 | * led_screen.write_screen(screen);
39 | * });
40 | *
41 | * Usage: Command line testing using NodeBots (Johnny-Five) REPL
42 | * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
43 | * This test environment automatically maintains an internal "screen" variable.
44 | *
45 | * $ node tm1640_led_screen.js test
46 | * 1469988451381 Device(s) /dev/cu.wchusbserial1410
47 | * 1469988451391 Connected /dev/cu.wchusbserial1410
48 | * 1469988455308 Repl Initialized
49 | * NodeBot ready, type "help()" for help !
50 | * >> help();
51 | * >> test(); // stop test running
52 | * >> clear_screen();
53 | * >> draw_character(6, 0, '?');
54 | *
55 | * Resources
56 | * ~~~~~~~~~
57 | * Titan Micro Electronics TM1640: 16 x 8 LED driver datasheet (Chinese)
58 | * https://dl.dropboxusercontent.com/u/8663580/TM1640.pdf
59 | *
60 | * To Do
61 | * ~~~~~
62 | * - Check all function parameters are within range (bounds).
63 | */
64 |
65 | var WIDTH = 16;
66 | var HEIGHT = 8;
67 |
68 | var font = require('oled-font-5x7');
69 |
70 | var test_enabled = (process.argv.length === 3 && process.argv[2] === 'test');
71 |
72 | if (test_enabled) {
73 | var five = require('johnny-five');
74 | var board = five.Board();
75 |
76 | board.on('ready', function() {
77 | console.log('NodeBot ready, type "help()" for help !');
78 |
79 | var PIN_CLOCK = 14;
80 | var PIN_DATA = 15;
81 | var screen = initialize(five, board, PIN_CLOCK, PIN_DATA);
82 |
83 | clear_screen(screen);
84 |
85 | if (true) {
86 | draw_character(screen, 1, 0, 'G');
87 | draw_character(screen, 7, 0, 'o');
88 | draw_character(screen, 13, 0, '!');
89 | write_screen(screen);
90 | }
91 | else {
92 | screen.matrix = new Buffer([ // Checkerboard
93 | 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55,
94 | 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55
95 | ]);
96 | write_screen(screen);
97 | }
98 |
99 | clear_screen(screen);
100 |
101 | var state_running = true;
102 | var state_visible = false;
103 |
104 | setInterval(function() {
105 | if (state_running) {
106 | state_visible = ! state_visible;
107 |
108 | if (true) { // Face ?
109 | draw_rectangle(screen, 0, 0, WIDTH, HEIGHT, state_visible);
110 | draw_circle(screen, 5, 3, 1, state_visible);
111 | draw_circle(screen, 10, 3, 1, state_visible);
112 | draw_lineh(screen, 7, 5, 2, state_visible);
113 | }
114 | else { // X marks the spot !
115 | draw_line(screen, 0, 0, H - 1, HEIGHT - 1, state_visible);
116 | draw_line(screen, 0, HEIGHT - 1, WIDTH - 1, 0, state_visible);
117 | }
118 |
119 | // invert_screen(screen);
120 |
121 | write_screen(screen);
122 | }
123 | }.bind(this), 1000);
124 |
125 | this.repl.inject({
126 | help: function() {
127 | console.log('Columns: 0 - 15, rows, 0 - 7, optional value: 0 - 1');
128 | console.log('Functions:');
129 | console.log(' clear_screen(value)');
130 | console.log(' draw_character(column, row, character, value)');
131 | console.log(' draw_circle(column, row, radius, value)');
132 | console.log(' draw_line(column0, row0, column1, row1, value)');
133 | console.log(' draw_lineh(column, row, length, value)');
134 | console.log(' draw_linev(column, row, length, value)');
135 | console.log(' draw_point(column, row, value)');
136 | console.log(' draw_rectangle(column, row, width, height, value)');
137 | console.log(' fill_circle(column, row, radius, value)');
138 | console.log(' fill_rectangle(column, row, width, height, value)');
139 | console.log(' test(): Toggle between test running or not');
140 | },
141 | clear_screen: function(value) {
142 | clear_screen(screen, value);
143 | },
144 | draw_character: function(column, row, character, value) {
145 | draw_character(screen, column, row, character, value);
146 | write_screen(screen);
147 | },
148 | draw_circle: function(column, row, radius, value) {
149 | draw_circle(screen, column, row, radius, value);
150 | write_screen(screen);
151 | },
152 | draw_line: function(column0, row0, column1, row1, value) {
153 | draw_line(screen, column0, row0, column1, row1, value);
154 | write_screen(screen);
155 | },
156 | draw_lineh: function(column, row, length, value) {
157 | draw_lineh(screen, column, row, length, value);
158 | write_screen(screen);
159 | },
160 | draw_linev: function(column, row, length, value) {
161 | draw_linev(screen, column, row, length, value);
162 | write_screen(screen);
163 | },
164 | draw_point: function(column, row, value) {
165 | draw_point(screen, column, row, value);
166 | write_screen(screen);
167 | },
168 | draw_rectangle: function(column, row, width, height, value) {
169 | draw_rectangle(screen, column, row, width, height, value);
170 | write_screen(screen);
171 | },
172 | fill_circle: function(column, row, radius, value) {
173 | fill_circle(screen, column, row, radius, value);
174 | write_screen(screen);
175 | },
176 | fill_rectangle: function(column, row, width, height, value) {
177 | draw_rectangle(screen, column, row, width, height, value);
178 | write_screen(screen);
179 | },
180 | invert_screen: function(value) {
181 | invert_screen(screen);
182 | write_screen(screen);
183 | },
184 | test: function(value) {
185 | state_running = ! state_running;
186 | console.log('Test run state: ' + state_running);
187 | }
188 | });
189 | });
190 | }
191 |
192 | function initialize(five, board, pin_clock_number, pin_data_number) {
193 | var MODE_ADDRESS_AUTO_ADD_1 = 0x40;
194 | var MODE_PERMANENT_ADDRESS = 0x44;
195 |
196 | var pin_clock = five.Pin({
197 | pin: pin_clock_number,
198 | mode: board.io.MODES.OUTPUT,
199 | });
200 |
201 | var pin_data = five.Pin({
202 | pin: pin_data_number,
203 | mode: board.io.MODES.OUTPUT,
204 | });
205 |
206 | write_byte(pin_clock, pin_data, MODE_ADDRESS_AUTO_ADD_1);
207 | write_byte(pin_clock, pin_data, 0x8c);
208 |
209 | var screen = {
210 | pin_clock: pin_clock, pin_data: pin_data, matrix: new Buffer(16)
211 | };
212 |
213 | return(screen);
214 | }
215 |
216 | function write_byte(pin_clock, pin_data, buffer) {
217 | pin_clock.high(); pin_data.low();
218 |
219 | for (var bit = 0; bit < 8; bit ++) {
220 | pin_clock.low();
221 | pin_data.write(buffer & 0x01);
222 | pin_clock.high();
223 | buffer = buffer >> 1;
224 | }
225 |
226 | pin_clock.low(); pin_data.low();
227 | pin_clock.high(); pin_data.high();
228 | }
229 |
230 | function write_bytes_to_address(pin_clock, pin_data, address, buffer) {
231 | address = address | 0xc0;
232 |
233 | pin_clock.high(); pin_data.low();
234 |
235 | for (var bit = 0; bit < 8; bit ++) {
236 | pin_clock.low();
237 | pin_data.write(address & 0x01);
238 | pin_clock.high();
239 | address = address >> 1;
240 | }
241 |
242 | for (var byte = 0; byte < buffer.length; byte ++) {
243 | var data = buffer[byte];
244 |
245 | for (bit = 0; bit < 8; bit ++) {
246 | pin_clock.low();
247 | pin_data.write(data & 0x01);
248 | pin_clock.high();
249 | data = data >> 1;
250 | }
251 | }
252 |
253 | pin_clock.low(); pin_data.low();
254 | pin_clock.high(); pin_data.high();
255 | }
256 |
257 | function write_screen(screen) {
258 | write_bytes_to_address(screen.pin_clock, screen.pin_data, 0, screen.matrix);
259 | }
260 |
261 | function clear_screen(screen, value) { // value = 0xff for all LEDS on
262 | if (typeof(value) === 'undefined') value = 0;
263 | screen.matrix.fill(value);
264 | write_screen(screen);
265 | }
266 |
267 | function invert_screen(screen) {
268 | for (var index = 0; index < screen.matrix.length; index ++) {
269 | screen.matrix[index] = screen.matrix[index] ^ 0xff;
270 | }
271 | }
272 |
273 | function draw_point(screen, column, row, value) {
274 | var bit = (typeof(value) === 'undefined') ? 1 : value;
275 | var mask = 0xff ^ (1 << row);
276 | screen.matrix[column] = screen.matrix[column] & mask | (bit << row);
277 |
278 | // TODO: This should work and would be much more efficient !
279 | //write_bytes_to_address(
280 | // screen.pin_clock, screen.pin_data, column, new Buffer(screen.matrix[column])
281 | //);
282 | }
283 |
284 | // Bresenham's line algorithm
285 |
286 | function draw_line(screen, column0, row0, column1, row1, value) {
287 | var column_delta = Math.abs(column1 - column0);
288 | var row_delta = Math.abs(row1 - row0);
289 |
290 | var column_increment = column0 < column1 ? 1 : -1;
291 | var row_increment = row0 < row1 ? 1 : -1;
292 |
293 | var error = (column_delta > row_delta ? column_delta : -row_delta) / 2;
294 |
295 | while (true) {
296 | draw_point(screen, column0, row0, value);
297 |
298 | if (column0 === column1 && row0 === row1) break;
299 |
300 | var error2 = error;
301 |
302 | if (error2 > -column_delta) {
303 | error -= row_delta;
304 | column0 += column_increment;
305 | }
306 |
307 | if (error2 < row_delta) {
308 | error += column_delta;
309 | row0 += row_increment;
310 | }
311 | }
312 | }
313 |
314 | function draw_lineh(screen, column, row, length, value) {
315 | for (var index = column; index < column + length; index ++) {
316 | draw_point(screen, index, row, value);
317 | }
318 |
319 | // TODO: More efficient to write_bytes_to_address() for only changed columns !
320 | }
321 |
322 | function draw_linev(screen, column, row, length, value) {
323 | var bit = (typeof(value) === 'undefined') ? 1 : value;
324 | var byte = (Math.pow(2, length) - 1) << row;
325 | var mask = 0xff ^ byte;
326 | if (bit === false) byte = 0;
327 | screen.matrix[column] = screen.matrix[column] & mask | byte;
328 |
329 | // TODO: This should work and would be much more efficient !
330 | //write_bytes_to_address(
331 | // screen.pin_clock, screen.pin_data, column, new Buffer(screen.matrix[column])
332 | //);
333 | }
334 |
335 | function draw_rectangle(screen, row, column, width, height, value) {
336 | draw_lineh(screen, column, row, width, value);
337 | draw_lineh(screen, column, row + height - 1, width, value);
338 | draw_linev(screen, column, row, height, value);
339 | draw_linev(screen, column + width - 1, row, height, value);
340 | }
341 |
342 | function fill_rectangle(screen, column, row, width, height, value) {
343 | for (var index = 0; index < width; index ++) {
344 | draw_linev(screen, column + index, row, height, value);
345 | }
346 | }
347 |
348 | // Bresenham's line algorithm extended for circles
349 |
350 | function draw_circle(screen, column, row, radius, value) {
351 | var x = radius, y = 0;
352 | var radiusError = 1 - x;
353 |
354 | while (x >= y) {
355 | draw_point(screen, -y + column, -x + row, value);
356 | draw_point(screen, y + column, -x + row, value);
357 | draw_point(screen, -x + column, -y + row, value);
358 | draw_point(screen, x + column, -y + row, value);
359 | draw_point(screen, -x + column, y + row, value);
360 | draw_point(screen, x + column, y + row, value);
361 | draw_point(screen, -y + column, x + row, value);
362 | draw_point(screen, y + column, x + row, value);
363 | y++;
364 |
365 | if (radiusError < 0) {
366 | radiusError += 2 * y + 1;
367 | }
368 | else {
369 | x --;
370 | radiusError += 2 * (y - x + 1);
371 | }
372 | }
373 | }
374 |
375 | function fill_circle(screen, column, row, radius, value) {
376 | var x = radius, y = 0;
377 | var radiusError = 1 - x;
378 |
379 | while (x >= y) {
380 | draw_line(screen, -y + column, -x + row, y + column, -x + row, value);
381 | draw_line(screen, -x + column, -y + row, x + column, -y + row, value);
382 | draw_line(screen, -x + column, y + row, x + column, y + row, value);
383 | draw_line(screen, -y + column, x + row, y + column, x + row, value);
384 | y++;
385 |
386 | if (radiusError < 0) {
387 | radiusError += 2 * y + 1;
388 | }
389 | else {
390 | x --;
391 | radiusError+= 2 * (y - x + 1);
392 | }
393 | }
394 | }
395 |
396 | // Thanks Suz (@noopkat) !
397 | // https://github.com/noopkat/oled-font-5x7
398 |
399 | function draw_character(screen, column, row, character, value) {
400 | var lookup = index = font.lookup.indexOf(character) * 5;
401 | var fontData = font.fontData.slice(lookup, lookup + 5);
402 |
403 | for (var index = 0; index < fontData.length; index ++) {
404 | screen.matrix[column + index] = fontData[index] << 1;
405 | }
406 | }
407 |
408 | module.exports = {
409 | initialize: initialize,
410 | write_byte: write_byte,
411 | write_bytes_to_address: write_bytes_to_address,
412 | write_screen: write_screen,
413 | clear_screen: clear_screen,
414 | invert_screen: invert_screen,
415 | draw_point: draw_point,
416 | draw_line: draw_line,
417 | draw_lineh: draw_lineh,
418 | draw_linev: draw_linev,
419 | draw_rectangle: draw_rectangle,
420 | fill_rectangle: fill_rectangle,
421 | draw_circle: draw_circle,
422 | fill_circle: fill_circle,
423 | draw_character: draw_character
424 | };
425 |
--------------------------------------------------------------------------------
/src/nodebot/tm1640_test.js:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 |
3 | var five = require('johnny-five');
4 | var board = five.Board();
5 | var led_screen = require('./tm1640_led_screen');
6 |
7 | board.on('ready', function() {
8 | console.log('NodeBot ready');
9 |
10 | var screen = led_screen.initialize(five, board, 14, 15);
11 |
12 | led_screen.clear_screen(screen);
13 | led_screen.draw_character(screen, 6, 0, '?');
14 | led_screen.write_screen(screen);
15 |
16 | //screen.matrix = new Buffer([ // Checkerboard
17 | // 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55,
18 | // 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55
19 | //]);
20 | //led_screen.write_screen(screen);
21 | });
22 |
--------------------------------------------------------------------------------
/src/nodebot/udp_receive.js:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 |
3 | var dgram = require('dgram');
4 |
5 | var UDP_PORT = 4000;
6 |
7 | var server = dgram.createSocket('udp4');
8 |
9 | server.on('message', function (msg, rinfo) {
10 | console.log('Received: ' + rinfo.address + ':' + rinfo.port + ': ' + msg);
11 | });
12 |
13 | server.bind(UDP_PORT);
14 |
--------------------------------------------------------------------------------