·Îº¸Æ½½º

(Robotics)

 

C ÀΰøÁö´É ÇÁ·Î±×·¡¹Ö : Herbert Schildt ÁöÀ½, ½Å°æ¼÷.·ù¼º·Ä ¿Å±è, ¼¼¿õ, 1991 (¿ø¼­ : Artificial Intelligence using C, McGraw-Hill, 1987), page 215~269

 

1. ·Îº¿ ÆÈ (ROBOT ARMS)

2. »ê¾÷¿ë ·Îº¿ (THE INDUSTRIAL ROBOT)

  2.1. ±³À° Ææ´øÆ® (The Teach Pendant)

  2.2. ·Îº¿ Á¦¾î ¾ð¾î (Robotic-Control Languages)

3. ÀÚÀ²·Îº¿ (AUTONOMOUS ROBOT)

4. ·Îº¿ ½Ã¹Ä·¹ÀÌÅÍ ¸¸µé±â (CREATING ROBOT SIMULATOR)

  4.1. ½Ã¹Ä·¹ÀÌÅÍ ½Ã¹æ (The Simulator Specifications)

  4.2. ÆíÁý±â (The Editor)

  4.3. ·Îº¿ °¡¸£Ä¡±â (Teaching Robot)

  4.4. ÇÁ·Î±×·¥ ¼öÇà (Running Program)

  4.5. ½Ã¹Ä·¹ÀÌÅÍ »ç¿ë (Using the Simulator)

  4.6. ½Ã¹Ä·¹ÀÌÅÍ È®Àå (Expanding the Simulator)

 

´ëºÎºÐÀÇ »ç¶÷µéÀÌ ·Îº¿ (robot) À̶ó´Â ¸»À» µéÀ¸¸é, º¸Åë Çϵå¿þ¾î¸¦ ¿¬»óÇÑ´Ù. Áï ·Îº¿ÀÇ ¹°¸®ÀûÀÎ ¸ð½ÀÀ» ±¸¼ºÇÏ´Â ±â°èÀûÀÌ°í Àü±âÀûÀÎ ÀåÄ¡. ±×·¯³ª, ·Îº¿ÀÌ ÇÏ´Â ÀÏÀ» ´õ ±íÀÌ ÆÄ°íµé¼ö·Ï, ·Îº¿À» ±¸¼ºÇÏ´Â °ÍÀº Çϵå¿þ¾î¿Í ¼ÒÇÁÆ®¿þ¾îÀÇ ¿¬°áÀ̶ó´Â °ÍÀº ´õ ¸í¹éÇØÁø´Ù. ¼ÒÇÁÆ®¿þ¾î´Â ÀåÄ¡ (device) À̸éÀÇ Áö´ÉÀÌ°í, ·Îº¿À» ´Ù¸¥ ÇüÅÂÀÇ ÀÚµ¿È­¿Í ±¸º°ÇÏ´Â °ÍÀÌ ÀÌ Áö´ÉÀÌ´Ù. ÀÌ Àå¿¡¼­´Â °³°üÀ» ³Ñ¾î¼± Çϵå¿þ¾î´Â ´Ù·çÁö ¾Ê´Â´Ù. ´ë½Å Çϵå¿þ¾î¸¦ ±¸µ¿½ÃÅ°´Â Áö´É¿¡ ÃÊÁ¡À» µÐ´Ù.

±âº»ÀûÀ¸·Î µÎ °¡Áö À¯ÇüÀÇ ·Îº¿ÀÌ ÀÖ´Ù. ù ¹ø° À¯ÇüÀº ÀÚµ¿Â÷¸¦ Á¶¸³Çϴµ¥ »ç¿ëµÇ´Â °Í°ú °°Àº, À§Ä¡°¡ °íÁ¤µÈ »ê¾÷ Á¶¸³ ¶óÀοëÀÌ´Ù. ÀÌ·¯ÇÑ Á¾·ùÀÇ ·Îº¿Àº ¸íÈ®È÷ ±× Àϸ¸À» À§ÇÏ¿© ¼³°èµÈ, ¸Å¿ì ÅëÁ¦µÈ ȯ°æ¿¡¼­¸¸ ÀÛµ¿µÇ¾î¾ß ÇÑ´Ù. µÎ ¹ø° À¯ÇüÀº ÀÚ¹ßÀûÀ¸·Î ¿òÁ÷ÀÌ´Â ·Îº¿À¸·Î ±¸¼ºµÈ´Ù. ÀÌ·± ·Îº¿µéÀº ½Ç¼¼°è¿¡¼­ ÀÛµ¿Çϵµ·Ï ¼³°èµÈ´Ù. ¸Å¿ì °£´ÜÇÑ ¸ðµ¨À» Á¦¿ÜÇÏ°í, ÀÚÀ² ·Îº¿Àº ¾ÆÁ÷ Á¸ÀçÇÏÁö ¾Ê´Â´Ù. ÀÌÀ¯´Â, Á¤¸»·Î ÀÚÀ²ÀûÀÎ ·Îº¿À» ¸¸µå´Â °ÍÀº AI ÀÇ °¡Àå ´Ù·ç±â Èûµç ¹®Á¦ Áß ¸î°¡Áö¸¦ ÇØ°áÇÒ °ÍÀ» ¿ä±¸Çϱ⠶§¹®ÀÌ´Ù. ÀÌ ÀÌÀ¯°¡ AI ÇÁ·Î±×·¡¸Ó¸¦ ºÎÃß±â¾î ·Îº¿À» ¸¸µé°Ô ÇÏ´Â °ÍÀÌ´Ù.

ÀÌ ÀåÀº ·Îº¿À» ¸¸µå´Â ¹æ¹ýÀ» Àá±ñ º¸°í, ±×°ÍÀ» ÇÁ·Î±×·¥ÇÏ´Â µ¥¿¡ »ç¿ëµÇ´Â Àü¹® ·Îº¸Æ½ Á¦¾î ¾ð¾î¸¦ Æ÷ÇÔÇÏ¿©, ·Îº¿ÀÇ ÇöÀç »óÅ¿¡ ´ëÇÑ °³°üÀ» Á¦½ÃÇÑ´Ù. ÀÌ ÀåÀÇ ¸¶Áö¸· ºÎºÐÀº ÀÚÀ² ·Îº¿¿¡ ´ëÇÑ ¿¬±¸¸¦ À§ÇÏ¿© ½ÃÀÛÁ¡ ¿ªÇÒÀ» ÇÒ ¼ö ÀÖ´Â, °£´ÜÇÏÁö¸¸ È®ÀåÇÒ ¼ö ÀÖ´Â ·Îº¿ ½Ã¹Ä·¹ÀÌÅ͸¦ °³¹ßÇÑ´Ù.

1. ·Îº¿ ÆÈ (ROBOT ARMS)

»ç½Ç»ó ¸ðµç »ê¾÷ ·Îº¿µéÀº ´Ü¼øÈ÷ ³¡¿¡ ¹°°ÇÀâ´Â ÀåÄ¡°¡ ´Þ¸° ·Îº¿ ÆÈÀÌ´Ù. ·Îº¿ÀÇ ÆÈÀº ¾î¶² ·Îº¿¿¡°Ôµµ - »ê¾÷¿ëÀ̵ç ÀÚÀ²ÀûÀ̵ç - ±âº» Á¶ÀÛ ÀåÄ¡ÀÌ´Ù. ·Îº¿ ÆÈÀ» Á¦¾îÇÏ·Á°í ÇÒ ¶§ ºÎµúÄ¡´Â ¸î°¡Áö º¹ÀâÇÑ ¹®Á¦µéÀ» ÀÌÇØÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ¿¹¸¦µé¾î, ¹°ÄÅÀ» ÀâÀ¸·Á°í ¼ÕÀ» »¸Ä¥ ¶§, ±× ¿òÁ÷ÀÓÀº ³ë·ÂÀÌ µéÁö ¾Ê°í »ý°¢¾øÀÌ ÀÌ·ç¾îÁö´Â °Í °°´Ù. ±×·¯³ª, »ç½ÇÀº ¿©·¯ ±ÙÀ°ÀÇ Á¶ÀýÀ» ¿ä±¸ÇÏ´Â º¹ÀâÇÑ ÀÏÀÌ´Ù. ¾Æ±â°¡ ÀÌ¿Í°°Àº ÀÏÀ» Çϱâ À§Çؼ­´Â ¿©·¯ ´ÞÀ» ÇÊ¿ä·Î ÇÔÀ» ±â¾ïÇØ¾ß ÇÑ´Ù. ÈçÈ÷ ÀÖ´Â ·Îº¿ÆÈÀº »ç¶÷ÀÇ ÆÈÀ» º»¶á °ÍÀÌ´Ù. ´ëºÎºÐÀÇ ·Îº¿ ÆÈÀº ¿òÁ÷ÀÓÀÌ °¡Àå Å« ÃàÀÌ 6 °³ÀÎ ÆÈÀÌ´Ù. ±×¸² 1 Àº ÃàÀÌ 6 °³ÀÎ ÆÈÀÇ ½ºÄÉÄ¡ÀÌ´Ù. ÈçÈ÷ ÀÌÀ½¸Å (joint) ¶ó°í ºÎ¸£´Â °¢ ÃàÀº ºÐ¸®µÈ ¸ðÅͳª, Ä¿´Ù¶õ ÆÈÀÇ °æ¿ìó·³, ¼ö·Â ½Ç¸°´õ¿¡ ÀÇÇØ µ¿ÀÛÇÑ´Ù.

±×¸² 1 ¿¡¼­ º¸¿©ÁÖµíÀÌ, ¿©¼¸ ÃàÂ¥¸® ·Îº¿ ÆÈÀº ½ÇÁ¦·Î ÂüÁ¶ÇÒ µÎ ÁÂÇ¥ ½Ã½ºÅÛÀ» Æ÷ÇÔÇÑ´Ù. ¹Ø¸é°ú µÎ ÆÈÀº X-Y-Z ÁÂÇ¥ ½Ã½ºÅÛÀ» Çü¼ºÇÏ°í, ¼ÕÀâÀÌ (grip) ´Â µÎ ÁÂÇ¥ ½Ã½ºÅÛ¿¡¼­ Àß ¿òÁ÷ÀδÙ. ±×·¯¹Ç·Î, °ø°£ÀÇ ¾î´À ƯÁ¤ÇÑ Á¡¿¡ µµ´ÞÇÏ´Â °ÍÀº ÆÈ¿¡¼­ ´Ù¼¸ °³ÀÇ ÀÌÀ½¸Å¸¦ »ç¿ëÇÒ °ÍÀ» ¿ä±¸ÇÑ´Ù. ¿©¼¸ ¹ø° ÃàÀ» µû¸¥ ¿òÁ÷ÀÓÀº ¹æÇâ¿¡¸¸ ¿µÇâÀ» ÁÖ´Â ¼ÕÀâÀÌ (grip) ÀÚüÀÇ È¸ÀüÀÌ´Ù.

±×¸² 1. ÃàÀÌ 6 °³ÀÎ ·Îº¿ ÆÈ

