HAPTIX Tactor Glove - modulabs/gazebo-tutorial GitHub Wiki

Overview

์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” HAPTIX ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์˜ ์„ผ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์ œ ์ด‰๊ฐ ํ”ผ๋“œ๋ฐฑ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ "tactor glove"์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ค€๋‹ค.

What You Need

Hardware

  • 5 Lilypad Vibe Boards
  • 1 Teensy USB Board
  • 1 Mini-B USB cable (available from Amazon, Radioshack, etc.)
  • Wires (we used 30 gauge teflon)
  • Soldering iron
  • 1 glove, preferably made of a thin spandex material
  • Needle and thread (or a sewing machine)

Software

Gazebo์™€ handsim ํŒจํ‚ค์ง€๊ฐ€์žˆ๋Š” Linux ์ปดํ“จํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ์„ค์น˜ ๋ฐฉ๋ฒ•์€ ์ด ํŠœํ† ๋ฆฌ์–ผ์„ ์ฐธ๊ณ ํ•˜๋ผ.

Teensy USB ๋ณด๋“œ๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋ ค๋ฉด Arduino IDE ๋ฐ Arduino ์šฉ Teensyduino ์• ๋“œ์˜จ์„ ์„ค์น˜ํ•ด์•ผํ•œ๋‹ค.

์žฅ๊ฐ‘๊ณผ ํ†ต์‹ ํ•˜๋Š” ์ปดํ“จํ„ฐ๋Š”๋Š” Linux(์šฐ๋ถ„ํˆฌ๊ฐ€ ๋ฐ”๋žŒ์ง ํ•จ)๋ฅผ ์‹คํ–‰ํ•˜๊ณ  haptix-comm ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผํ•œ๋‹ค (์„ค์น˜ ๋ฐฉ๋ฒ•์€ ์—ฌ๊ธฐ ์ฐธ์กฐ). ๊ฐ€์ œ๋ณด๋ฅผ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋™์ผํ•œ ์ปดํ“จํ„ฐ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฐ˜๋“œ์‹œ ๊ทธ๋Ÿด ํ•„์š”๋Š” ์—†๋‹ค.

Design the Glove

์ด๊ฒƒ์€ ์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ ๊ฐ€์žฅ ์–ด๋ ค์šด ๋ถ€๋ถ„์ด๋ฉฐ, ๊ฐ€์žฅ ์žฌ๋ฏธ์žˆ์„ ๊ฒƒ์ด๋‹ค.

tactor glove์˜ ๊ธฐ๋ณธ ์•„์ด๋””์–ด๋Š” ์žฅ๊ฐ‘์˜ ๊ฐ ์†๊ฐ€๋ฝ์— 5 ๊ฐœ์˜ Lilypad ๋ณด๋“œ๋ฅผ ๋ถ€์ฐฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ฐ ์†๊ฐ€๋ฝ์— Lilypad๋ฅผ ๋ฐฐ์น˜ํ•˜๊ณ , ๋ณด๋“œ์— ๋ถ€์ฐฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์žฅ๊ฐ‘์˜ ์ข…๋ฅ˜ (๋ชจ๋“  ์†๊ฐ€๋ฝ์ด ์žˆ๋Š” vs. ์†๊ฐ€๋ฝ์ด์—†๋Š”)๋Š” ๋ชจ๋‘ ์‚ฌ์šฉ์ž ๋งˆ์Œ์ด์ด๋‹ค. ์‹ค์ œ๋กœ, ์žฅ๊ฐ‘ ๋Œ€์‹ ์— ์™„์žฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค (ํŠนํžˆ, ์‹ค์ œ ์ธ๊ณต ํŒ”์„ ์ค€๋น„ํ•˜๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•ด ํ–…ํ‹ฑ ํ”ผ๋“œ๋ฐฑ ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•˜๋Š” ๊ฒฝ์šฐ). Lilypads์˜ ํ—ˆ๋ธŒ ์—ญํ• ์„ํ•˜๊ณ  ์ปดํ“จํ„ฐ์— ์—ฐ๊ฒฐํ•˜๋Š” USB ๋ณด๋“œ๋ฅผ ์–ด๋””์— ๋‘˜ ๊ฒƒ์ธ์ง€ ์ƒ๊ฐํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐ”๋А์งˆํ•˜๋Š” ๋ฒ•์„ ๋ชจ๋ฅธ๋‹ค๋ฉด, ๊ธ€๋ฃจ๊ฑด์œผ๋กœ..

