├── 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 | 19 | 21 | 39 | 41 | 42 | 44 | image/svg+xml 45 | 47 | 48 | 49 | 50 | 51 | 55 | 62 | 64 | 68 | 69 | 70 | 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": "iVBORw0KGgoAAAANSUhEUgAAAP4AAAD+CAYAAAAalrhRAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAFiRJREFUeJzt3V9sW+d5x/HvQ0YSpfr4j2SbmiIncpA23Yq1TdBlK4Ii\nbpv+QQs0uQqyDUWyYHcdmqFYUac3uyvaq6LAdrGhf2AE7ba02xoP6BY3M2xgA9omaNIGSeOki5Va\ntUU7UmzTsyjK5LMLHmqUIoo0TfIc8v19gIOQJxT55FF+fN9D8bzH3B0RCUsm6QJEpP8UfJEAKfgi\nAVLwRQKk4IsESMEXCdANBd/MPmlmr5jZq2b2pW4VJSK9ZZ3+Hd/MMsCrwEeBs8CzwEPu/kr3yhOR\nXriREf9u4DV3f8Pd14B/BO7vTlki0ks33cDP3gycabi/QO3NYAMz01cDRRLi7rbV/hsJ/nW4F5gH\n5hq2JJ0ADiVcA6SnDriRWm5mgXfya27nNW7mbIKVdN8JelPLAjfza97Ja9zOWW7uUjXz8VZ3sukj\nbyT4vwVuabg/G+/bwiHS9euUbtO0rhPd7tocGwfV5sG/kWP8Z4HbzexWMxsFHgKO3sDziUifdDzi\nu3vFzP4COEbtDeRb7v6r5j8x1+lL9cBc0gXE5pIuoMHcdTzWyVIhQ5UMVcZYZYQ1Ml0awa6nkl6b\n69LzOFAhG3cswypjrDGCX9fY261qbvAY393/A7ijvUfP3chLddlc0gXE5pIuoMFc24/MUiGiyA6u\nEFFkHxeYZJkxSn2upPfmuvQ8FbIUibjCDopEXGAfy0xSYiyBavr24Z4Mk3rw8xTIU2A3F4kokutS\n8IdRPfiFuGsX2U2RiBK5ROpR8OW6ZagSUWSaRQ5ymgmukqVClkrSpaVWlQxFIhaZ5jQHucpE3LFs\nIvUo+HLdLD7GH6XMOCvkWE26pNRzjApZyoyywjirCY30dTpJRyRACr5IgBR8kQAp+CIBUvBFAqTg\niwRIwRcJkIIvEiAFXyRACr5IgBR8kQAp+CIBUvBFAqSz86QtI5TJUSJHiYgie3iLcVbIUE26tNQq\nMxJ3LEeRiLfYwwrjVFMw3ir40pYcJSZZXt+mWCKiqOBvo0SuoWOTLDFFkUjBl8FRD/4BzpCnsD76\na/GN5urBP8MBCuTXR/+kFt9opOBLW0Yps5PL7Oc8M5xLupyBUGaUy+zkPPs5x0zS5WyQ/JxDBsaW\nl2SRFtLZNQVf2qaLZnQinV1T8EUCpOBL29I5aU27dHZNwZe2pXPSmnbp7JqCLxKglsE3s2+ZWcHM\nftmwb4+ZHTOzU2b2tJnt6m2ZItJN7Yz43wE+sWnfYeAZd78DOA483u3CJH3SebSadunsWsvgu/t/\nAW9t2n0/cCS+fQR4oMt1SQql82g17dLZtU6P8fe7ewHA3ReB/d0rSUR6rVtf2W3xtnai4fYc6boQ\nsrQrnZPWtOtn1+bjrbVOg18ws7y7F8xsGji//cMPdfgykibpnLSmXT+7NsfGQfVk00e2O9U3Nr51\nHQUeiW8/DDzVbmkikryWI76ZfY/akD1lZr8B/hr4KvB9M3sUeAN4sJdFShJql8LOUCVDlTFWGWGN\njMb9phyokI07lmGVMdYYwVP4dZmWwXf3P2nyr+7rci2SIlkqRBTZwRUiiuzjApMsM0Yp6dJSq0KW\nIhFX2EGRiAvsY5lJSowlXdrb6Hx82VI9+HkK5Cmwm4tEFMkp+E3Vg1+Iu3aR3RSJKJFLurS3UfBl\nSxmqRBSZZpGDnGaCq2SpaMWdbVTJUCRikWlOc5CrTMQdS37Fnc0UfNmSxcf4o5QZZ4Ucq0mXlHqO\nUSFLmVFWGGc1hSN9Xfo+dRCRnlPwRQKk4IsESMEXCZCCLxIgBV8kQAq+SIAUfJEAKfgiAdI392Sd\nUV0/Iy9HiVHKZKlgOiOvqWr8bb0qGUrkKDNKhSye8mVLFHxZl6NERJGIIru4RJ6CLoXdQolc3LGI\nS+yiQD41l8LejoIv6+qXwp5mkb28uX5aroLfXP1S2ItM8yZ710/LVfBlYOQoMcUSsywww1ky8dRf\nZ+Q1VyLHElMsMMtZZqiSSe0ZeY0UfFmXocoI18hRYlzn3belSoZrjFCKuzYo0j0fkb7Tx3idGLyu\nKfgiAVLwRQKk4MsG6f7rc1oNXtcUfNlg8I5W02DwuqbgiwRIwZcNBm/SmgaD1zUFXzYYvElrGgxe\n1xR8kQC1DL6ZzZrZcTN7ycxeNLPPx/v3mNkxMztlZk+b2a7elysi3dDOiH8N+IK7vwf4IPA5M3s3\ncBh4xt3vAI4Dj/euTOmXwTtaTYPB61rL4Lv7oru/EN++AvwKmAXuB47EDzsCPNCrIqV/Bu9oNQ0G\nr2vXdYxvZnPA+4GfAHl3L0DtzQHY3+3iRKQ32j47z8x2AD8AHnP3K2a2+W1um7e9Ew235+JNkmbx\nSju1bZV9XGAnlxlhLenSUquKNXQsxwX2cZmdrDGSdGnAfLy11lbwzewmaqF/wt2fincXzCzv7gUz\nmwbON3+GQ20VI/1VvxT2JMtMsswUS0yyrEthb6N+KezluGtLTLHMZEouhT3HxkH1ZNNHtjvifxt4\n2d2/0bDvKPAI8DXgYeCpLX5OUqwe/GkWmWWBiOL6DEC2Vg/+ItMsMEuRaH0GMEhaBt/M7gH+FHjR\nzJ6nNqX/MrXAP2lmjwJvAA/2slDpvgxVJrjKJMvMcFaLb7ShSoarTLDMJGeZGajFNxq1DL67/zc0\nXUfovu6WIyL9oG/uiQRIwRcJkIIvEiAFXyRACr5IgBR8kQAp+CIBUvBFAqTgiwRIwRcJkIIvEiAF\nXyRAukx2YCy+5n0mXoRjlDJZKtgALh/VL1WMClmqZCiRo8woFbL4AK61V6fgByZHiYgiEUV2cYk8\nBSKKZKgmXVpqlcjFHYu4xC4K5CkSUR3gCbOCH5gcJSZZZppF9vImEUV2cEXB30aJHMtMssg0b7KX\nIhFX2KHgy+DIUWKKJWZZYIazZOKpf5ZK0qWlVokcS0yxwCxnmaFKJu5Ys2Uq0k/BD0yGKiNcI0dJ\nK+60qUqGa4zES2wN5oo7mw3uXEU6po/xOjFcXVPwRQKk4IsESMEP0OD+9TlJw9U1BT9Aw3W02i/D\n1TUFXyRACn6AhmvS2i/D1TUFP0DDNWntl+HqmoIvEqCWwTezMTP7qZk9b2YvmdlX4v17zOyYmZ0y\ns6fNbFfvyxWRbmgZfHdfBT7s7ncC7wU+El9I8zDwjLvfARwHHu9ppdI1w3W02i/D1bW2pvrufjW+\nORb/zFvA/cCReP8R4IGuVyc9MVxHq/0yXF1rK/hmlokvkb0InHD3l4G8uxcA3H0R2N+7MkWkm9o6\nO8/dq8CdZrYTeNrMDvH2t8Bt3hJPNNyeizfpB4tX2qltq+zjAju5zAhrSZeWWlWsoWM5LrCPy+xk\njZGkS2thPt5au67Tct39spn9CPgAUDCzvLsXzGwaON/8Jw9dz8tIF2WpEFFkkmUmWWaKJSZZJqdT\ncpuqkKVIFHdskiWmWGaSErmkS2thjo2D6smmj2znU/299U/szWwc+BjwPHAUeCR+2MPAU52UKr1V\nD/40i9zG68yyoOC3UA/+ItO8zm0sMDsgwW9fOyP+7wBHzMyovVE84e7/GR/zP2lmjwJvAA/2sE7p\nUIYqE1xlkmVmOKvFN9pQJcNVJlhmkrPMDM3iG41aBt/dXwTu2mL/MnBfL4oSkd7SN/dEAqTgiwRI\nwRcJkIIvEiAFXyRACr5IgBR8kQAp+CIBUvBFAqTgiwRIwRcJkIIvEiBdJnsIWXzN+0y8CMcoZbJU\nsCFbPqqbqhgVslTJUCJHmVEqZPEhW2uvTsEfQjlKRBSJKLKLS+QpEFEkQzXp0lKrRC7uWMQldlEg\nT5GI6pBOihX8IZSjxCTLTLPIXt4kosgOrij42yiRY5lJFpnmTfZSJOIKOxR8GRw5SkyxxCwLzHCW\nTDz1z1JJurTUKpFjiSkWmOUsM1TJxB3LJl1aTyj4QyhDlRGukaOkFXfaVCXDNUbiRTaHb8WdzYZz\nHiP6GK8j4XRNwRcJkIIvEiAFf0gN51+fey2crin4Qyqco9VuCqdrCr5IgBT8IRXOpLWbwumagj+k\nwpm0dlM4XVPwRQLUdvDNLGNmPzezo/H9PWZ2zMxOmdnT9QtrShKcLNcYocwYJcZYZYQ1MgGNYNfL\ngWtkKTMSd2yMNUbwQMbC6/mvfAx4ueH+YeAZd78DOA483s3CpH31K+LmKWy4Iu6Yvq7bVP2KuAXy\nm66IO5Z0aX3RVvDNbBb4FPDNht33A0fi20eAB7pbmrRr86WwD3BGl8JuYfOlsM9wYOguhb2ddk/S\n+TrwRaBxOp939wKAuy+a2f5uFyftyVBdD/5BTjPBVZ2N10KVzHrwT3OQq0wM9dl4m7UMvpl9Gii4\n+wtmdmibh25zQHmi4fZcvEm3GE6WCqOUGWeFHKtJl5R6Hq+4U2aUFcZZHYqRfj7eWmtnxL8H+IyZ\nfQoYByIzewJYNLO8uxfMbBo43/wpDrVVjIjciDk2Dqonmz6y5TG+u3/Z3W9x99uAh4Dj7v5Z4N+A\nR+KHPQw81VmxItJvN/K3i68CHzOzU8BH4/siMgCuawUedz9JPH9w92Xgvl4UJSK9Fca3FURkAwVf\nJEAKvkiAFHyRACn4IgFS8EUCpOCLBEjBFwmQgi8SIF07b0CNUCYXX+ktosge3mKcFV0Rdxvl9Wvj\n1S6J/RZ7WGF8aK+Iux0Ff0DVL4Vd36ZYIqKo4G+jfins+rbEFEUiBV8GRz34BzhDnsL66K/FN5qr\nB/8MByiQXx/9Q1l8o5GCP6BGKbOTy+znPDOcS7qcgVBmlMvs5Dz7OcdM0uUkKrw5zhAJ5/IP3aSu\ngYI/0LR4difUNVDwRYKk4A8wTVo7oa6Bgj/QNGnthLoGCr5IkBR8kQAp+ANMR6udUNdAwR9oOlrt\nhLoGCr5IkBT8AaZJayfUNVDwB5omrZ1Q10DBFwlSW2fnmdk8cAmoAmvufreZ7QH+CbiV2rV5H3T3\nSz2qU+JLYWeokqHKGKuMsEZGI1hTDlTIxh3LsMoYa4zgGu/a7kAVOOTud7r73fG+w8Az7n4HcBx4\nvBcFSk2WChFF8hS4jdeZZYFJlhmjlHRpqVUhS5GIAnle5zYWmGWZSUqMJV1a4to9H994+5vE/cC9\n8e0jwAlqbwbSA43Bz1NgNxeJKJJT8JtqDH6BPBfZTZGIErmkS0tcu8F34MdmVgH+zt2/CeTdvQDg\n7otmtr9XRQpkqBJRZJpFDnKaCa6SpaIVd7ZRJUORiEWmOc1BrjIRdyy8FXc2azf497j7OTPbBxwz\ns1O8/ePRbQ42TzTcnos3uR4WH+OPUmacFXKsJl1S6jlGhSxlRllhnNWhH+nn4621toLv7ufif14w\nsx8CdwMFM8u7e8HMpoHzzZ/hUFvFiMiNmGPjoHqy6SNbfrhnZhNmtiO+/Q7g48CLwFHgkfhhDwNP\ndVKqiPRfOyN+HvhXM/P48d9192Nm9hzwpJk9CrwBPNjDOkWki1oG391PA+/fYv8ycF8vihKR3tI3\nGUQCpOCLBEjBFwmQgi8SIAVfJEAKvkiAFHyRACn4IgFS8EUC1O7ZeZKAEcrkKJGjRESRPbzFOCtk\nqCZdWmqVGYk7lqNIxFvsYYVxqhrjNlDwUyxHiUmW17cplogoKvjbKJFr6NgkS0xRJFLwN1HwU6we\n/AOcIU9hffTX4hvN1YN/hgMUyK+P/lp8YyMFP8VGKbOTy+znPDOcS7qcgVBmlMvs5Dz7OcdM0uWk\nluY/KafLP3RCXWtFwU85LZ7dCXWtFQVfJEAKfspp0toJda0VBT/lNGnthLrWioIvEiAFXyRACn7K\n6Wi1E+paKwp+yulotRPqWisKvkiAFPyU06S1E+paKwp+ymnS2gl1rZW2gm9mu8zs+2b2KzN7ycz+\n0Mz2mNkxMztlZk+b2a5eFysi3dHuiP8N4Efu/rvA+4BXgMPAM+5+B3AceLw3JYbEyXKNEcqMUWKM\nVUZYI6MRrCkHrpGNF+AYY5Ux1hjBNZndVsvTcs1sJ/Ahd38EwN2vAZfM7H7g3vhhR4AT1N4MpENZ\nKkQU2cEVIors4wKTLDNGKenSUqtCliIRV9hBkYgL7GOZSUqMJV1aqrVzPv5B4E0z+w610f454C+B\nvLsXANx90cz2967MMNSDn6dAngK7uUhEkZyC31Q9+IW4axfZTZGIErmkS0u1doJ/E3AX8Dl3f87M\nvk5tZN88/9R89AZlqBJRZJpFDnKaCa6SpaIVd7ZRJUORiEWmOc1BrjIRd0wr7mynneAvAGfc/bn4\n/j9TC37BzPLuXjCzaeB886c40XB7Lt5kM8PJUmGUMuOskGM16ZJSzzEqZCkzygrjrAY90s/HW2st\ngx8H+4yZvcvdXwU+CrwUb48AXwMeBp5q/iyH2ipGRG7EHBsH1ZNNH9numnufB75rZiPA68CfAVng\nSTN7FHgDeLCDSkUkAW0F391/AfzBFv/qvu6WIyL9oD92igRIwRcJkIIvEiAFXyRAfQz+fP9eqqX5\npAuIzSddwLr5pAtoMJ90ARvMJ11Ag/muPZOCn6j5pAtYN590AQ3mky5gg/mkC2gw37Vn0lRfJEAK\nvkiAzL2359aYmU7eEUmIu2+5DlnPgy8i6aOpvkiAFHyRACn4IgHqefDN7JNm9oqZvWpmX+r16216\n7W+ZWcHMftmwL5HVgc1s1syOx6sUv2hmn0+qHjMbM7OfmtnzcT1fSaqW+HUzZvZzMzuaZB3xa8+b\n2S/i3vwsqXp6vbJ1T4NvZhngb4BPAO8B/tjM3t3L19zkO/FrN0pqdeBrwBfc/T3AB4HPxb3oez3u\nvgp82N3vBN4LfMTM7kmilthjwMsN95NcwbkKHHL3O9397gTr6e3K1u7esw34I+DfG+4fBr7Uy9fc\nooZbgV823H+F2kKhANPAK/2sp6GOH1JbzyDReoAJ4GfA7yVRCzAL/JjaMk1Hk/4dAaeBqU37+loP\nsBP4ny32d62OXk/1bwbONNxfiPclab83rA4M9H11YDObA94P/IRNqxX3q554ev08sAiccPeXE6rl\n68AX2bhYayI9iTnwYzN71sz+PKF61le2jg+B/t7MJrpZhz7c6/PqwGa2A/gB8Ji7X9ni9ftSj7tX\nvTbVnwU+ZGaH+l2LmX0aKLj7C2x/wbt+/o7ucfe7gE9ROxz70Bav3+t66itb/21cy//S5ZWtex38\n3wK3NNyfjfclqWBmeYDWqwN3l5ndRC30T7h7fXHSxOoBcPfLwI+ADyRQyz3AZ8zsdeAfqH3W8ASw\nmFRP3P1c/M8L1A7H7qb/fdlqZeu7ullHr4P/LHC7md1qZqPAQ8DRHr/mZsbG0eQotdWBoeXqwF33\nbeBld/9GkvWY2d76J8JmNg58DHi+37W4+5fd/RZ3v43a/xvH3f2zwL/1s446M5uIZ2SY2TuAjwMv\n0v++FIAzZvaueFd9Zevu1dGHD0s+CZwCXgMO9+tDmvi1vwecBVaB31BbHXgP8Exc0zFgd59quQeo\nAC9QC9nP495M9rse4Pfj138e+AXwV/H+vtfSUNO9/P+He4nUQe3Yuv77ebH+/2tCv6P3URs4XwD+\nBdjVzTr0XX2RAOnDPZEAKfgiAVLwRQKk4IsESMEXCZCCLxIgBV8kQP8HMuxnHDGpPEkAAAAASUVO\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 | --------------------------------------------------------------------------------