ÀÌ·± À¯ÇüÀÇ ÆÈÀ» Á¦¾îÇÒ ¶§ ¾î·Á¿î Á¡Àº ¿òÁ÷ÀÓÀ» Á¤È®ÇÏ°Ô ¸¸µå´Â °ÍÀÌ ¾Æ´Ï¶ó - Çϵå¿þ¾î°¡ ±×°ÍÀ» ó¸®ÇÑ´Ù - ¿©¼¸ °³ ÀÌÀ½¸ÅÀÇ ÇàÀ§¸¦ Á¶Á¤ÇÏ´Â °ÍÀÌ´Ù. ¿¹¸¦µé¾î, ·Îº¿ ÆÈÀÌ ºÎºÐÀûÀ¸·Î ¿­¸° â¿¡ µµ´ÞÇϱ⸦ ¿øÇÏ°í, ·Îº¿Àº óÀ½¿¡ ÆÈÀÌ »¸ÃÄÁø ä·Î ³õ¿©ÀÖ°í â¹®°ú ¹Ý´ëÂÊÀ¸·Î ¸éÇØ ÀÖ´Ù°í »ý°¢ÇØ¾ß ÇÑ´Ù. ¹Ø¸é¿¡¼­ ½ÃÀÛÇÏ¿© Àâ´Â °÷±îÁö À̵¿ÇÏ¸é ·Îº¿À» ȸÀü½ÃÄױ⠶§¹®¿¡ â¹®ÀÌ ±úÁ® ¹ö¸°´Ù. ·Îº¿ÆÈÀÌ Àû´çÈ÷ µ¿ÀÛÇϱâ À§Çؼ­´Â ¸ðµç ÀÌÀ½¸Å°¡ »ç¶÷ÀÇ ÆÈó·³ µ¿½Ã¿¡, ÇÔ²² ÀÛµ¿ÇØ¾ß ÇÑ´Ù.

±×·¯³ª, ´Ü¼øÈ÷ ¸ðµç ÀÌÀ½¸Å¸¦ Çѹø¿¡ ¿òÁ÷ÀÌ´Â °ÍÀÌ ¸ðµç ¹®Á¦¸¦ ¿ÏÀüÈ÷ ÇØ°áÇÏ´Â °ÍÀº ¾Æ´Ï´Ù. ¿¹¸¦µé¾î, ·Îº¿ÆÈÀº Á¼Àº ¹°Ã¼ ¾È¿¡ µµ´ÞÇϱâ À§ÇÏ¿© Á÷¼±À¸·Î ¹°Ã¼¸¦ ÇâÇØ ¼ÕÀâÀ̸¦ »¸Ä¡´Â °ÍÀÌ Á¾Á¾ ÇÊ¿äÇÏ´Ù. ÀÌ·¸°Ô ÇÏ·Á¸é ¾ÆÁÖ º¹ÀâÇÑ »ï°¢¹ýÀ» »ç¿ëÇØ¾ß ÇÑ´Ù. ±×¸² 2 °¡ ÀÌ »óȲ¿¡ ´ëÇÑ ±×·¡ÇÁ Ç¥ÇöÀ» º¸¿©ÁØ´Ù. º¸´Â ¹Ù¿Í °°ÀÌ, ¼ÕÀâÀÌ°¡ ÀåÄ¡°¡ C Á¡¿¡ µµ´ÞÇϱâ À§Çؼ­ ÀÌÀ½¸Å A ¿Í B °¡ ¸ðµÎ À̵¿µÇ¾î¾ß ÇÑ´Ù. ÀÌÀ½¸Å A ¸¦ À̵¿½ÃÅ°´Â °ÍÀÌ ºñ·Ï ÆÈÀ» ´õ ÃæºÐÈ÷ È®ÀåÇÏ°Ô ÇÏÁö¸¸ ¶ÇÇÑ ÆÈÀ» ³·Ãß°Ô ÇÑ´Ù. ÀÌ·¸°Ô ÇÏ·Á¸é ÀÌÀ½¸Å B ¿¡ ÀÇÇÑ À̵¿À» ´õ ÇÊ¿ä·Î ÇÑ´Ù. ´õ¿íÀÌ, ÆÈÀ» ±¸¼ºÇÏ´Â ºÎºÐµéÀÇ ±æÀÌ°¡ ´Ù¸¦ ¼öµµ Àֱ⠶§¹®¿¡, ÆÈÀ» Á÷¼±À¸·Î À̵¿½ÃÅ°±â À§Çؼ­´Â ÀÌÀ½¸Å A ¿Í B °¡ ´Ù¸¥ ºñÀ²·Î À̵¿Çϵµ·Ï Áö½Ã ¹Þ¾Æ¾ß ÇÑ´Ù. ÀÌ¿Í°°Àº À¯ÇüÀÇ ¹®Á¦´Â, ±ÔÁ¤µÈ °ø°£ ¾È¿¡¼­ ·Îº¿ÀÌ ¿ÏÀüÈ÷ ¹æÇâÀ» ¹Ù²Ù¾î¾ß ÇÑ´Ù¸é ´õ º¹ÀâÇÏ´Ù. ¿¹¸¦µé¾î, ·Îº¿ÀÌ ÄÚ³Ê ºÎºÐ¿¡ µµ´ÞÇØ¾ß ÇÑ´Ù¸é ¸¹Àº º¸Ãæ À̵¿ÀÌ ÇÊ¿äÇÏ´Ù.

Á÷¼±À̵¿ ¹®Á¦ÀÇ º¯ÇüÀº, ·Îº¿ÀÌ ±× ¾Õ¿¡ ¶È¹Ù¸¥ ¼öÆò¼±¿¡¼­ ¼ÕÀâÀ̸¦ À̵¿ÇØ¾ß ÇÒ ¶§ ¹ß»ýÇÑ´Ù. À̸¦ ÀÌ·ê ¼ö ÀÖ´Â À¯ÀÏÇÑ ¹æ¹ýÀº ·Îº¿ÀÇ ¹Øº¯À» µ¹¸®´Â °ÍÀÌ´Ù. ±×·¯³ª ¹Ø¸éÀÌ È¸ÀüÇÒ ¶§, ´Ù¸¥ ÀÌÀ½¸ÅµéÀº º¸Ãæ À̵¿À» ÇØ¾ß ÇÑ´Ù. ºñ±³Àû °£´ÜÇÑ »ï°¢ º¯ÇüÀÇ ¹Ýº¹µÈ ÀÀ¿ëÀ» ÅëÇØ ÀÌ ¸ðµç À¯ÇüÀÇ ¹®Á¦µéÀ» ÇØ°áÇÒ ¼ö ÀÖÁö¸¸, ÇØ°áÀº ½Ç½Ã°£¿¡ ÇàÇØÁ®¾ß ÇÑ´Ù´Â °ÍÀ» ±â¾ïÇØ¾ß ÇÑ´Ù.

±×¸² 2. Á÷¼± ¿îµ¿ ±×·¡ÇÁ

2. »ê¾÷¿ë ·Îº¿ (THE INDUSTRIAL ROBOT)

·Îº¸Æ½½º ºÐ¾ß¿¡¼­, ´ëºÎºÐÀÇ ³ë·ÂÀº »ê¾÷ Á¶¸³ ·Îº¿À» ¸¸µé°í Çâ»ó½ÃÅ°´Â µ¥¿¡ Àû¿ëµÇ°í ÀÖ´Ù. ÀÌµé ·Îº¿Àº ÅëÁ¦µÉ ȯ°æ¿¡¼­ »ç¿ëµÇ±â ¶§¹®¿¡ ÀÚÀ²ÀûÀÎ ·Îº¿º¸´Ù »ó´çÈ÷ ´ú ¿µ¸®ÇÒ ¼öµµ ÀÖ´Ù.

´çºÐ°£ ±×¸®°í »ó´ç±â°£, »ê¾÷ ·Îº¿Àº ºÐ¸íÈ÷ ÇÁ·Î±×·¥µÈ Àϵ鸸 ¼öÇàÇÒ¼ö ÀÖÀ» °ÍÀÌ´Ù. ·Îº¿ÀÌ »õ·Î¿î ±â¼úÀ» ¹è¿ï ¼ö ÀÖ´Â µÎ°¡Áö ¹æ¹ýÀÌ ÀÖ´Ù : ¸ÕÀú, ±³À° Ææ´øÆ®¸¦ »ç¿ëÇÏ¿© ¹è¿ì°Å³ª, µÑ°·Î, ·Îº¿ Á¦¾î ¾ð¾î¸¦ »ç¿ëÇÏ¿© ÇÁ·Î±×·¥ÇÒ ¼ö ÀÖ´Ù. ÀÌ Àý¿¡¼­´Â µÎ ¹æ¹ýÀ» ¼³¸íÇÑ´Ù.

2.1. ±³À° Ææ´øÆ® (The Teach Pendant)

»õ·Î¿î ÀÏÀ» ¼öÇàÇϵµ·Ï ·Îº¿À» ÇÁ·Î±×·¥ÇÏ´Â °¡Àå ÈçÇÑ ¹æ¹ýÀº ±³À° Ææ´øÆ® (teach pendant : Àå½Ä¹° ¶Ç´Â ºÎ¼Ó¹°·Î Çؼ®µÊ) ¸¦ »ç¿ëÇÏ´Â ÀÏÀÌ´Ù. ±³À° Ææ´øÆ®´Â ¿ÀÆÛ·¹ÀÌÅÍ·Î ÇÏ¿©±Ý ·Îº¿ÀÇ ¿©·¯ ÀÌÀ½¸Å¸¦ ¿òÁ÷ÀÌ°Ô ÇÏ´Â ¼Õ¿¡ Áå Á¦¾î»óÀÚÀÌ´Ù. (¸ðÇü ÀÚµ¿Â÷, ¹è, ºñÇà±â¿¡¼­ »ç¿ëµÇ´Â Á¦¾î±â¿Í ºñ½ÁÇÏ´Ù). ·Îº¿ÀÇ °¢ Á¦Á¶¾÷ÀÚ°¡ ºñ·Ï ¾à°£ ´Ù¸¥ À¯ÇüÀÇ ±³À° Ææ´øÆ®¸¦ ¸¸µé¾î ³ÂÁö¸¸ ¸ðµç ±³À° Ææ´øÆ®´Â ±×¸² 3 ¿¡ ÀÖ´Â ¸ð¾ç°ú ºñ½ÁÇÏ´Ù.

¿ÞÂÊ

 

¿À¸¥ÂÊ

 

 

 

À§·Î

 

¾Æ·¡·Î

 

 

 

ÀâÀÌ´ÝÀ½

 

ÀâÀÌ¿°

 

 

 

ȸÀü

 

Çڵ弱Á¤

 

 

 

Æȼ±ÅÃ

 

³¡

 

 

 

±×¸² 3. ¼Õ¿¡ Áã´Â ±³À° Ææ´øÆ®