์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ์†๊ฐ€๋ฝ์ด ์žˆ๋Š” ๊ธ€๋Ÿฌ๋ธŒ๋กœ ์‹œ์ž‘ํ•˜์—ฌ Lilypads๋ฅผ ๋„ฃ๊ธฐ ์œ„ํ•ด ๊ฐ ์†๊ฐ€๋ฝ์˜ ์•„๋ž˜์ชฝ 1/3์— ์ฃผ๋จธ๋‹ˆ๋ฅผ ๊ฟฐ๋งค์—ˆ๋‹ค. ์ฃผ๋จธ๋‹ˆ๋Š” Lilypads๊ฐ€ ๋–จ์–ด์งˆ ์œ„ํ—˜์ด์—†๋Š” ์ง๋ฌผ์— ๋Œ€ํ•ด ์ถฉ๋ถ„ํ•˜์˜€๋‹ค. USB ๋ณด๋“œ๋ฅผ ์†๋“ฑ์˜ ์ฃผ๋จธ๋‹ˆ์— ๋„ฃ๊ณ  USB ์ผ€์ด๋ธ”์„ ์žฅ๊ฐ‘ ๋ฐ”๋‹ฅ ๊ทผ์ฒ˜์˜ ์ž‘์€ ๊ตฌ๋ฉ์— ๋„ฃ์—ˆ๋‹ค. ๊ฐ ์Œ์˜ ์ „์„ ์„ ํ•จ๊ป˜ ๋’คํ‹€์–ด ๊ผฌ์ด๋Š” ๊ฒƒ์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ์ผ€์ด๋ธ”์„ ์†๋“ฑ์— ๋ฌถ์—ˆ๋‹ค.

Assembling the Electronics

๊ฐ Lilypad์— ๋Œ€ํ•ด ๋‘ ๊ฐœ์˜ ์ „์„ ์„ ์ธก์ •ํ•œ๋‹ค. ์ „์„ ์˜ ๊ธธ์ด๋Š” ๋ชจํ„ฐ์˜ ์†๊ฐ€๋ฝ ๋ฐฐ์น˜์™€ ๋ณด๋“œ ๋ฐฐ์น˜์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค. ์ ์–ด๋„ 8 ์ธ์น˜(์•ฝ๊ฐ„ ์•„ํ”„์ง€ ์•Š๊ฒŒ)๋ฅผ ์ถ”์ฒœํ•œ๋‹ค.

๊ฐ Lilypad์— ๋Œ€ํ•ด ์Œ๊ทน(-)๋‹จ์ž๋ฅผ Teensy ๋ณด๋“œ์˜ GND ํ•€์— ์—ฐ๊ฒฐํ•˜๊ณ  ์–‘(+)๋‹จ์ž๋ฅผ ์›ํ•˜๋Š” ๋ฒˆํ˜ธ์˜ ๊ณ ์œ  ํ•œ ํ•€์— ์—ฐ๊ฒฐํ•œ๋‹ค. ์—ฌ๊ธฐ์—์„œ๋Š” 4, 9, 10, 12 ๋ฐ 14 ๋ฒˆ ํ•€์„ ์„ ํƒํ•˜์˜€๋‹ค. ๋‹ค์Œ ์„น์…˜์—์„œ Arduino ์ฝ”๋“œ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฏ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ํ•€์„ ๋ฉ”๋ชจํ•ด๋‘”๋‹ค.

