memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

スキャナ式レンジセンサ(測域センサ)URG-04LX-UG01をmacで使ってみた

学生の卒業研究のために測域センサが必要になり、とりあえず手頃な値段でインタフェースが複雑でない(USB)ものを探したところこの商品がヒットしました。手頃といっても10万円はするのですけどね。。。

Link: URG-04LX-UG01

で、学生に渡す前に動作確認のためサンプルプログラムを動かしてみました。サンプルプログラム通信仕様などはメーカーのサイトでしっかり公開されています。とりあえず公開されているライブラリはC版とC++版。残念ながらJava版はありません。Processingから利用するにはライブラリを自作するか何らかの手段でデータ通信しなければなりません。

■準備

メーカーが提供してくれているサンプルライブラリ(以下)はsdlとboostライブラリを利用しているとのことで、まずこれをインストールする必要があるとのことです。boostの構築はめちゃ時間がかかりました。macbook air(初代)のためでしょうけど一晩放置しました。

sudo port install libsdl
sudo port install boost

■URG 用のサンプルライブラリの構築

mac(osx v10.6.4 xcode3.2.3(1688))でサンプルライブラリ(urg-0.8.11.zip)を構築しました。

まず、こちらからサンプルライブラリをDLし解凍します。

次に、ターミナルを起動して上記の解凍ディレクトリに入りビルドします。

cd Desktop ←私はデスクトップに解凍したためです。
cd urg-0.8.11
./configure
make

ここで以下のようなコンパイルエラーが出て止まります。

/bin/sh ../../../libtool --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I../../.. -I../../../src/c/system -I../../../src/c/connection -I../../../src/c/urg -g -O2 -MT scip_handler.lo -MD -MP -MF .deps/scip_handler.Tpo -c -o scip_handler.lo scip_handler.c
libtool: compile: gcc -DHAVE_CONFIG_H -I. -I../../.. -I../../../src/c/system -I../../../src/c/connection -I../../../src/c/urg -g -O2 -MT scip_handler.lo -MD -MP -MF .deps/scip_handler.Tpo -c scip_handler.c -fno-common -DPIC -o .libs/scip_handler.o
scip_handler.c:27: error: expected declaration specifiers or ‘...’ before numeric constant
scip_handler.c:27: error: expected declaration specifiers or ‘...’ before ‘__builtin_object_size’
scip_handler.c:27: warning: conflicting types for built-in function ‘__builtin___snprintf_chk’

調べてみるとscip_handler.cの27行目でsnprintf関数のextern参照のプロトタイプ宣言があるのですが標準ライブラリ(stdio.h)のsnprintfが参照できない模様。とりあえずこの27行目をコメントアウトしたらコンパイルできました。

27:  // extern int snprintf(char *, size_t, const char *, ...);

で、makeが終了したら以下ようにインストールします。

sudo make install

■サンプルプログラム(C版 c_urg_sample.tar.gz )

上記でライブラリが利用可能になりましたので、次はスキャンするサンプルプログラムをこちらからDLしてコンパイルします。解凍したディレクトリに入り以下のコマンドを入力しました。

make

で、早速、USBケーブルでPCとセンサーをつなぎ以下を入力。。。

gd_scan

すると以下のエラーが。

urg_connect(): Serial connection fail.

シリアルデバイスが違うようです。シリアルデバイスの探し方もメーカーのサイトに丁寧に書かれています。ありがたいですね。

Link: Macでのシリアルデバイスの確認

確認すると、私のマシンでは/dev/tty.usbmodem1d11であることがわかりました。そこで、gd_scan.cとmd_scan.cのそれぞれ以下の行を修正。

 35 //  const char device[] = "/dev/ttyACM0"; /* For Linux */
 36   const char device[] = "/dev/tty.usbmodem1d11"; /* For Mac */

再度、makeして準備完了です。さあ、早速実行してみますと以下のような感じです。

■gd_scanの実行結果(1発スキャン)