±³À° Ææ´øÆ®´Â ·Îº¿¿¡ Á÷Á¢ ¿¬°áµÇÁö ¾Ê°í, ·Îº¿ÀÇ ÁÖ¿ä Á¦¾î ÄÄÇ»Å͸¦ ÅëÇØ ¿¬°áµÈ´Ù. ¸¸¾à ·Îº¿¿¡°Ô ¾î¶² ÀÏÀ» °¡¸£Ä¡°í ½Í´Ù¸é ±× ÀÏÀ» ±¸¼ºÇÏ´Â ÇÊ¿äÇÑ À̵¿¼ø¼­¸¦ ·Îº¿¿¡°Ô ¾Ë·ÁÁÖ±â À§ÇÏ¿© ±³À° Ææ´øÆ®¸¦ »ç¿ëÇÒ °ÍÀÌ´Ù. °¢ ÀÌÀ½¸Å¸¦ ¿òÁ÷ÀÏ ¶§, ÄÄÇ»ÅÍ´Â °¢ À§Ä¡¸¦ ±â·ÏÇÑ´Ù. °¡¸£Ä¡´Â °úÁ¤ÀÌ ¿Ï¼ºµÈ ÈÄ¿¡, ÀÌÁ¦ ·Îº¿Àº ´õ ÀÌ»óÀÇ µµ¿ò¾øÀÌ ½º½º·Î ÀÌÀ» ¼öÇàÇÒ ¼ö ÀÖ´Ù.

2.2. ·Îº¿ Á¦¾î ¾ð¾î (Robotic-Control Languages)

±³À° Ææ´øÆ®´Â ¿ëÁ¢À̳ª ÆÄ·¹Å¸ÀÌ¡ (palletizing) °ú °°Àº °£´ÜÇÑ ÀÏÀ» ·Îº¿¿¡°Ô °¡¸£Ä¡±â¿¡ ÈǸ¢ÇÑ ¹æ¹ýÀÌ´Ù. ±×·¯³ª, ÀÏÀÌ ´õ º¹ÀâÇØÁö°í ¿ÜºÎÀÇ »ç°Ç µ¿±âÈ­ (event synchronization) °¡ ´õ Áß¿äÇØÁü¿¡ µû¶ó, ¶Ç´Â ¸¸¾à ·Îº¿ÀÌ ¸¹Àº °æ¿ì¸¦ ÀνÄÇÏ°í ±×°Í¿¡ ´Ù¸£°Ô ¹ÝÀÀÇÒ ÇÊ¿ä°¡ ÀÖ´Ù¸é, ±³À° Ææ´øÆ® ½Ã½ºÅÛ¿¡´Â ±Ý¹æ °ú´ÙÇÑ ºÎ´ãÀÌ °£´Ù. ·Îº¿ Á¦¾î ¾ð¾î°¡ °³¹ßµÈ °ÍÀÌ ¹Ù·Î ÀÌ ÀÌÀ¯ ¶§¹®ÀÌ´Ù.

·Îº¿ Á¦¾î ¾ð¾î´Â ·Îº¿À» Á¦¾îÇϱâ À§ÇÏ¿© Ưº°È÷ ¼³°èµÈ ÄÄÇ»ÅÍ ¾ð¾îÀÌ´Ù. ·çÇÁ Á¦¾î¿Í Á¶°Ç¹®°ú °°Àº Åë»óÀûÀÎ ¸í·É¾î¸¦ Æ÷ÇÔÇÏ´Â °Í ¿Ü¿¡, ·Îº¿ Á¦¾î ¾ð¾î´Â ¶ÇÇÑ ·Îº¿ÀÇ ¿òÁ÷ÀÓÀ» Á¦¾îÇÏ´Â ¸í·É¾îµéÀ» Æ÷ÇÔÇÑ´Ù. ·Îº¿ Á¦¾î ¾ð¾î¸¦ ´Ù¸¥ ´Ù¸ñÀû¿ë ÇÁ·Î±×·¡¹Ö ¾ð¾î¿Í ºÐ¸®ÇÏ´Â °ÍÀº ¹Ù·Î ¿òÁ÷ÀÓÀÇ Á¦¾î ¶§¹®ÀÌ´Ù. ·Îº¿ Á¦¾î ¾ð¾î¿¡´Â ·Îº¿ÀÌ ¸¸µé °¢ À̵¿¿¡ ´ëÇÏ¿© °ø°£ Á¤º¸¸¦ °£Á÷ÇÏ´Â ³»ÀåµÈ µ¥ÀÌÅͺ£À̽º°¡ Æ÷ÇԵǾî ÀÖ´Ù.

·Îº¿ Á¦¾î ¾ð¾î´Â ±³À° Ææ´øÆ®¸¦ ´ëüÇϱâ À§ÇÏ¿© ¼³°èµÈ °ÍÀÌ ¾Æ´Ï¶ó ±×°ÍÀ» º¸ÃæÇϱâ À§ÇÏ¿© ¼³°èµÈ Á¡À» ÀÌÇØÇÏ´Â °ÍÀÌ Áß¿äÇÏ´Ù. ±×·¯¹Ç·Î, ·Îº¿ Á¦¾î ¾ð¾î´Â ±³À° Ææ´øÆ®¿ÍÀÇ ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇØ¾ß ÇÑ´Ù. ÀüÇüÀûÀÎ ¹æ¹ýÀº, ·Îº¿¿¡°Ô Ææ´øÆ®¸¦ »ç¿ëÇÏ¿© ÇÊ¿äÇÑ °ø°£ Á¤º¸¸¦ °¡¸£Ä¡°í, ±×¸®°í ³ª¼­ ·Îº¿ÀÌ ±× Á¤º¸¸¦ ¾î¶»°Ô »ç¿ëÇÏ´ÂÁö ±ÔÁ¤Çϱâ À§ÇÏ¿© ·Îº¿ Á¦¾î ¾ð¾î¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù. ÀϹÝÀûÀ¸·Î, °¢ ƯÁ¤ÇÑ À§Ä¡´Â ÇÁ·Î±×·¥ÀÌ ±×°ÍÀ» ÂüÁ¶ÇÒ ¼ö ÀÖµµ·Ï ±âÈ£ À̸§ÀÌ ÁÖ¾îÁø´Ù.

ÀüÇüÀûÀÎ ·Îº¿ Á¦¾î ¾ð¾î´Â BASIC °ú À¯»çÇÑ ¹®¹ýÀ» °®´Â´Ù. ºñ·Ï ¼¼·ÃµÇÁö´Â ¾Ê¾ÒÁö¸¸, ÀÌ ¹®¹ýÀº ¹è¿ì±â°¡ ½±´Ù. (Á» ´õ ±¸Á¶È­µÈ, ÆĽºÄ® (Pascal) °ú ºñ½ÁÇÑ ·Îº¿ Á¦¾î ¾ð¾î°¡ °³¹ßµÈ °ÍÀº ÃÖ±ÙÀÇ ÀÏÀÌ´Ù.) ÃÖÃÊÀÇ, °¡Àå ÈçÈ÷ »ç¿ëµÈ ·Îº¿ Á¦¾î ¾ð¾î´Â VAL Àε¥ ÀÌ°ÍÀº À¯´Ï¸ÞÀ̼ǻç (Unimation Corporation) °¡ ¸¸µé¾ú´Ù. VAL ÇÁ·Î±×·¥ÀÇ ¹¦¹Ì¸¦ ¾Ë±â À§Çؼ­, ´ÙÀ½¿¡ ÀÖ´Â °ÍÀ» °ËÅäÇØ º¸ÀÚ. ·Îº¿ÀÌ Äܺ£ÀÌ¾î º§Æ®¿¡¼­ »óÀÚ¸¦ Á¦°ÅÇϱâ À§ÇÏ¿© »ç¿ëµÉ ¼ö ÀÖ´Ù.

    REMARK WAIT FOR OBJECT

    10 WAIT 2

      REMARK OBJECT PRESENT, REMOVE IT

      MOVE POS1

      MOVE POS2

      CLOSEI  REMARK CLOSE THE GRIP

      MOVE BOX1

      OPENI  REMARK DROP THE OBJECT

    GOTO 10

ÀÌ ÇÁ·Î±×·¥À» »ç¿ëÇϸé, ·Îº¿Àº ÀÔ·Â ½ÅÈ£ 2 °¡ È°¼ºÈ­ (active) µÉ ¶§±îÁö ±â´Ù¸± °ÍÀÌ´Ù : ÀÌ°ÍÀº ¹øÈ£ 2 ½ÅÈ£¼±ÀÌ ÇÏÀÌ (high) ·Î µÉ ¶§±îÁö ·Îº¿Àº ¾Æ¹«°Íµµ ÇÏÁö ¾Ê´Â´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. ÀÌ°ÍÀº ¹°Ã¼°¡ Äܺ£À̾î À§¿¡ ÀÖÀ½À» ·Îº¿¿¡°Ô ¾Ë·ÁÁØ´Ù. ´ÙÀ½, ·Îº¿Àº ±× ¹°Ã¼·Î À̵¿ÇÏ¿©, ±×°ÍÀÇ À§·Î °¥ °ÍÀÌ´Ù. ±×¸®°í³ª¼­, Àâ´Â ÀåÄ¡¸¦ Á¢±Ù½ÃÅ°°í, Äܺ£À̾î·ÎºÎÅÍ ¹°Ã¼¸¦ À̵¿½ÃÄѼ­ ±× ¹°Ã¼¸¦ Á¦°ÅÇÒ °ÍÀÌ´Ù. ¸¶Áö¸·À¸·Î, ÇÁ·Î±×·¥Àº ´ÙÀ½ ¹°Ã¼¸¦ À§ÇÏ¿© ·çÇÁ¸¦ µ¹¸ç ±â´Ù¸± °ÍÀÌ´Ù.

VAL Àº ´ë¹®ÀÚ¸¸ Áö¿øÇÑ´Ù. ¼¼ À§Ä¡ POS1, POS2, BOX1 Àº ·Îº¿ÀÌ ±³À° Ææ´øÆ®¸¦ »ç¿ëÇÏ¿© ¹è¿î À§Ä¡ÀÇ ±âÈ£ À̸§ÀÌ´Ù.

¸ðµç »ê¾÷ ·Îº¿Àº µ¿±âÈ­¸¦ À§ÇÏ¿© ÀÔ·ÂÇÏ°í Ãâ·ÂÇÏ´Â ¾î¶² ¹æ¹ýÀ» Á¦°øÇÑ´Ù : ¿¹¸¦µé¾î, ¹æ±Ý ÁÖ¾îÁø VAL ÇÁ·Î±×·¥¿¡¼­ WAIT ¸í·É¾î´Â ÀÔ·Â ½ÅÈ£ 2 ¸¦ »ç¿ëÇÑ´Ù. ÀüÇüÀûÀÎ ·Îº¿Àº °ÅÀÇ 8 °³ÀÇ ÀÔÃâ·Â¼±À» Á¢±ÙÇÒ °ÍÀÌ´Ù. »ê¾÷ ·Îº¿Àº ÀϹÝÀûÀ¸·Î ÀÚ½ÅÀÇ ÀϺημ­ ¾î¶² °¨Áö±â (sensor) µµ °®Áö ¾Ê´Â´Ù. ·Îº¿ÀÌ ¾î¶² ÇüÅÂÀÇ °¨Áö±â¸¦ ÇÊ¿ä·Î ÇÑ´Ù¸é, ´Ü¼øÈ÷ ÀÔ·Â ½ÅÈ£¿¡ ÀÇÇØ ·Îº¿¿¡ ¿¬°áÇÏ´Â Àü¿ë µð¹ÙÀ̽º·Î Á¦°øµÈ´Ù. ±×·¯¹Ç·Î ÇÁ·Î±×·¡¸Ó´Â ±× ½ÅÈ£¼±µéÀÇ Àǹ̸¦ Àû´çÈ÷ Çؼ®ÇØ¾ß ÇÑ´Ù.