Mini-USB ์ผ€์ด๋ธ”์„ Teensy ๋ณด๋“œ์˜ ํฌํŠธ์— ์—ฐ๊ฒฐํ•œ๋‹ค.

Optional : Lilypad ๋ณด๋“œ์™€ USB ๋ณด๋“œ๋ฅผ ์ˆ˜์ถ•๋žฉ์œผ๋กœ ๋ฎ์—ˆ๋‹ค. ์ด๊ฒƒ์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ์™€์ด์–ด์—์„œ ์ŠคํŠธ๋ ˆ์Šค๋ฅผ ๋ฐ›์œผ๋ฉด์„œ ์ง๋ฌผ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ •์ „๊ธฐ ๊ฐ„์„ญ์„ ๋ฐฉ์ง€ํ•˜๋ฉฐ, ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋งˆ์šดํ‹ด๋“€๋ฅผ ์‚ฌ๋ž‘์Šค๋Ÿฝ๊ฒŒ ๋งŒ๋“ค์–ด์ง„ ์žฅ๊ฐ‘์œผ๋กœ ์Ÿ์•„๋‚ด๋Š” ๊ฒฝ์šฐ์— ๋Œ€๋น„ํ•˜์—ฌ ๋ณดํ˜ธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

์ด์ œ ๋ชจ๋“ ๊ฒƒ์ด ๋‚ฉ๋•œ๋˜์–ด ์—ฐ๊ฒฐ๋˜์—ˆ์œผ๋ฏ€๋กœ Lilypads buzz๋ฅผ ๋งŒ๋“ค ํƒ€์ด๋ฐ์ด๋‹ค.

Programming the Board

Arduino IDE๋ฅผ ์—ด๊ณ  ์ƒˆ๋กœ์šด ์Šค์ผ€์น˜๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค. '๋„๊ตฌ' ๋“œ๋กญ ๋‹ค์šด ๋ฉ”๋‰ด๋ฅผ ํด๋ฆญํ•˜๊ณ  'USB ์œ ํ˜•: "์ง๋ ฌ"'์„ ์„ ํƒํ•œ๋‹ค.

Arduino ์Šค์ผ€์น˜ ์ฝ”๋“œ๋ฅผ ์—ฌ๊ธฐ์—์„œ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„ Arduino IDE์— ๋ณต์‚ฌํ•œ๋‹ค.

Arduino ์Šค์ผ€์น˜๋Š” ๋ฌด์—‡์„ ํ• ๊นŒ? USB ๋ณด๋“œ๊ฐ€ Linux ์ปดํ“จํ„ฐ์— ์—ฐ๊ฒฐ๋˜๋ฉด ACM ์žฅ์น˜ (์˜ˆ: "/dev/ttyACM0")๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. ํ•ด๋‹น ์žฅ์น˜์— ๊ธฐ๋ก ๋œ ๋ฌธ์ž๋ฅผ ์ˆ˜์‹ ํ•œ๋‹ค. '1'์—์„œ '5' ๋ฌธ์ž๊ฐ€ ์žฅ์น˜์— ์“ฐ์—ฌ์ง€๋ฉด ํ•ด๋‹น ๋ชจํ„ฐ๊ฐ€ 100 ๋ฐ€๋ฆฌ ์ดˆ ๋™์•ˆ ์œ™์œ™๊ฑฐ๋ฆฌ๋ฉฐ(buzz) ์šธ๋ฆฐ๋‹ค.

์ „์ž ์„ค์ •์ด๋‚˜ ๊ธฐํƒ€ ํ™˜๊ฒฝ ์„ค์ •์— ๋”ฐ๋ผ ์ด ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ ํ•  ์ˆ˜ ์žˆ๋‹ค.

#define NUM_MOTORS 5