# n = 726
# timestamp: 141134
0 -1, 1 -1, 2 -1, 3 -1, 4 -1, 5 -1, 6 -1, 7 -1, 8 -1, 9 -1, 10 -1, 11 -1, 12 -1, 13 -1, 14 -1, 15 -1, 16 -1, 17 -1, 18 -1, 19 -1, 20 -1, 21 -1, 22 -1, 23 -1, 24 -1, 25 -1, 26 -1, 27 -1, 28 -1, 29 -1, 30 -1, 31 -1, 32 -1, 33 -1, 34 -1, 35 -1, 36 -1, 37 -1, 38 -1, 39 -1, 40 -1, 41 -1, 42 -1, 43 -1, 44 540, 45 540, 46 537, 47 537, 48 521, 49 516, 50 510, 51 508, 52 508, 53 508, 54 510, 55 510, 56 510, 57 504, 58 500, 59 495, 60 495, 61 495, 62 508, 63 508, 64 514, 65 514, 66 514, 67 510, 68 512, 69 512, 70 512, 71 522, 72 527, 73 529, 74 529, 75 529, 76 2613, 77 2615, 78 2615, 79 2613, 80 2604, 81 2603, 82 2593, 83 2588, 84 2584, 85 2581, 86 2576, 87 2575, 88 2567, 89 2567, 90 2567, 91 2567, 92 3988, 93 0, 94 7, 95 0, 96 0, 97 0, 98 4337, 99 4337, 100 4337, 101 0, 102 0, 103 0, 104 0, 105 0, 106 5151, 107 5148, 108 5148, 109 5140, 110 5137, 111 5133, 112 5129, 113 5120, 114 5120, 115 5119, 116 5119, 117 5117, 118 5113, 119 5105, 120 5104, 121 5104, 122 5102, 123 5103, 124 5103, 125 5103, 126 5103, 127 5103, 128 5107, 129 5102, 130 5106, 131 5106, 132 5114, 133 5107, 134 5112, 135 5113, 136 5113, 137 5113, 138 5119, 139 5119, 140 5122, 141 5122, 142 5122, 143 5121, 144 5121, 145 5117, 146 2334, 147 2305, 148 2296, 149 2279, 150 2264, 151 2254, 152 2254, 153 2253, 154 2253, 155 2253, 156 2254, 157 2267, 158 2272, 159 2274, 160 2287, 161 2287, 162 2299, 163 2301, 164 2303, 165 2305, 166 2314, 167 2320, 168 2329, 169 2331, 170 2331, 171 2337, 172 2338, 173 2340, 174 2347, 175 2357, 176 2358, 177 2360, 178 2362, 179 2363, 180 2363, 181 2363, 182 2365, 183 2368, 184 2368, 185 2375, 186 2380, 187 2390, 188 2399, 189 2406, 190 2419, 191 2419, 192 2432, 193 2442, 194 2444, 195 2458, 196 2463, 197 2468, 198 2476, 199 2484, 200 2487, 201 2496, 202 2497, 203 2503, 204 2513, 205 2516, 206 2519, 207 2524, 208 2535, 209 2539, 210 2541, 211 2548, 212 2551, 213 2565, 214 2572, 215 2594, 216 2604, 217 2609, 218 2630, 219 2640, 220 2658, 221 2662, 222 2672, 223 2683, 224 2700, 225 2704, 226 2710, 227 2722, 228 2736, 229 2738, 230 2753, 231 2757, 232 2767, 233 2774, 234 2774, 235 2782, 236 2783, 237 2801, 238 2809, 239 2853, 240 3038, 241 3038, 242 3038, 243 3025, 244 3003, 245 2969, 246 2953, 247 2935, 248 2912, 249 2912, 250 2886, 251 2886, 252 7, 253 2856, 254 2856, 255 2876, 256 2876, 257 2895, 258 2912, 259 2926, 260 2949, 261 2966, 262 2966, 263 2966, 264 2935, 265 2935, 266 2935, 267 2935, 268 2935, 269 2827, 270 2804, 271 2804, 272 2804, 273 2817, 274 2825, 275 2846, 276 2877, 277 2880, 278 2880, 279 2880, 280 2880, 281 2875, 282 2872, 283 2865, 284 2865, 285 2865, 286 2871, 287 0, 288 0, 289 0, 290 0, 291 0, 292 0, 293 0, 294 0, 295 0, 296 0, 297 0, 298 0, 299 0, 300 0, 301 0, 302 0, 303 0, 304 0, 305 0, 306 0, 307 0, 308 0, 309 0, 310 0, 311 0, 312 0, 313 0, 314 0, 315 2214, 316 2158, 317 2150, 318 2130, 319 2126, 320 2102, 321 2100, 322 2095, 323 2087, 324 2083, 325 2083, 326 2083, 327 2083, 328 2084, 329 2093, 330 2096, 331 2108, 332 2118, 333 2126, 334 2132, 335 2155, 336 2163, 337 0, 338 0, 339 0, 340 0, 341 0, 342 0, 343 0, 344 0, 345 0, 346 0, 347 0, 348 0, 349 0, 350 0, 351 0, 352 0, 353 0, 354 0, 355 2060, 356 2044, 357 2044, 358 2060, 359 0, 360 0, 361 0, 362 7, 363 1959, 364 1956, 365 1959, 366 1959, 367 2015, 368 2021, 369 2063, 370 2070, 371 2080, 372 2080, 373 2070, 374 2070, 375 1999, 376 1944, 377 1304, 378 1304, 379 1301, 380 1300, 381 1283, 382 1222, 383 1007, 384 976, 385 894, 386 855, 387 855, 388 839, 389 831, 390 528, 391 495, 392 495, 393 495, 394 507, 395 515, 396 526, 397 554, 398 587, 399 610, 400 655, 401 685, 402 701, 403 701, 404 716, 405 7, 406 0, 407 0, 408 0, 409 0, 410 0, 411 0, 412 0, 413 0, 414 0, 415 0, 416 0, 417 0, 418 0, 419 0, 420 0, 421 0, 422 0, 423 0, 424 0, 425 0, 426 0, 427 0, 428 0, 429 0, 430 0, 431 0, 432 0, 433 0, 434 0, 435 0, 436 0, 437 0, 438 0, 439 0, 440 0, 441 0, 442 0, 443 0, 444 0, 445 0, 446 0, 447 0, 448 0, 449 0, 450 0, 451 0, 452 0, 453 0, 454 0, 455 0, 456 0, 457 0, 458 0, 459 0, 460 0, 461 0, 462 0, 463 0, 464 0, 465 0, 466 0, 467 0, 468 0, 469 0, 470 0, 471 0, 472 0, 473 0, 474 0, 475 0, 476 7, 477 0, 478 0, 479 0, 480 0, 481 0, 482 0, 483 0, 484 0, 485 0, 486 0, 487 206, 488 194, 489 193, 490 194, 491 206, 492 0, 493 0, 494 0, 495 0, 496 0, 497 0, 498 0, 499 0, 500 0, 501 0, 502 0, 503 141, 504 141, 505 141, 506 147, 507 147, 508 155, 509 156, 510 162, 511 162, 512 165, 513 165, 514 175, 515 311, 516 7, 517 343, 518 329, 519 329, 520 307, 521 300, 522 296, 523 296, 524 296, 525 296, 526 301, 527 301, 528 301, 529 296, 530 296, 531 296, 532 0, 533 0, 534 0, 535 0, 536 0, 537 0, 538 0, 539 0, 540 0, 541 0, 542 0, 543 411, 544 411, 545 411, 546 430, 547 444, 548 451, 549 454, 550 454, 551 451, 552 444, 553 422, 554 420, 555 420, 556 420, 557 436, 558 446, 559 446, 560 446, 561 445, 562 444, 563 441, 564 440, 565 439, 566 439, 567 433, 568 439, 569 441, 570 442, 571 442, 572 442, 573 433, 574 430, 575 429, 576 424, 577 419, 578 419, 579 419, 580 421, 581 421, 582 421, 583 415, 584 415, 585 414, 586 411, 587 411, 588 408, 589 408, 590 408, 591 408, 592 412, 593 412, 594 415, 595 415, 596 419, 597 419, 598 423, 599 423, 600 422, 601 422, 602 422, 603 422, 604 426, 605 430, 606 436, 607 450, 608 451, 609 452, 610 451, 611 451, 612 453, 613 454, 614 454, 615 458, 616 458, 617 458, 618 458, 619 457, 620 457, 621 457, 622 457, 623 457, 624 458, 625 458, 626 458, 627 458, 628 458, 629 460, 630 460, 631 460, 632 460, 633 460, 634 459, 635 459, 636 458, 637 458, 638 458, 639 459, 640 458, 641 458, 642 460, 643 458, 644 458, 645 458, 646 461, 647 461, 648 462, 649 462, 650 462, 651 462, 652 462, 653 462, 654 462, 655 460, 656 458, 657 458, 658 458, 659 458, 660 461, 661 461, 662 461, 663 462, 664 464, 665 464, 666 464, 667 465, 668 468, 669 467, 670 467, 671 468, 672 467, 673 467, 674 467, 675 467, 676 467, 677 467, 678 467, 679 470, 680 470, 681 471, 682 476, 683 476, 684 476, 685 476, 686 476, 687 476, 688 411, 689 410, 690 407, 691 407, 692 407, 693 0, 694 0, 695 0, 696 0, 697 440, 698 436, 699 432, 700 432, 701 432, 702 429, 703 421, 704 421, 705 417, 706 417, 707 425, 708 425, 709 425, 710 428, 711 434, 712 434, 713 434, 714 434, 715 435, 716 441, 717 441, 718 456, 719 457, 720 460, 721 474, 722 477, 723 482, 724 495, 725 499,

■md_scanの実行結果(連続スキャン)

n = 726
9/10: 990 [mm], 176394 [msec], (176395)
0, 9
n = 726
8/10: 987 [mm], 176494 [msec], (100)
1, 8
n = 726
7/10: 987 [mm], 176594 [msec], (100)
2, 7
n = 726
6/10: 987 [mm], 176694 [msec], (100)
3, 6
n = 726
5/10: 986 [mm], 176794 [msec], (100)
4, 5
n = 726
4/10: 989 [mm], 176894 [msec], (100)
5, 4
n = 726
3/10: 981 [mm], 176993 [msec], (99)
6, 3
n = 726
2/10: 990 [mm], 177093 [msec], (100)
7, 2
n = 726
1/10: 976 [mm], 177193 [msec], (100)
8, 1
n = 726
0/10: 979 [mm], 177293 [msec], (100)
9, 0

ううーん。簡単。さて、あとは学生君、がんばってねー。