3. ÀÚÀ²·Îº¿ (AUTONOMOUS ROBOT)

ÀÚÀ²·Îº¿Àº »ê¾÷·Îº¿º¸´Ù ´õ ¿µ¸®ÇØ¾ß Çϱ⠶§¹®¿¡ ÈξÀ ´õ º¹ÀâÇÏ´Ù. ÀÚÀ²·Îº¿ÀÌ ½Ç¼¼°èÀÇ ÅëÁ¦µÇÁö ¾ÊÀº ȯ°æ¿¡¼­ ÀÛµ¿ÇÏ·Á¸é »ê¾÷ ·Îº¿ÀÌ ¿ä±¸ÇÏÁö ¾Ê´Â ¿©·¯ °¡Áö ±â¼úÀ» ÇÊ¿ä·Î ÇÒ °ÍÀÌ´Ù : ¿¹¸¦µé¾î, µè°í º¼ ¼ö ÀÖ°Ô ÇÏ´Â °¨Áö±â¸¦ ÇÊ¿ä·Î ÇÒ °ÍÀ̸ç ÀÚ¿¬¾ð¾î¿Í ±× ¾ð¾î°¡ ÀǹÌÇÏ´Â °ÍÀ» ÀÌÇØÇØ¾ß ÇÑ´Ù. Áö±Ý±îÁö º¸¾ÒµíÀÌ, ·Îº¿¿¡°Ô ÀÌ µÎ°¡Áö ±â´ÉÀ» ºÎ¿©ÇÏ´Â °ÍÀº ÀÛÀº ÀÏÀÌ ¾Æ´Ï´Ù. ´õ¿íÀÌ, ·Îº¿Àº ¹®Á¦¸¦ ÇØ°áÇÒ ¼ö ÀÖ¾î¾ß Çϴµ¥, ÀÌ°ÍÀº ¾Æ¸¶ °¡Àå ¾î·Á¿î ÇÁ·Î±×·¡¹Ö ¾÷¹«ÀÏ °ÍÀÌ´Ù. ºÐ¸íÈ÷, °¡´ÉÇÑ ¸ðµç °æ¿ì¿¡ ÀÇÇØ ¹Ì¸® ·Îº¿À» ÇÁ·Î±×·¥ÇÒ ¼ö ¾ø±â ¶§¹®¿¡, ·Îº¿ÀÌ ¿©·¯ »óȲ¿¡ ÀÀ¿ëµÉ ¼ö ÀÖµµ·Ï Çϱâ À§Çؼ­´Â ÀÌ°ÍÀÌ ÇÊ¿äÇÏ´Ù.

ÀÚÀ² ·Îº¿ÀÇ Á¦ÀÛÀ» ¸·´Â ÁÖ¿ä Àå¾Ö¹°Àº ÇÁ·Î±×·¡¸Ó°¡ ÇÊ¿ä·Î ÇÏ´Â ¼ÒÇÁÆ®¿þ¾î ±â¹ýÀÌ ¾ÆÁ÷ °³¹ßµÇÁö ¸øÇß´Ù´Â »ç½ÇÀÌ´Ù. ¶ÇÇÑ, ÀÌ·± À¯ÇüÀÇ ·Îº¿Àº ¾Æ¸¶µµ ¾î¶² º´·Ä󸮸¦ ¿ä±¸ÇÒÅÙµ¥, ÀÌ°ÍÀº ¾ÆÁ÷µµ Ãʱ⠻óÅÂÀÌ´Ù. (º´·Ä󸮴 ´õ ºü¸¥ ¼Óµµ¸¦ ³»±â À§ÇÏ¿© µÑ ÀÌ»óÀÇ CPU ¸¦ »ç¿ëÇÑ´Ù)

±â¼úÀûÀÎ ¹®Á¦¸¦ ±Øº¹ÇÒ ¼ö ÀÖ´Ù¸é, ¹ý·üÀûÀÎ Ãø¸é¿¡¼­ÀÇ Çؼ®¹®Á¦°¡ ¿©ÀüÈ÷ ³²´Â´Ù. ·Îº¿ÀÌ ¿ì¿¬È÷µç ¿ì¹ßÀûÀ¸·Îµç Á˸¦ ÁöÀ¸¸é, ·Îº¿ÀÌ À¯ÁËÀΰ¡ ȤÀº ±× ¼ÒÀ¯ÀÚ°¡ À¯ÁËÀΰ¡? ¾Æ¸¶µµ À¯ÁËÀÎ ÂÊÀº ·Îº¿ÀÇ Á¦Á¶¾÷ÀÚÀ̰ųª ±×°ÍÀ» ÇÁ·Î±×·¥ÇÑ »ç¶÷ÀÏ °ÍÀÌ´Ù. ´õ¿íÀÌ, ÀÚÀ²·Îº¿Àº ¾î¶² ±Ç¸®¶óµµ °®´Â°¡ ¾Æ´Ï¸é ´Ü¼øÈ÷ ±â°èÀûÀÎ ³ë¿¹Àΰ¡ ÀÌ·± ¹®Á¦µéÀÌ ¹Ì·¡¿¡ ´äÇØÁú ÇÊ¿ä°¡ ÀÖÀ» °ÍÀÌ´Ù.

4. ·Îº¿ ½Ã¹Ä·¹ÀÌÅÍ ¸¸µé±â (CREATING ROBOT SIMULATOR)

·Îº¸Æ½½º¸¦ ½ÇÇèÇϱâ À§Çؼ­ ·Îº¿ÀÌ ÀÖÀ» ÇÊ¿ä´Â ¾ø´Ù. ·Îº¿À» ¸¸µå´Â ½ÇÁ¦´Â ¼ÒÇÁÆ®¿þ¾îÀ̱⠶§¹®¿¡ Çϵå¿þ¾î´Â Áß¿äÇÏÁö ¾Ê´Ù. ¼ÒÇÁÆ®¿þ¾î°¡ ¾ø´Ù¸é, ·Îº¿Àº ´Ü¼øÈ÷ ºñ½Ñ ¹® °É¸®°³ (doorstop) ¿¡ ºÒ°úÇÏ´Ù.

·Îº¿ ½Ã¹Ä·¹ÀÌÅÍ°¡ »ý»ê ±â¼úÀÚµé·Î ÇÏ¿©±Ý Á¶¸³ ¶óÀÎ (assembly line), ¶Ç´Â Àüü °øÀå Á¶Â÷µµ ¹Ì¸® ¼³°èÇϵµ·Ï Çϱ⠶§¹®¿¡ »ê¾÷¿¡¼­ ½ÇÁ¦·Î ¾ÆÁÖ ÈçÇÏ´Ù´Â °ÍÀ» ¾Ë¸é ³î¶öÁöµµ ¸ð¸¥´Ù. ÀÌ ½Ã¹Ä·¹ÀÌÅÍ Áß ¸î¸îÀº ¸Å¿ì º¹ÀâÇÏ¿©, ÀÛµ¿Çϱâ À§Çؼ­´Â ºü¸£°í ºñ½Ñ ÄÄÇ»Å͵éÀ» ¿ä±¸ÇÑ´Ù. ±×·¯³ª, C ¸¦ »ç¿ëÇÏ¿© °£´ÜÇÑ ½Ã¹Ä·¹ÀÌÅ͸¦ ±¸ÇöÇÒ ¼ö ÀÖ´Ù : ÀÌ ½Ã¹Ä·¹ÀÌÅÍ´Â ¹«¾ùÀÌ ·Îº¿À» ÇÁ·Î±×·¥Çϱ⿡ ÁÁÀº °ÍÀÎÁö ¾Ë°Ô ÇÑ´Ù.

ÀÌ Àå¿¡¼­ °³¹ßµÈ ·Îº¿ ½Ã¹Ä·¹ÀÌÅÍ´Â ÀÌ Ã¥¿¡¼­ °¡Àå ±ä ÇÁ·Î±×·¥À̱Ⱑ ½±´Ù. ·Îº¿ Á¦¾î ¾ð¾î Æļ­ ; °ø°£ Á¤º¸¸¦ ÀúÀåÇÏ´Â µ¥ÀÌÅͺ£À̽º ; µð½ºÇ÷¹ÀÌ¿Í ¿òÁ÷ÀÓ ½Ã¹Ä·¹ÀÌ¼Ç ·çƾ ; °£´ÜÇÑ ¿¡µðÅÍ, ±×¸®°í ¿©·¯ °¡Áö Áö¿ø ·çƾµéÀ» Æ÷ÇÔÇÏ¿© ¿©·¯ Ư¡µé (features) À» Æ÷ÇÔÇÑ´Ù. ¶ÇÇÑ Á¦ 5 Àå¿¡¼­ °³¹ßµÈ µ¨Å¸-D ÆÐÅÏ Àνı⸦ Æ÷ÇÔÇÑ´Ù. ½Ã¹Ä·¹ÀÌÅÍ´Â µ¶ÀÚ°¡ °­È­ÇÏ°í È®ÀåÇϱâ À§ÇÑ ½ÃÀÛÁ¡À¸·Î ¼³°èµÈ´Ù. ÇÁ·Î±×·¥À» ¿¬±¸Çϱâ Àü¿¡, ¹«¾ùÀ» ÇÏ°í Á¦ÇÑÁ¡ÀÌ ¹«¾ùÀÎÁö ÀÌÇØÇØ¾ß ÇÑ´Ù.

4.1. ½Ã¹Ä·¹ÀÌÅÍ ½Ã¹æ (The Simulator Specifications)

·Îº¿ ½Ã¹Ä·¹ÀÌÅÍ È¯°æÀº ´Ü ³× °³ÀÇ ´ë»óÀ¸·Î ä¿öÁø ¼¼°è·Î ±¸¼ºµÈ´Ù : ÇϳªÀÇ »ç°¢Çü, µÎ °³ÀÇ »ï°¢Çü, ·Îº¿, ½ºÅ©¸°ÀÇ ³ª¸ÓÁö´Â ºóÄ­ÀÌ´Ù. »ç°¢Çü°ú »ï°¢ÇüÀº Á¦ 5 Àå¿¡¼­ »ç¿ëµÈ °Í°ú °°Àº °ÍµéÀÌ°í, ÀÌ Àå¿¡¼­ °³¹ßµÈ delta-D ÀνıⰡ ½Ã¹Ä·¹ÀÌÅÍ¿Í ÇÔ²² »ç¿ëµÉ °ÍÀÌ´Ù. ·Îº¿Àº ÀÚÀ²ÀûÀÌ°í ½ºÅ©¸°¿¡¼­ # ±âÈ£·Î Ç¥ÇöµÈ´Ù. (±×·¡ÇÈ ¸ðµå°¡ »ç¿ëµÇÁö ¾Ê±â ¶§¹®¿¡, ÀÌ ÇÁ·Î±×·¥À» ¾î´À ÄÄÇ»ÅÍ¿¡¼­³ª ¼öÇà½Ãų ¼ö ÀÖ´Ù). ·Îº¿Àº ´Ù¸¥ ¹°Ã¼°¡ ¾ø´Â ¾î´À °÷¿¡³ª °¥ ¼ö ÀÖ´Ù. ±×·¯¹Ç·Î, »ç°¢Çü°ú »ï°¢ÇüÀº Àå¾Ö¹°ÀÌ°í, ·Îº¿Àº ±×°ÍµéÀ» µ¹¾Æ°¡¾ß ÇÏ°í °¡·ÎÁú·¯ °¡¼­´Â ¾ÈµÈ´Ù. ¸¶Áö¸·À¸·Î, ·Îº¿Àº ¹Ù·Î °¡±î¿î °÷¿¡¼­ Àå¾Ö¹°À» °¨ÁöÇÒ ´É·Â°ú, »ï°¢Çü°ú »ç°¢ÇüÀ» ¹ß°ßÇÒ ´É·ÂÀ» °®´Â´Ù. ½Ã¹Ä·¹ÀÌÅÍ´Â ´ÙÀ½ ¼±Åà »çÇ×µéÀ» Á¦°øÇÏ´Â ¸Þ´º¿¡ ÀÇÇØ ±¸µ¿ (drive) µÈ´Ù :