๋ชจํ„ฐ๊ฐ€ 5๊ฐœ ์ด์ƒ์ธ ๊ฒฝ์šฐ ์ด ์ˆซ์ž๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ์ผ์น˜์‹œํ‚จ๋‹ค.

#define MOTOR_RUN_TIME 100

์ด ์„ ์€ ํ•˜๋‚˜์˜ ๋ชจํ„ฐ 'ํด๋ฆญ' ๊ธธ์ด๋ฅผ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ์ •์˜ํ•œ๋‹ค.

int motors[NUM_MOTORS] = {4, 9, 10, 12, 14};

์ด ์ˆซ์ž๊ฐ€ ์ด์ „ ์„น์…˜์—์„œ Lilypad ๋ณด๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์„ ํƒํ•œ ํ•€๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

unsigned long t_motor_start[NUM_MOTORS] = {0, 0, 0, 0, 0};

๋ชจํ„ฐ ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ ์ด ๋ฐฐ์—ด์—์„œ 0์˜ ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค.

if (b >= '1' && b <= '5')
{
  int motor = b - '1';
  t_motor_start[motor] = millis();
  analogWrite(motors[motor], MOTOR_PWM);
}

์ด ์„น์…˜์„ ์ˆ˜์ •ํ•˜์—ฌ ๋ชจํ„ฐ์˜ ๋ฒ„์ฆˆ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฌธ์ž๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 1-5 ๋Œ€์‹  'a', 'b', 'c'...๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ๋ชจํ„ฐ์˜ ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ 'if'๋ฌธ์—์„œ ํ•œ๊ณ„๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค.

ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•˜๊ณ  Teensy ๋ถ€ํŠธ ๋กœ๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šค์ผ€์น˜๋ฅผ ๋ณด๋“œ์— ๋กœ๋“œํ•œ๋‹ค.

Testing the Board

์ „์ž ์žฅ์น˜์™€ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ picocom๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘๋™ํ•˜๋Š”์ง€๋Š” ์‰ฝ๊ฒŒ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ„ฐ๋ฏธ๋„์—์„œ picocom์„ ์‹คํ–‰ํ•œ๋‹ค.

sudo apt-get install picocom

tactor glove๋ฅผ ์ปดํ“จํ„ฐ USB ํฌํŠธ์— ์‚ฝ์ž…ํ•˜๊ณ  ์‹คํ–‰ํ•œ๋‹ค.

picocom /dev/ttyACM0

๋ชจํ„ฐ buzz ์ƒ์„ฑ์„ ์œ„ํ•ด ์ˆซ์ž ํ‚ค 1-5 (๋˜๋Š” ์ด์ „ ๋‹จ๊ณ„์—์„œ ์„ ํƒํ•œ ๋ฌธ์ž์— ํ•ด๋‹นํ•˜๋Š” ํ‚ค)๋ฅผ ๋ˆ„๋ฅธ๋‹ค. CTRL-a CTRL-q๋ฅผ ๋ˆŒ๋Ÿฌ ์ข…๋ฃŒํ•œ๋‹ค.

/dev/ttyACM0์ด ์—ด๋ฆฌ์ง€ ์•Š๊ฑฐ๋‚˜ ๋ฌธ์ž๋ฅผ ๋ณด๋‚ด์ง€ ์•Š์œผ๋ฉด ls /dev๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ACM ์žฅ์น˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ๋‹ค๋ฅธ ์žฅ์น˜๋กœ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ๋„ํ•œ๋‹ค. picocom์„ ๋ฃจํŠธ (sudo picocom)๋กœ ์‹คํ–‰ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. sudo๋ฅผ ํ•˜์ง€ ์•Š๊ณ  ์žฅ์น˜๋ฅผ ์—ด๋ ค๋ฉด ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ plugdev ๋ฐ dialout ๊ทธ๋ฃน์— ์ถ”๊ฐ€ํ•ด์•ผํ•œ๋‹ค.

sudo usermod -a -G plugdev <username>
sudo usermod -a -G dialout <username>

๋ช…๋ น์— -a๋ฅผ ํฌํ•จ์‹œํ‚จ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ณ„์ •์ด sudo ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ์žƒ์„ ์ˆ˜ ์žˆ๋‹ค!

์ „์ž ์žฅ์น˜์™€ Arduino ์Šค์ผ€์น˜๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•œ ํ›„์—๋Š” ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„์—์„œ ๋ชจํ„ฐ๋ฅผ ์žฅ๊ฐ‘์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“  ๊ณ„ํš์„ ์‹คํ–‰ํ•œ๋‹ค. ๊ฐ ์†๊ฐ€๋ฝ์˜ ๋ชจํ„ฐ์™€ ์–ด๋–ค ๋ฌธ์ž๊ฐ€ buzz๋ฅผ ๋งŒ๋“œ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ์ฐธ๊ณ ๋กœ, ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉํ•œ ๋งตํ•‘์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค: Finger Board PinCharacter Index 4 1 Middle 9 2 Ring 10 3 Little 12 4 Thumb 14 5

Communicating with Gazebo

์‹œ๋ฎฌ๋ ˆ์ด์…˜์—์„œ ์ ‘์ด‰ ์„ผ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์ด๋ฅผ ๋ชจํ„ฐ ํด๋ฆญ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” haptix-comm ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

์ด ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์žฅ๊ฐ‘ ์†Œ์Šค ์ฝ”๋“œ์™€ CMakeLists.txt๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ•œ๋‹ค. ์ด ํŒŒ์ผ์„ ์ƒˆ ํด๋”(์˜ˆ: tactors) ๋ณต์‚ฌํ•œ๋‹ค.

์ด c++ ์ฝ”๋“œ๋Š” /dev/ttyACM0์„ ์—ด๊ณ  hx_getdeviceinfo๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ haptix-comm ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค. Lilypads์—์„œ ๋ชจํ„ฐ buzzes๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ฌธ์ž์™€ ํ•ด๋‹น ์†๊ฐ€๋ฝ์— ๋Œ€ํ•œ ์„ผ์„œ ์ ‘์ด‰ ์ƒ‰์ธ ๊ฐ„์˜ ๋งคํ•‘์„ ์„ค์ •ํ•œ๋‹ค. 10Hz๋กœ ์‹คํ–‰๋˜๋Š” ์—…๋ฐ์ดํŠธ ๋ฃจํ”„์—์„œ, haptix-comm์—์„œ ์„ผ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์ ‘์ด‰ ์„ผ์„œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ผ์ •ํ•œ ์ตœ์†Œ๊ฐ’์„ ์ดˆ๊ณผํ•˜๋ฉด ํ•ด๋‹น ๋ฌธ์ž๋ฅผ /dev/ttyACM0์— ์”๋‹ˆ๋‹ค.

์ด ์˜ˆ์ œ์™€ ๋‹ค๋ฅธ ์ „์ž ์žฅ์น˜ ์„ค์ •์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ฝ”๋“œ์˜ ์ผ๋ถ€๋ถ„์„ ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•ด์•ผ ํ• ์ˆ˜๋„ ์žˆ๋‹ค.

const unsigned int sleeptime_us = 10000;
const float minContactForce = 0;

sleeptime_us์€ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์˜ ์—…๋ฐ์ดํŠธ ์†๋„๋ฅผ ์ œ์–ดํ•œ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 10000 ๋งˆ์ดํฌ๋กœ์ดˆ ๋˜๋Š” 10 ๋ฐ€๋ฆฌ์ดˆ์ด๋‹ค. minContactForce๋Š” ์ ‘์†์„ผ์„œ๊ฐ€ ํ•ด๋‹น ๋ชจํ„ฐ ํด๋ฆญ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์ตœ์†Œ ํž˜์ด๋‹ค. ์žฅ๊ฐ’์„ ์ ‘์ด‰์— ๋œ ๋ฏผ๊ฐํ•˜๊ฒŒ ๋งŒ๋“ค๋ ค๋ฉด ์ด ๊ฐ’์„ ํ‚ค์šฐ๋ฉด ๋œ๋‹ค.