·Îº¿À» ÇÁ·Î±×·¥Çϱâ À§ÇÑ µÎ °¡Áö ¹æ¹ýÀÌ ÀÖ´Ù. ù ¹ø° °ÍÀº ·Îº¿ Á¦¾î ¾ð¾î¸¦ »ç¿ëÇÑ ¹æ¹ýÀÌ°í, µÎ ¹ø°´Â ½Ã¹Ä·¹ÀÌÆ®µÈ ±³À° Ææ´øÆ® »ç¿ëÀ» ÅëÇؼ­ÀÌ´Ù. ·Îº¿ Á¦¾î ¾ð¾î´Â °£´ÜÇÏÁö¸¸ ½±°Ô È®ÀåÇÒ ¼ö Àִµ¥, ´ÙÀ½ ¸í·É¾îµé·Î ±¸¼ºµÈ´Ù :

(1) moveto ¸í·É

·Îº¿¿¡°Ô ½ºÅ©¸°ÀÇ Æ¯Á¤ X, Y ÁÂÇ¥·Î °¡µµ·Ï ¾Ë¸®±â À§ÇÏ¿© moveto ¸í·ÉÀ» »ç¿ëÇÑ´Ù. ½ºÅ©¸°ÀÇ ÁÂÃø»ó´Ü Äڳʰ¡ 0, 0 ÀÌ´Ù. ÀÌ°ÍÀº ÇàÀÌ 0ºÎÅÍ 24 ±îÁö ¹øÈ£ ºÙ¿©Á® ÀÖ°í ¿­ÀÌ 0ºÎÅÍ 79 ±îÁö ¹øÈ£ ºÙ¿©Á® ÀÖ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. ¿¹µéµé¾î,

´Â ·Îº¿À¸·Î ÇÏ¿©±Ý 60, 12 À§Ä¡±îÁö À̵¿ÇÏ°Ô ÇÑ´Ù. ¼ýÀÚµé »çÀÌ¿¡ ÄÞ¸¶°¡ »ç¿ëµÇÁö ¾ÊÀ½À» ÁÖ¸ñÇØ¾ß ÇÑ´Ù : ºóÄ­À» Çϳª »ç¿ëÇØ¾ß ÇÑ´Ù.

(2) move ¸í·É

move ¸í·ÉÀ» »ç¿ëÇÏ¸é ·Îº¿À» Á¤ÇØÁø ¹æÇâÀ¸·Î ÇÑ À§Ä¡ (one position) ¸¸Å­ À̵¿ÇÏ°Ô ÇÑ´Ù. Å°º¸µå left, right, up ¶Ç´Â down À» »ç¿ëÇÏ¿© ÁöÁ¤ÇØ ÁÖ¾î¾ß ÇÑ´Ù. ¿¹¸¦µé¾î,

´Â ·Îº¿ÀÌ ÀÌÀü À§Ä¡·ÎºÎÅÍ ÇÑ Çà À§·Î, ±×¸®°í ³ª¼­ ÇÑ ¿­ ¿ÞÂÊÀ¸·Î À̵¿ÇÏ°Ô ÇÑ´Ù. ¹æÇâÀº ½ºÅ©¸°¿¡ ´ëÇÏ¿© »ó´ëÀûÀÌ´Ù : ½ºÅ©¸°À» º¼ ¶§, À§°¡ up ÀÌ°í ¾Æ·¡°¡ down ÀÌ´Ù.

(3) movep ¸í·É

movep ¸í·ÉÀ» »ç¿ëÇÏ¸é ·Îº¿¿¡°Ô ÀÌÀü¿¡ ±³À° Ææ´øÆ®¸¦ »ç¿ëÇÏ¿© ¹è¿ü´ø À§Ä¡·Î À̵¿Çϵµ·Ï ¾Ë·ÁÁØ´Ù. ¸ðµç À§Ä¡´Â Á¡ (point) À» °¡Áö°í ½ÃÀÛÇÏ°í, 1 °ú 200 »çÀÌÀÇ Á¤¼ö·Î ³¡³­´Ù. ¿¹¸¦µé¾î, ´ÙÀ½ ÄÚµå´Â ·Îº¿À» ¼¼ À§Ä¡·Î º¸³½´Ù.

(4) findt ¿Í finds ¸í·É

findt ¿Í finds ¸í·ÉÀº ·Îº¿¿¡°Ô »ï°¢Çü ¶Ç´Â »ç°¢ÇüÀ» °¢°¢ ¹ß°ßÇϵµ·Ï ¾Ë·ÁÁØ´Ù. À̸¦ Çϱâ À§ÇØ, ·Îº¿Àº Á¦ 5 Àå¿¡¼­ °³¹ßµÇ¾ú´ø µ¨Å¸-D ÆÐÅÏ Àνı⸦ »ç¿ëÇÑ´Ù. ·Îº¿Àº ¹°Ã¼ À§ÂÊ¿¡ ÀÖÀ¸¸é ±× ¹°Ã¼¸¦ ¹ß°ßÇÒ ¼ö ÀÖ´Ù. ¹°Ã¼¸¦ ¹ß°ßÇÑ ÈÄ, ÀÚ½ÅÀ» ¹°Ã¼ÀÇ ¿ìÃø»ó´Ü ÄÚ³ÊÀÇ ¿ÞÂÊÀ¸·Î ÇÑ ¿­¸¸Å­ À§Ä¡½Ãų °ÍÀÌ´Ù.

(5) goto ¸í·É

goto ¸í·ÉÀ» »ç¿ëÇϸé ÇÁ·Î±×·¥ ¼öÇàÀÌ ÁöÁ¤µÈ ·¹À̺í·Î Àü´ÞµÈ´Ù. ¿¹¸¦µé¾î,

´Â Á¦¾î¸¦ ·¹À̺í five ´ÙÀ½¿¡ ¿À´Â ÄÚµå·Î Àü´ÞÇÑ´Ù. ·¹À̺íÀº ·Îº¿ Á¦¾î ¾ð¾îÀÇ ¾î¶² Å°º¸µå ¹®ÀÚ·Î ±¸¼ºÇÏÁö ¾Ê´Â ÇÑ, Àμ⠹®ÀÚµéÀÇ °áÇÕÀ¸·Î ±¸¼ºµÈ´Ù.

(6) ifsense ¸í·É

À¯ÀÏÇÑ ÇÁ·Î±×·¥ Á¦¾î ¹®ÀåÀÌ ifsense ÀÌ´Ù. ±ÔÁ¤µÈ´ë·Î, ·Îº¿ÀÇ ¿À¸¥ÂÊ, ¿ÞÂÊ, À§ ¶Ç´Â ¾Æ·¡¿¡ ¹°Ã¼°¡ ÀÖ´ÂÁö¸¦ °áÁ¤ÇÑ´Ù. ¹°Ã¼°¡ ÀÖÀ¸¸é, ·Îº¿Àº then ´ÙÀ½ ¹®ÀåÀ» ¼öÇàÇÑ´Ù : ¹°Ã¼°¡ ¾øÀ¸¸é, ¼öÇàÀº ÇÁ·Î±×·¥ÀÇ ´ÙÀ½ ÁÙ¿¡¼­ ´Ù½Ã ½ÃÀÛÇÑ´Ù. Å°¿öµå up, down, left ¶Ç´Â right ¸¦ »ç¿ëÇÏ¿© °¨Áö ¹æÇâÀ» ÁöÁ¤ÇØ¾ß ÇÑ´Ù.

¿¹¸¦µé¾î, ÀÌ ÇÁ·Î±×·¥Àº ·Îº¿À¸·Î ÇÏ¿©±Ý ¹°Ã¼ÀÇ Ãø¸éÀ» µû¶ó À̵¿ÇÏ°Ô ÇÒ °ÍÀÌ´Ù.

4.2. ÆíÁý±â (The Editor)

½Ã¹Ä·¹ÀÌÅÍ´Â ÇÁ·Î±×·¥À» ÀÔ·ÂÇÒ ¸î°¡Áö ¹æ¹ýÀ» Áö¿øÇØ¾ß Çϱ⠶§¹®¿¡, ½ÃÀÛÇÒ ¶§´Â ÇÁ·Î±×·¥ ¿¡µðÅ͸¦ °¡Áö°í ÇÏ´Â °ÍÀÌ´Ù. ¿¡µðÅÍ´Â °£´ÜÇÏ´Ù : ºó ÁÙÀÌ ÀÔ·ÂµÉ ¶§ ±îÁö Çѹø¿¡ ÇÑ ÁÙ¾¿ ÀÔ·ÂÇÏ°Ô ÇÑ´Ù. ¸Å¿ì ±ä ¿¹ÀÇ Å©±â¸¦ ÁÙÀÌ´Â °ÍÀ» µ½±â À§ÇÏ¿© ¾î¶² ´Ù¸¥ ÇÔ¼öµµ À¯¿ëÇÏÁö ¾Ê´Ù. (±×·¯³ª, ¾î¶² ´Ù¸¥ ÇÔ¼öµéÀ» Ãß°¡ÇÏ°í ½ÍÀ»Áöµµ ¸ð¸¥´Ù. ¶Ç´Â º°°³ÀÇ ÅؽºÆ® ¿¡µðÅ͸¦ »ç¿ëÇϰųª ÆÄÀÏ·Îµå ·çƾÀ» ¸¸µé ¼öµµ ÀÖ´Ù.) ¹®ÀÚ ¹è¿­ prog ´Â ÇÁ·Î±×·¥À» À¯ÁöÇÑ´Ù. ¿¡µðÅÍ°¡ ´ÙÀ½¿¡ ÀÖ´Ù :

    /* input a program */

    edit()

    {

      char s[100];

      printf("¡¬n");

      *prog='¡¬0';          /* initialize the program array */

      do {

        printf(" :  ");

        gets(s);

        if (*s) {

          strcat(s, "¡¬n");      /* use newline as separator */

          strcat(prog, s);

        }

      } while(*s);

    }

4.3. ·Îº¿ °¡¸£Ä¡±â (Teaching Robot)