int fd = open("/dev/ttyACM0", O_WRONLY);
if (fd < 0)
{
  perror("Failed to open /dev/ttyACM0");
  return -1;
}

/dev/ttyACM0์— ์ด๋ฏธ ACM ์žฅ์น˜๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋Š” ๊ฒฝ์šฐ ์žฅ๊ฐ‘์„ ๋‹ค๋ฅธ ์žฅ์น˜ ํŒŒ์ผ (์˜ˆ:/dev/ttyACM1)์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์žฅ๊ฐ‘์ด ๋‹ค๋ฅธ ์žฅ์น˜ ํŒŒ์ผ์—์„œ ๊ณ„์† ์—ด๋ฆฌ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ์žฅ์น˜๋ฅผ ๊ฐ€์ ธ ์˜ค๊ธฐ ์œ„ํ•ด ์—ด๊ธฐ ๋ช…๋ น์„ ๋ณ€๊ฒฝํ•œ๋‹ค.

for (unsigned int i = 0; i < deviceInfo.ncontactsensor; i++)
{
  // Uninitialized
  sensorMotorIndexMapping[i] = '0';
}
for (unsigned int i = 3; i <= 6; i++)
{
  // Index
  sensorMotorIndexMapping[i] = '1';
}
for (unsigned int i = 11; i <= 14; i++)
{
  // Middle
  sensorMotorIndexMapping[i] = '2';
}
for (unsigned int i = 17; i <= 20; i++)
{
  // Ring
  sensorMotorIndexMapping[i] = '3';
}
for (unsigned int i = 7; i <= 9; i++)
{
  // Little
  sensorMotorIndexMapping[i] = '4';
}
for (unsigned int i = 21; i <= 23; i++)
{
  // Thumb
  sensorMotorIndexMapping[i] = '5';
}

์ฝ”๋“œ์˜์ด ๋ถ€๋ถ„์€ MPL ํŒ”์˜ ๊ฐ ์†๊ฐ€๋ฝ์—์žˆ๋Š” ์ ‘์ด‰ ์„ผ์„œ์˜ ์ƒ‰์ธ์„ /dev/ttyACM0์— ๊ธฐ๋ก ํ•  ๋•Œ ๋ชจํ„ฐ buzz๋ฅผ ๋งŒ๋“ค ๋ฌธ์ž๋กœ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค. Arduino ์Šค์ผ€์น˜์˜ ๋ฌธ์ž๋ฅผ ๋ณ€๊ฒฝ ํ•œ ๊ฒฝ์šฐ ๋งต ํ•ญ๋ชฉ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•œ๋‹ค.

if (j <= '5' && j >= '1')

๋ชจํ„ฐ์— ๋งคํ•‘๋˜๋Š” ๋ฌธ์ž์˜ ๋ฒ”์œ„๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ ์ด ๋ฒ”์œ„๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

ํ•„์š”ํ•œ ์ˆ˜์ •์„ ํ•œ ํ›„ ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ํด๋”์—์„œ ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•œ๋‹ค:

mkdir build;
cd build;
cmake ..;
make

๋ณ„๋„์˜ ์ฐฝ์—์„œ Gazebo HAPTIX ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

gazebo worlds/arat.worlds

๊ทธ๋ฆฌ๊ณ  C++ ์ฝ”๋“œ๊ฐ€์žˆ๋Š” ํด๋”์—์„œ tactors๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์žฅ๊ฐ‘์„ ๋ผ๊ณ  ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ๋ฌผ๊ฑด์„ ์ง‘๋Š”๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