teach ¸í·ÉÀº ȯ°æ ½ºÅ©¸° »ç°¢Çü°ú »ï°¢ÇüµéÀÌ ÀÖ´Â °Í - ÀÌ ³ªÅ¸³ª°Ô ÇÑ´Ù. ·Îº¿Àº 0, 0 ÀÇ ½ÃÀÛ À§Ä¡ (home position) ¿¡ ³õÀδÙ. ÀÌ Á¡¿¡¼­, È­»ìÇ¥¸¦ »ç¿ëÇÏ¿© ·Îº¿À» À̸®Àú¸® ¿òÁ÷À̱â À§ÇÏ¿© ¼ýÀÚÅ° Æеå (numeric keypad) ¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. INS Å°¸¦ ´©¸£¸é, ÄÄÇ»ÅÍ´Â ·Îº¿ÀÇ ÇöÀç À§Ä¡¸¦ °ø°£ µ¥ÀÌÅͺ£À̽º (spatial database) ¿¡ ÀúÀåÇÏ°í ´ÙÀ½ ¸Þ½ÃÁö¸¦ (½ºÅ©¸°ÀÇ ÁÂÃøÇÏ´Ü Äڳʿ¡) µð½ºÇ÷¹ÀÌ ÇÑ´Ù. ¿©±â¼­, N Àº 1 °ú 200 »çÀÌÀÇ ¼ýÀÚÀÌ´Ù. ¸Å¹ø, INS Å°¸¦ ´©¸¦ ¶§ ¸¶´Ù, À§Ä¡ À̸§Àº Çϳª¾¿ Áõ°¡µÉ °ÍÀÌ´Ù. ÀÌ·± ½ÄÀ¸·Î (°¢ Á¡Àº µ¶Æ¯ÇÑ À̸§À» °¡Áö¸ç) Á¡µéÀÇ ¼ø¼­ (sequence) ¿¡ ´ëÇÏ¿© ·Îº¿À» °¡¸£Ä¥ ¼ö ÀÖ´Ù.

´ÙÀ½¿¡ ÀÖ´Â teach() ÇÔ¼ö´Â Å°Æеå·ÎºÎÅÍ ¹®ÀÚ¸¦ Àаí Àû´çÇÑ ¿¬»êÀ» ¼öÇàÇÑ´Ù. ±×·¯¹Ç·Î, Å°Æеå´Â ·Îº¿ ½Ã¹Ä·¹ÀÌÅÍ¿¡ ´ëÇÏ¿© ±³À° Ææ´øÆ®°¡ µÈ´Ù. Áö¿øÇÔ¼ö get_point() ´Â point µ¥ÀÌÅͺ£À̽º¿¡ ¿­¸° ½½·Ô (open slot) ÀÇ À妽º¸¦ ¸®ÅÏÇÑ´Ù.

    /* teach the robot certain moves */

    teach()

    {

      int x, y;

      int i;

      char name[30], num[10];

      strcpy(name, "point");

      position();

      gotoxy(0, 0);

      x=cur_x;  y=cur_y;

      for (; ;) {

        switch(tolower(getch())) {

          case '8' :

            if (move(x, y-1))  y--;

            break;

          case '2' :

            if (move(x, y+1))  y++;

            break;

          case '4' :

            if (move(x-1, y))  x--;

            break;

          case '6' :

            if (move(x+1, y)  x++;

            break;

          case '0' :

            if (i=get_point()) {

              itoa(i, num, 10);

              strcpy(point[i].name, name);   /* increment point name */

              strcat(point[i].name, num);

              gotoxy(0, 24);

              printf("%s stored", point[i].name);

              printf("                                     ");

              point[i].x=x;

              point[i].y=y;

            }

            break;

          case '1' :

            cur_x=cur_y=0;       /* reset globals */

            return;

        }

      }

    }

     

    /* return index of an open slot in the point database */

    get_point()

    {

      register int t;

      for (t=1; t<MAX ; t++)

        if (!*(point[t].name))  return t;

      return 0;

    }

move() ÇÔ¼ö´Â ·Îº¿À» ¾î¶² À§Ä¡·Î À̵¿½ÃŲ´Ù. À̵¿ÀÌ °¡´ÉÇϸé 1 ÀÌ°í °¡´ÉÇÏÁö ¾ÊÀ¸¸é 0 ÀÌ´Ù.

4.4. ÇÁ·Î±×·¥ ¼öÇà (Running Program)

´ÙÀ½¿¡ ÀÖ´Â ÇÔ¼ö run() Àº ÇÁ·Î±×·¥¿¡¼­ ÀνºÆ®·°¼ÇÀ» ¼öÇàÇÏ´Â Áö¿ø ·çƾµéÀ» ±¸µ¿½ÃÅ°´Â ÁÖ¿ä ·çÇÁÀÌ´Ù.

    /* execute a robot program */

    run()

    {

      get_token();

      while(*token) {

        if (!strcmp(token, "moveto"))  moveto_setup();

        if (!strcmp(token, "findt"))  findt();

        if (!strcmp(token, "finds"))  finds();

        if (!strcmp(token, "move"))  do_move();

        if (!strcmp(token, "ifsense"))  ifsense();

        if (!strcmp(token, "goto"))  do_goto();

        if (!strcmp(token, "movep"))  do_movep();

        get_token();

      }

    }

·çÇÁ¸¦ ÅëÇØ ¸Å¹ø, get_token() Àº ÅäÅ«À» °Ë»ö (retrieve) ÇÏ°í Àû´çÇÑ ÀνºÆ®·°¼ÇÀÌ ¼öÇàµÈ´Ù. get_token() ÇÔ¼ö´Â ÀÌ Ã¥ ¾Õ¿¡¼­ »ç¿ëµÈ °Í°ú °ÅÀÇ °°´Ù. ÇÁ·Î±×·¥ÀÌ ½ÇÁ¦·Î null ·Î ³¡³ª´Â ±ä ½ºÆ®¸µÀ̱⠶§¹®¿¡, ÄÄÇ»ÅÍ°¡ ÇÁ·Î±×·¥ÀÇ ³¡¿¡ µµ´ÞÇÒ ¶§ - ±×·¯¹Ç·Î, while ·çÇÁ¸¦ ¸ØÃâ ¶§ - token Àº null ÀÏ °ÍÀÌ´Ù.

Àüü ÇÁ·Î±×·¥ÀÌ ´ÙÀ½¿¡ ÀÖ´Ù. ½ÇÁ¦·Î °¢ ¸í·ÉÀ» ¼öÇàÇÏ´Â ·çƾÀÌ ÇÁ·Î±×·¥ÀÇ ½ÇÁ¦ ºÎºÐÀ» ±¸¼ºÇÑ´Ù´Â °ÍÀ» ÁÖ¸ñÇØ¾ß ÇÑ´Ù. ÀÌ ºÎºÐµéÀ» ÁÖÀDZí°Ô °øºÎÇÏ°í ³ª¼­ ÇÁ·Î±×·¥À» ÄÄÇ»ÅÍ¿¡ ³ÖÀÚ.

    /* Robot Simulator */

    #include "stdio.h"

    #include "dos.h"

    #define MAX 200

    #define SQUARE 0

    #define TRIANGLE 1

     

    /* database for delta-D recognizer */

    struct oldpoints {

      int x, y;

    } oldp[MAX];

    int pos=0;     /* indexes into oldp database */

     

    /* database for holding the spatial coordinates of user taught locations (points) in 2-d space */

    struct loc_point {

      int x, y;

      char name[30];

    } point[MAX];

    #define PROGSIZE 1000

    char prog[PROGSIZE];    /* holds the robot program */

    char *p_pos=0;          /* points into the sentence */

    char token[80];         /* contains the world */

    char cur_x, cur_y;      /* current x, y pos of robot */

    main()

    {

      char ch;

      register int t;

      for (t=0; t<MAX; t++)  *(point[t].name)='¡¬0';

      for (; ;) {

        gotoxy(0, 24);

        printf("choose : (E)dit, (R)un, (T)each, (Q)uit : ");

        setup();         /* restart each time */

        switch(tolower(getch()) {

          case 'e' : edit();

            break;

          case 'r' : position();

            run();

            break;

          case 't' : teach();

            cls();

            break;

          case 'q' : exit();

        }

      }

    }

    setup()

    {

      pos=0;

      p_pos=prog;

      cur_x=cur_y=0;

    }

     

    /* input a program */

    edit()

    {

      char s[100];

      printf("¡¬n");

      *prog='¡¬0';          /* initialize the program array */

      do {

        printf(" :  ");

        gets(s);

        if (*s) {

          strcat(s, "¡¬n");      /* use newline as separator */

          strcat(prog, s);

        }

      } while(*s);

    }

     

    /* teach the robot certain moves */

    teach()

    {

      int x, y;

      int i;

      char name[30], num[10];

      strcpy(name, "point");

      position();

      gotoxy(0, 0);

      x=cur_x;  y=cur_y;

      for (; ;) {

        switch(tolower(getch())) {

          case '8' :

            if (move(x, y-1))  y--;

            break;

          case '2' :

            if (move(x, y+1))  y++;

            break;

          case '4' :

            if (move(x-1, y))  x--;

            break;

          case '6' :

            if (move(x+1, y)  x++;

            break;

          case '0' :

            if (i=get_point()) {

              itoa(i, num, 10);

              strcpy(point[i].name, name);   /* increment point name */

              strcat(point[i].name, num);

              gotoxy(0, 24);

              printf("%s stored", point[i].name);

              printf("                                     ");

              point[i].x=x;

              point[i].y=y;

            }

            break;

          case '1' :

            cur_x=cur_y=0;       /* reset globals */

            return;

        }

      }

    }

     

    /* return index of an open slot in the point database */

    get_point()

    {

      register int t;

      for (t=1; t<MAX ; t++)

        if (!*(point[t].name))  return t;

      return 0;

    }

     

    /* execute a robot program */

    run()

    {

      get_token();

      while(*token) {

        if (!strcmp(token, "moveto"))  moveto_setup();

        if (!strcmp(token, "findt"))  findt();

        if (!strcmp(token, "finds"))  finds();

        if (!strcmp(token, "move"))  do_move();

        if (!strcmp(token, "ifsense"))  ifsense();

        if (!strcmp(token, "goto"))  do_goto();

        if (!strcmp(token, "movep"))  do_movep();

        get_token();

      }

    }

     

    moveto_setup()

    {

      int x, y;

      get_token();

      x=atoi(token);

      get_token();

      y=atoi(token();

      if (outrange(x, y)) {

        serror("moveto arguments out of range ¡¬n");

      }

      else moveto(x, y);

    }

     

    /* move to a point */

    moveto(x, y)

    int x, y;

    {

      char incx, incy;

      x=x-cur_x;

      y=y-cur_y;

      do {

        while(y) {

          if (y<0)  incy=-1; else incy=1;

            if (move(cur_x, cur_y+incy))

            y-=incy;

            else x+=find_path_right(cur_x, cur_y);

        }

        while(x) {

          if (x<0)  incx=-1; else incx=1;

          if (move(cur_x+incx, cur_y))

            x-=incx;

          else y+=find_path_down(cur_x, cur_y);

        }

       } while (x||y);

    }

     

    /* moves the robot to specified point if possible. Returns 0 on invalid location, 1 otherwise */

    move(x, y)

    int x, y;

    {

      if (outrange(cur_x, cur_y))  return;

      if (check_point(x, y))  return 0;

      gotoxy(cur_x, cur_y);

      /* if you wish to see the robot's trial, then remove the comments around the next line */

      /* putchar('.') ; */

      gotoxy(x, y);

      putchar('#');

      cur_x=x;  cur_y=y;

      return 1;

    }

     

    find_path_down(x, y)

    int x, y;

    {

      if (check_point(x, y+1)) {

        move(cur_x, cur_y-1);

        return 1;

      } else {

        move(cur_x, cur_y+1);

        return -1;

      }

    }

     

    find_path_right(x, y)

    int x, y;

    {

      if (check_point(x+1, y)) {

        move(cur_x-1, cur_y);

        return 1;

      } else {

        move(cur_x+1, cur_y);

        return -1;

      }

    }

     

    /* find a triangle */

    findt()

    {

      int x, y;

      if (recognize(&x, &y, TRIANGLE)) move(x-1, y);

    }

     

    /* find a square */

    finds()

    {

      int x, y;

      if (recognize(&x, &y, SQUARE)) move(x-1, y);

    }

     

    /* move one increment in specified direction */

    do_move()

    {

      get_token();

      if (!strcmp(token, "up")) move(cur_x, cur_y+1);

      else if (!strcmp(token, "down")) move(cur_x, cur_y+1);

      else if (!strcmp(token, "left")) move(cur_x-1, cur_y);

      else if (!strcmp(token, "right")) move(cur_x+1, cur_y);

    }

     

    /* if position indicated is clear then do target statement */

    ifsense()

    {

      char xinc, yinc;

      xinc=yinc=0;

      get_token();

      if (!strcmp(token, "up")) yinc=-1;

      else if (!strcmp(token, "down")) yinc=1;

      else if (!strcmp(token, "left")) xinc=-1;

      else if (!strcmp(token, "right")) xinc=1;

      if (!check_point(cur_x+xinc, cur_y+yinc)) {

        /* failure, so find next statement */

        while (*p_pos!='¡¬n' && *p_pos!='¡¬0')  p_pos++;

        return;

      }

      get_token();

      /* check for "then" */

      if (strcmp(token, "then")) {

        serror("-then-expected ¡¬n")

      }

      /* return with p_pos pointing to the target statement */

    }

     

    /* perform the goto */

    do_goto()

    {

      char *p, label[80];

      get_token();

      strcpy(label, token);

      /* to find the label, you must search through the program, so the current state of the system must be saved */

      p=p_pos;

      p_pos=prog;     /* start at top and look for label */

      get_token();

      while(*token) {

        if (!strcmp(token, label))  return;     /* find */

        get_token();

      }

      p_pos=p;    /* not found so clean up */

    }

     

    /* goto a user taught point */

    do_movep()

    {

      register int t;

      get_token();

      for (t=0; t<MAX; t++) {

        if (!strcmp(point[t].name, token)) {

          moveto(point[t].x, point[t].y);

          return;

        }

      }

      serror("point not found");

    }

     

    /* return true if out-of-range coordinates */

    outrange(x, y)

    int x, y;

    {

      if (x<0 || x>79) return 1;

      if (y<0 || y>24) return 1;

      return 0;

    }

     

    /* return a token from the input stream */

    get_token()

    {

      char *p;

      p=token;

      /* skip spaces */

      while(*p_pos==' ')  p_pos++l;

      if(*p_pos=='¡¬n') {

        *p++='¡¬n';

        *p='¡¬0';

        p_pos++;

        return;

      }

      if(*p_pos=='¡¬0') {    /* is end of program */

        *p++='¡¬0';

        return;

      }

      /* read word until a space or newline */

      while (*p_pos!=' ' && *p_pos!='¡¬n') {

        *p=*p_pos++;

        p++;

      }

      *p='¡¬0';

    }

     

    /* read the positions for the objects */

    position()

    {

      cls(); 

      make_triangle(10, 4);

      make_square(30, 10);

      make_right_triangle(50, 11);

    }

     

    /* draw an isosceles triangle at x, y */

    make_triangle(x, y)

    int x, y;

    {

      int t;

      for (t=0; t<5 ; t++) {

        gotoxy(x-t, y+t);

        printf("*");

      }

      for(t=0; t<5; t++) {

        gotoxy(x+t, y+t);

        printf("*");

      }

      gotoxy(x-5, y+5);

      printf("*****************");

    }

     

    /* draw a right triangle at x, y */

    make_right_triangle(x, y)

    int x, y;

    {

      int t;

      for (t=0; t<10 ; t++) {

        gotoxy(x, y+t);

        printf("*");

      }

      for(t=0; t<9; t++) {

        gotoxy(x-t+9, y+t);

        printf("*");

      }

      gotoxy(x, y);

      printf("*****************");

    }

     

    /* draw a square at x, y */

    make_square(x, y)

    int x, y;

    {

      int t;

      for (t=0; t<5; t++) {

        gotoxy(x, y+t);

        printf("*");

      }

      for (t=0; t<5; t++) {

        gotoxy(x+10, y+t);

        printf("*");

      }

      gotoxy(x, y);

      printf("****************")

      gotoxy(x, y+5);

      printf("****************");

    }

     

    /* The delta_D recognizer */

     

    /* search for a triangle and a square */

    recognize(x1, y1, obj)

    int *x1, *y1;

    char obj;

    {

      int x, y, t;

      t=0;

      x=cur_x;

      y=cur_y;

      if (obj=TRIANGLE)

        while (find_point(x, y, &x, &y)) {

          if (istriangle(x, y)) {

            gotoxy(t*40, 0);   t++;

            *x1=x; *y1=y;

            return 1;

          }

          x++;

        }

      else {

        clear_db();

        while (find_point(x, y, &x, &y)) {

          if (issquare(x, y)) {

            gotoxy(0, 1);

            *x1=x; *y1=y;

            return 1;

          }

          x++;

        }

      }

      return 0;

    }

     

    /* check for an issoceles triangle by key points */

    istriangle(x, y)

    int x, y;

    {

      if (follow(x, y)==2)  return 1;

      return 0;

    }

     

    /* check for a right triangle by key points */

    isright(x, y)

    int x, y;

    {

      if (check_point(x+10, y) && check_point(x, y+9))  

        return 1;

      return 0;

    }

     

    /* check for a square by key points */

    issquare(x, y)

    int x, y;

    {

      if (follow(x, y)==3)  return 1;

      return 0;

    }

     

    /* follow a shape and return number of turns */

    follow(x, y)

    int x, y;

    {

      int incx, incy, startx, starty, count;

      startx=x; starty=y;

      count=0;

      assert_oldp(x, y);

      if (!find_direction(x, y, &incx, &incy))  return 0;

      do {

        while (check_point(x+incx, y+incy)) {

          x=incx+x;

          y=incy+y;

          assert_oldp(x, y);

        }

        if (x==startx && y=starty)  return count;

        count++;

        if (!find_direction(x, y, &incx, &incy))  return 0;

      } while(1);

    }

     

    /* find a new line to follow */

    find_direction(x, y, incx, incy)

    int x, y, *incx, *incy;

    {

      register int a, b;

      for (a=-1; a<2; a++)

        for (b=-1; b<2; b++)

          if (check_point(x+a, y+b) && !find(x+a, y+b))  {

            *incx=a;

            *incy=b;

            return 1;

          }

        return 0;

    }

     

    assert_oldp(x, y)

    int x, y;

    {

      if (pos==MAX) {

        printf("point database full ¡¬n");

        return;

      }

      if (find(x, y))  return;      /* already in db */

      oldp[pos].x=x;

      oldp[pos].y=y;

      pos++;

    }

     

    find(x, y)

    int x, y;

    {

      register int t;

      for (t=0; t<pos; t++) {

        if (oldp[t].x==x && oldp[t].y==y)  return 1;

        }

      return 0;

    }

     

    /* returns the cursor loc of an '*' with the search beginning with startx and starty */

    find_point(startx, starty, x, y)

    int startx, starty, *x, *y;

    {

      int a, b;

      a=startx; b=starty;

      do {

        do {

          if (check_point(a, b) {

            *x=a;

            *y=b;

            returns 1;

          }

          a++;

        } while (a<79);

        a=0;

        b++;

      } while (b<24);

      return 0;

    }

     

    /* checks to see if the point is an '*' */

    check_point(a, b)

    int a, b;

    {

      union REGS regs;

      gotoxy(a, b);

      regs.h.ah=8;

      regs.h.bh=0;

      int86(16, &regs, &regs);

      if (regs.h.al=='*') return 1;

      return 0;

    }

     

    /* put cursor at x, y */

    gotoxy(x, y)

    int x, y;

    {

      union REGS regs;

      regs.h.ah=2;

      regs.h.dh=y;

      regs.h.dl=x;

      regs.h.bh=0;

      int86(16, &regs, &regs);

    }

     

    /* clear the screen */

    cls()

    {

      union REGS resg;

      regs.h.ah=6;

      regs.h.al=0;

      regs.h.ch=0;

      regs.h.cl=0;

      regs.h.dh=24;

      regs.h.dl=79;

      regs.h.bh=7;

      int68(16, &regs, &regs);

    }

     

    clear_db()

    {

      register int t;

      for (t=0; t<MAX; t++)  oldp[t].x=oldp[t].y=0;

    }

     

    /* report syntax errors */

    serror(s)

    char *s;

    {

      gotoxy(0, 24);

      printf("                                 ");

      gotoxy(0, 24);

      printf(s);

    }

ÄÄÇ»ÅÍ°¡ ÀνºÆ®·°¼ÇÀ» ¼öÇàÇÏ´Â ¹æ¹ýÀ» Á¶»çÇÏ´Â °ÍÀº ³Ê¹« ±æ¾î¼­ ÀÌ Àå¿¡ ¼ö¿ëÇÏÁö ¸øÇÑ´Ù. ±×·¯¸¶, moveto ÀνºÆ®·°¼ÇÀº ¸Å¿ì Áß¿äÇϱ⠶§¹®¿¡ ±× ¿ªÇÒÀ» ¼³¸íÇÑ´Ù.

½Ã¹Ä·¹ÀÌÅÍ°¡ moveto ¸í·ÉÀ» ¸¸³¯ ¶§, ÃʱâÈ­ ÇÔ¼ö moveto_setup() ÀÌ È£ÃâµÇ´Âµ¥, ÀÌ°ÍÀº ÁÂÇ¥¸¦ ÀÐ°í ±× ÁÂÇ¥°¡ ½ºÅ©¸°ÀÇ ¹üÀ§ ¾È¿¡ ÀÖÀ½À» Áõ¸íÇÑ´Ù. ´ÙÀ½, moveto() °¡ È£ÃâµÈ´Ù. moveto() ´Â ·Îº¿ÀÌ Àû´çÇÑ À§Ä¡¿¡ µµÂøÇÒ ¶§±îÁö ¹Ýº¹ÇÏ´Â ÇϳªÀÇ ¹Ù±ù while ·çÇÁ¿Í µÎ °³ÀÇ ³»ºÎ while ·çÇÁ·Î ±¸¼ºµÈ´Ù. ¸ÕÀú, ·Îº¿Àº Àû´çÇÑ Y ÁÂÇ¥·Î À̵¿µÇ°í ±×¸®°í ³ª¼­ Àû´çÇÑ X ÁÂÇ¥·Î À̵¿µÈ´Ù. ¹°Ã¼°¡ ·Îº¿ÀÇ Áø·Î¸¦ ¹æÇØÇÏÁö ¾ÊÀ¸¸é, ÀÌ °úÁ¤Àº ´Ü¼øÇÏ´Ù. ±×·¯³ª ·Îº¿ÀÌ ¹°Ã¼¸¦ µ¹¾Æ°¡¾ß ÇÑ´Ù¸é, ÇÁ·Î±×·¥Àº find_path_down(), find_path_right() ¶Ç´Â µÑ ´Ù¸¦ È£ÃâÇÑ´Ù. ÀÌ ·çƾµéÀº ·Îº¿À¸·Î ÇÏ¿©±Ý find_path_down() À» »ç¿ëÇÏ¿© ¿·¸éÀÇ ¾Æ·¡³ª À§·Î °¨À¸·Î½á ¹°Ã¼ ÁÖÀ§¸¦ À̵¿ÇÏ°Ô Çϰųª, find_path_right() ¸¦ »ç¿ëÇÏ¿© À§³ª ¾Æ·¡¸¦ µû¶ó ¿ÞÂÊÀ̳ª ¿À¸¥ÂÊÀ¸·Î À̵¿ÇÔÀ¸·Î½á ¹°Ã¼ ÁÖÀ§·Î À̵¿ÇÏ°Ô ÇÑ´Ù. µ¿ÀÛÀ» ÀÌÇØÇÑ´Ù´Â °ÍÀ» È®ÀÎÇϱâ À§ÇÏ¿© ÀÌ Äڵ带 °øºÎÇØ¾ß ÇÑ´Ù.

4.5. ½Ã¹Ä·¹ÀÌÅÍ »ç¿ë (Using the Simulator)

½Ã¹Ä·¹ÀÌÅÍ ÇÁ·Î±×·¥À» »ç¿ëÇÒ ¶§, ¸ÕÀú ´ÙÀ½ ¸Þ´º°¡ ³ª¿Â´Ù :

    choose : (E)dit, (R)un, (T)each, (Q)uit :

ÇÁ·Î±×·¥À» ÀÔ·ÂÇϱâ À§ÇÏ¿©, E ¸¦ ´©¸£°í ÀνºÆ®·°¼ÇÀ» ÀÔ·ÂÇغ¸ÀÚ. ³¡¸¶ÃÆÀ» ¶§, ºó ÁÙÀ» ³Ö´Â´Ù. ¿¹¸¦µé¾î, ´ÙÀ½ ÇÁ·Î±×·¥À» ÀÔ·ÂÇغ¸ÀÚ.  

    moveto 70 12

    moveto 0 0

    finds

±×¸² 4. ù ¹ø° ÇÁ·Î±×·¥¿¡ ´ëÇÑ ·Îº¿ÀÇ °æ·Î

±×¸®°í ³ª¼­ ºó ÁÙÀ» ÀÔ·ÂÇØ¾ß ÇÑ´Ù. ´ÙÀ½, ¸Þ´º¿¡¼­ ¼öÇà ¿É¼ÇÀ» ¼±ÅÃÇØ¾ß ÇÑ´Ù. ȯ°æ ½ºÅ©¸° (environment screen) ÀÌ ³ªÅ¸³¯ °ÍÀ̸ç, ·Îº¿ÀÌ Áö½ÃµÈ´ë·Î ¿òÁ÷ÀÌ´Â °ÍÀ» º¸°Ô µÉ °ÍÀÌ´Ù. ±×¸² 4 ´Â ½ºÅ©¸°°ú ·Îº¿ÀÇ °æ·Î¸¦ º¸¿©ÁØ´Ù.

ÇÁ·Î±×·¥À» ½ÇÇà½Ãų ¶§, ·Îº¿Àº ±× ±æ¿¡ ³õ¿©ÀÖ´Â ¹°Ã¼ÀÇ µÑ·¹¸¦ Á¤È®È÷ °£´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. ÀÌ°ÍÀÌ ¾î¶»°Ô ÀÌ·ç¾î Áö´ÂÁö ¾Ë±â À§ÇÏ¿© moveto ÇÔ¼ö¸¦ °øºÎÇØ¾ß ÇÑ´Ù. move() ÇÔ¼ö¸¦ À§ ¾ê±â¿¡¼­ ¾ð±ÞÇÑ °Íó·³ ¾à°£ º¯Çü½ÃŲ´Ù¸é ·Îº¿Àº ¿©ÇàÀÇ ÈçÀûÀ» ³²±æ °ÍÀÌ´Ù.

¶Ç´Ù¸¥ ¿¹°¡ ÀÖ´Ù : ´ÙÀ½ ÇÁ·Î±×·¥À» ·Îº¿À¸·Î ÇÏ¿©±Ý »ç°¢ÇüÀÇ º¯À» µû¶ó°¡°Ô ÇÒ °ÍÀÌ´Ù.

    finds

    10 move down

    ifsense right then goto 10

±×¸² 5. »ç°¢Çü ¸éÀ» µû¶ó°¡´Â ·Îº¿ÀÇ °æ·Î

·Îº¿ÀÇ ¿À¸¥ÂÊ¿¡ ¹°Ã¼°¡ ÀÖ´Â ÇÑ, ¾Æ·¡·Î °è¼Ó À̵¿ÇÑ´Ù. ±×¸² 5 ´Â ·Îº¿ÀÌ °¡´Â °æ·Î¸¦ º¸¿©ÁØ´Ù. ÇØ¾ß ÇÒ ´ÙÀ½ ´Ü°è´Â teach ¸í·ÉÀ» »ç¿ëÇÏ¿© ·Îº¿À» °¡¸£Ä¡´Â ÀÏÀÌ´Ù. ·Îº¿¿¡°Ô °¡¸£ÃÄÁØ À̵¿À» ÀÌ¿ëÇϱâ À§Çؼ­ ·Îº¿ Á¦¾î¾ð¾î¿¡ Àû´çÇÑ movep ÀνºÆ®·°¼ÇÀ» ³Ö¾î¾ß ÇÑ´Ù.

4.6. ½Ã¹Ä·¹ÀÌÅÍ È®Àå (Expanding the Simulator)

ÀÌ Ã¥¿¡¼­ ±ä ¸®½ºÆÃÀº ÇÇÇß´Ù. ½Ã¹Ä·¹ÀÌÅÍ°¡ ¹Þ¾ÆµéÀÏ ¼ö ÀÖ´Â ¸î¸î ¸í·ÉÀ» °¡Áö°í¼­µµ ÇöÀç »óÅ¿¡¼­´Â ±× ±æÀÌ°¡ ³Ê¹« ±æ´Ù. ÀÌ ¶§¹®¿¡, ½Ã¹Ä·¹ÀÌÅÍ´Â ´õ ¸¹Àº ±â´ÉÀ» Æ÷ÇÔÇÏÁö ¾Ê¾Ò´Ù. ±×·¯³ª, ¿©±â¿¡ ÁÖ¾îÁø ´Ù¸¥ ¸í·ÉÀÇ Çü½Ä¿¡ µû¶ó¼­ ·Îº¿ÀÇ Á¦¾î ¸í·É ¾ð¾î¸¦ ´õ Ãß°¡½ÃÅ°´Â °ÍÀº ½±´Ù.

ÇÑ °¡Áö ƯÈ÷ Àç¹ÌÀÖ´Â º¯È­´Â ÇÑ ±ÛÀÚ·Î µÈ ¹°Ã¼ÀÇ ´Ù¸¥ À¯ÇüÀ» ȯ°æ¿¡ Ãß°¡½ÃÅ°°í ·Îº¿À¸·Î ÇÏ¿©±Ý ±×°ÍµéÀ» »Ì¾Æ³»°Ô ÇÏ´Â °ÍÀÌ´Ù. ¶Ç ´Ù¸¥ °¨Áö¿ë ¹®Àå»Ó¸¸ ¾Æ´Ï¶ó, ¼ÕÀâÀÌ (grip) ¸¦ ´Ý°í ¿©´Â ¸í·ÉÀ» ÷°¡ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. ¶ÇÇÑ "¿¡³ÊÁö Æ丮Ʈ (energy pellets)" ¸¦ ¿©±âÀú±â »Ñ¸®°í ·Îº¿À¸·Î ÇÏ¿©±Ý ãÀ» °ÍÀ» ¿øÇÒ·±Áöµµ ¸ð¸¥´Ù. ´ÙÀ½ ÇüÅÂÀÇ ¹è¿­±¸Á¶¸¦ ¸¸µé¾î ½Ã¹Ä·¹ÀÌÅÍ¿¡ º¯¼ö¸¦ Ãß°¡ÇÒ ¼ö ÀÖ´Ù.

    struct variable {

      char name[10];

      int value;

    } var[MAX];

 

ÀÌ ¹è¿­Àº °£´ÜÇÑ IF ¹®ÀÚ ·çÇÁ Ä«¿îÅ͵éÀ» »ç¿ëÇÒ ¼ö ÀÖ°Ô ÇÑ´Ù. ±×·¯³ª, ÇÁ·Î±×·¥À¸·Î ÇÏ¿©±Ý º¹ÀâÇÑ ¼ö½Ä (numeric expression) À» Ç® ¼ö ÀÖ°Ô ÇÏ´Â °ÍÀº º¹ÀâÇÑ »ê¼ú½Ä (expression) Æļ­¸¦ »ç¿ëÇÒ °ÍÀ» ¿ä±¸ÇÑ´Ù.

¿¡µðÅÍ´Â ±ØÈ÷ Á¦ÇѵǾî ÀÖÀ½À» ±â¾ïÇÏÀÚ. ¾Æ¸¶µµ ¿¡µðÆÃ, º¯Çü, Ãß°¡¸¦ ¼ö¿ëÇϱâ À§ÇÏ¿© ¿¡µðÅ͸¦ È®ÀåÇÏ°í ½ÍÀ» °ÍÀÌ´Ù. ±×·¯³ª, ÇÁ·Î±×·¥À» ¸¸µé±â À§ÇÏ¿© ÀÚ½ÅÀÌ °¡Àå ÁÁ¾ÆÇÏ´Â ÅؽºÆ® ¿¡µðÅ͸¦ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï, ¿¡µðÅ͸¦ Á¦°ÅÇÏ°í ´Ü¼øÈ÷ ÆÄÀÏ·Îµå ·çƾÀ» ÷°¡ÇÒ ¼öµµ ÀÖ´Ù. ¹«¾ùÀ» º¯°æÇϱâ·Î °áÁ¤ÇÏ°Ç °£¿¡,ÀÌ Àå¿¡¼­ °³¹ßµÈ ·Îº¿ ½Ã¹Ä·¹ÀÌÅÍ´Â ·Îº¸Æ½½º ½ÇÇè¿¡ Àç¹ÌÀÖ°í Èï¹ÌÀÖ´Â Ãâ¹ßÁ¡À» Á¦°øÇÑ´Ù.