èæ¯


ããŸããŸãªã»ã³ãµãŒã«å ããŠãEddieã«ã¯æ©æ¢°çã«å°è±¡çãªãã©ãããã©ãŒã ïŒ20 kgã®è² è·å®¹éã宣èšãããŠãããããèªäœã®åã«å庫ããŒããŒãæŒãã®ã«ååãªã¢ãŒã¿ãŒé»åããããŸãïŒãšãããã°ã©ããã«ã³ã³ãããŒã©ãŒParallax Propellerãã€ãŸã éèŠãªã³ãŒãã¯ãã³ã³ãã¥ãŒã¿ãŒããçŽæ¥åœä»€ããã ãã§ãªããããããã«çŽæ¥çž«ãä»ããããšãã§ããŸãã


ææŠãã
ããããããååŸå·Šå³ãã ãã§å¶åŸ¡ããã®ã¯é£ããããšã§ã¯ãããŸããããã®ãããªããªã¢ãŒãå¶åŸ¡ãã®ããã°ã©ã ã¯ãšãã£ã®é ä¿¡ã«çŽæ¥å«ãŸããŠããŸãã ããããããããããŒããŒã®ããã¯ãæ瞊ãã人ã¯ããŸãããåèªãå庫ã®ã©ã®ãã€ã³ãã«ããããèªèãã次ã®ãã€ã³ãã«é²ãå¿ èŠããããŸãã ãã®äœçœ®ã®å®çŸ©ã§ãäž»ãªåé¡ãçããŸããã GPSã®ãããªæè¡ã¯äžæãããŠããŸããè¡æããã®ä¿¡å·ã¯å庫ã®å±æ ¹ãééããŸããã Kinectã¯ãžã§ã¹ãã£ãŒèªèã«é©ããŠããŸãããã¹ãã¬ãŒãžã·ã§ã«ããã©ã®ããã«èªèããŸããïŒ æ£èªäœã«ã¯ãã¡ãŒã¿ãŒããšã«äžæã®ããŒã³ãŒãã貌ãä»ããããŠããŸããããŸããå€åºå ã§æ£ãã20 cmé¢ããå Žæã§ã¯ããŸãä¿¡é Œæ§ã®é«ãããŒã³ãŒããèªã¿åããŸããïŒè¿ã¥ããŸãã-ãµããŒãã«ã¶ã€ãã£ãããæ£ããçªãåºãŠããç®±ã«ã¶ã€ããå±éºããããŸãïŒã 第äºã«ã20cmã®è·é¢ã§æ£ã«ç§»åããŠããŒã³ãŒããèªã¿åãã«ã¯ãçŸåšã®äœçœ®ã倧ãŸãã«ç解ããå¿ èŠããããŸãããããªããã°ãæ£ãã暪ã«ç§»åããããããã¯å®å šã«åãè¿ãã®ã€ããªãæ¹åã倱ããŸãã

ããææãªã®ã¯ããã€ãŒã«ã»ã³ãµãŒã®ããã²ãŒã·ã§ã³ã§ãåãã€ãŒã«ã®èµ°è¡è·é¢ãçŽÂ±7mmã®ç²ŸåºŠã§äžããŸããã Eddieãã¡ãŒã ãŠã§ã¢ã«ã¯ãããããã®èµ°è¡è·é¢ãïŒäž¡è»èŒªã®èµ°è¡ã®ååïŒãšãããããã®æ¹åãïŒè»èŒªã®èµ°è¡è·é¢ã®å·®ãæ£èŠåä¿æ°ïŒã®èšç®ãæ¢ã«å«ãŸããŠããŸãããçŸåšã®åº§æšïŒxãyïŒã¯2ã€ã®ã«ãŠã³ã¿ãŒã®å€ããèšç®ã§ããŸãã ããããã®è»éãå°ããªåçŽãªã»ã¯ã·ã§ã³ã«åå²ããåã»ã¯ã·ã§ã³ã®åããèŠçŽããå¿ èŠããããŸãã äžèŠãç Žç·ããããã®çµè·¯ãè¿ã¥ããããšæããŸãã ãããå®éã«ã¯ããéæ¢ã-ã¢ãŒã¿ãŒã®äžå®é床ã§-ããããã¯åã®åŒ§ã«æ²¿ã£ãŠç§»åããŸããååŸã倧ããã»ã©ãã¢ãŒã¿ãŒã®é床ã®å·®ã¯å°ãããªããŸãã ããã©ãããããã¬ãŒã¯ãã€ã³ãã¯ããããããã¹ããããã移åããã«æ¹åãå€æŽããå Žåãå®éã«ã¯ååšããååšããããšã¯ã§ããŸããã ãããã£ãŠãããããã®è»éãäžé£ã®å匧ã§è¿äŒŒããŸãã
èšç®
ããã¯ãã¹ãŠãå€é ãã«ãããã³ã«çµµãæãããšããå§ãŸããŸããã

ã¢ãŒã¯ã®éå§æãããããã¯ç¹A ïŒæ¢ç¥ïŒã«ãããæåŸã«ç¹B ïŒæªç¥ïŒã«ãªããå·Šè»èŒªã¯æ¢ç¥ã®çµè·¯S 1 = Ïr1ããå³è»èŒªã¯æ¢ç¥ã®çµè·¯S 2 = Ïr2ã移åããŸãã ã ãã©ãã¯éã®è·é¢wã¯äžå®ã§ãããããããã®èšèšã«ãã£ãŠæ±ºãŸããŸãã ååŸãããã®ïŒ
r 2 / r 1 = S 2 / S 1ããã³r 2 = r 1 + w
ïŒ r 1 + w ïŒ/ r 1 = S 2 / S 1
r 1 S 1 + wS 1 = r 1 S 2
r 1 = wS 1 /ïŒ S 2 - S 1 ïŒ
ãããã£ãŠããããããå転ããè§åºŠã¯Ï = S 1 / r 1 =ïŒ S 2 - S 1 ïŒ/ wã§ãããè·é¢| AB | = 2 | AM | = 2ïŒ r 1 + w / 2ïŒsinïŒ Ï / 2ïŒ=ïŒ2 wS 1 /ïŒ S 2 - S 1 ïŒ+ w ïŒsinïŒ Ï / 2ïŒ= w sinïŒ Ï / 2ïŒïŒ S 2 + S 1 ïŒ/ïŒ S 2 - S 1 ïŒ
ããã§ãæŠããŠãäœçœ®ã決å®ããããã®ãã¹ãŠã®æ°åŠïŒèšç®ãããÏãããããã®æ¹åã®è§åºŠã«è¿œå ããçŸåšã®åº§æšãè·é¢ã ãã·ãããããã³ã«| AB |ã å®çšçãªåé¡ã¯æ®ã£ãŠããŸãïŒãã®ãããªäœçœ®ã®æŽæ°ãå®è¡ããé »åºŠã¯ïŒ äœãã«ãé »ç¹ã«ãç§éã¯é¢æ£çãªãå»ã¿ç®ãã§èµ°è¡è·é¢ã枬å®ããè»èŒªã»ã³ãµãŒã®äžæ£ç¢ºãã«åºããããŸãã ããŸãã«ãŸããªå Žåãåã®åŒ§ã«ããçµè·¯ã»ã°ã¡ã³ãã®è¿äŒŒã¯ååã«æ£ç¢ºã§ã¯ãããŸããã
ãã€ãŒã«ã»ã³ãµãŒã®èªã¿åãå€ã¯ããã£ãã¯ãã®æç¹ã§æãæ£ç¢ºã§ãããšå€æããããããã€ãŒã«ã®ãã£ãã¯ããšã«ããããã®äœçœ®ãåèšç®ããŸãããã ããçŽ80ããªç§ååŸã«èšé²ãããããããã®èª¿æ»æéãè¶ ããŸããã å°ãªããšã1ç§éã«1åãåæ¢ãããã€ãŒã«ïŒããšãã°ãå転äžïŒãèšé²ãããããã«ããŸãã ç»é²ããããã¹ãŠã®ããã£ãã¯ãã¯ãªã¹ãã«ä¿åãããŸããããã¯ãäœçœ®ãåèšç®ããããã«ãäž¡æ¹ã®ãã€ãŒã«ãåãæéå®è¡ããå¿ èŠãããããã§ãã äž¡æ¹ã®ãã€ãŒã«ã§ä»¥åã®ããã£ãã¯ã ã®æ©ãæ¹ããééãåããããã£ãã¯ã®ãªã¹ããã«åŸã£ãŠåãç¬éã«2çªç®ã®ãã€ãŒã«ã®èµ°è¡è·é¢ãç·åœ¢è£éããŸãã ã®ã£ããã®çµããã«ã€ããŠã¯ãåæ§ã«ãç®çãä»ããã€ãŒã«ã®ã»ã³ãµãŒãèªã¿åã£ãèµ°è¡è·é¢ãååŸãã2çªç®ã®èµ°è¡è·é¢ãçŽç·çã«å€æ¿ããŸãã ãããã£ãŠã粟床ã¯å¯èœãªéãéæå¯èœã§ãªããã°ãªããŸããã
ããããã®äœçœ®ãåèšç®ããããã³ã«ããããããæå®ãããã¿ãŒã²ããã«åããããã«ãè»èŒªã®é床ãæ°ããæ¹æ³ã§èšå®ããå¿ èŠããããŸãã ãããããæå®ã®ãæ¹äœè§ãã«æ£ç¢ºã«åããŠå®äœçœ®ã§å転ãããã®ã¯éçŸå®çã§ããåè¿°ã®Â±7 mmã®ãã€ãŒã«ãã€ã¬ãŒãžãšã©ãŒã¯ããããããå転ãããšæ°åºŠã®ãšã©ãŒã«ãªããŸãã ããããã¯æ æã«ãã©ã³ãã ã«ã移åããéè·¯ã«æ²¿ã£ãŠåã³æåããå¿ èŠããããŸãã ãããã£ãŠãã¿ãŒã²ãããžã®æ¹åãçŸåšã®æ¹åãšããŸãéããªãå Žåã¯ãäºåã«ãæ¹äœè§ã«åãããããšãªããã¢ãŒã¯ã«æ²¿ã£ãŠãããããã¿ãŒã²ããã«åããããšã«ããŸããã ïŒçŸåšã®æ¹åãåžæã®æ¹åãšÏ / 2ç°ãªãå Žåããã®ãããªå匧ã¯ååãã倧ãããªããŸããããã¯æããã«éçŸå®çã§ãããã®å Žåãããããã¯æ£ããæ¹åã«å転ãã以å€ã«éžæè¢ããããŸãããïŒ
ã¢ãŒã¯ãèšç®ããã«ã¯ãäžã®å³ã«æ»ããŸãããã ããã§ããã€ã³ãAãšBãããã£ããããè§åºŠÏãããããŸããã æ¯çS 2 / S 1 = r 2 / r 1ãèŠã€ããå¿ èŠããããŸããããã¯ãã¢ãŒã¯ã«å¿ èŠãªè»èŒªé床ã®æ¯çãèšå®ããŸãã äžèšã®èšç®ãå察æ¹åã«ç¹°ãè¿ããŸãã
| AB | = 2 | AM | = 2ïŒ r 1 + w / 2ïŒsinïŒ Ï / 2ïŒ
r 1 = | AB | /ïŒ2sinïŒ Ï / 2ïŒïŒ- w / 2
r 2 = | AB | /ïŒ2sinïŒ Ï / 2ïŒïŒ+ w / 2
r 2 / r 1 = 1 + w /ïŒ| AB | /ïŒ2sinïŒ Ï / 2ïŒïŒ- w / 2ïŒ= 1 + 2 /ïŒ| AB | /ïŒ wã»sinïŒ Ï / 2ïŒïŒ-1 ïŒ
ãã®ãããªã¢ãŒã¯ã¯ãã©ã€ã³ABããã©ã®çšåºŠé¢ããŸããïŒ ãããããå匧ãå®æãããããã«äž¡åŽã«2ã¡ãŒãã«ã®ç©ºãã¹ããŒã¹ãå¿ èŠãšããå Žåãå庫ã«ã¯ãã®ãããªæ©äŒã¯ãããŸãããæ£éã®éè·¯ã®å¹ ã¯1.5ã¡ãŒãã«ãããããŸããã

è·é¢ãèšç®ãã| Mh | å匧ãšç·ã®éïŒ| OH |-| OM | = r - r cosïŒ Ï / 2ïŒ=ïŒ r 1 + w / 2ïŒïŒ1-cosïŒ Ï / 2ïŒïŒ
ãã®ããã³ããã®å€§ãããæå®ã®å¶éãè¶ ããå Žåã匧ãæãããã«ç§»åããããšãæåŠããæå®ã®äœçœ®ã§å転ããŠãã¿ãŒã²ããã«åãã£ãŠè¿ã¥ãããšããŸãã
å€æããããã«ãå®éã«ã¯ãã¢ãŒã¿ãŒã®ã¹ãã¬ã¹ã®æ¯çã¯ãŸã è»èŒªé床ã®æ¯çã決å®ããŠããŸããã ãããã®éã§æ£ããå€æãéžæããããšã¯å¯èœã§ãããç§ã¯ããã«ãŒããã©ãŒã¹ãã§åé¡ã解決ããŸããïŒç§ã¯æ¯çã9床ã«äžããŸããã çåŽãžã®ããããªåå·®ã¯ãããã«ãããããå察æ¹åã«åŒ·ãæŒããŸãã å®éãããããã®åããæ¬åœã«æ»ããã«ãªã£ãã®ã¯ãã®ææ°ã§ãããè§åºŠãå°ãããªããšãããããã¯æšªã«å€§ããå€ããã¿ãŒã²ããèªäœã§ã®ã¿æ£ããã«ãŒãã«æ»ããŸããã 倧ããªãã®ã§ã¯ãè£æ£ã匷ãããããšãå€æããããããã¯çããžã°ã¶ã°ã§å·Šå³ã«ãæºãããŸããã
å®è£
ReferencePlatform2011é ä¿¡ããMarkRobotãµãŒãã¹ã«æ°ããæ©èœãè¿œå ããããšãèšç»ããŠããŸãããPositionOperationsã®ç²Ÿç¥ã§æ°ããããŒãã¬ãããå®è£ ããŸã
PositionOperations : PortSet<GetPosition, SetPosition, SetDestination>
ã å®éããã®å®è£ ã«ã¯è³ããŸããã§ããããµãŒãã¹éã§è²¬ä»»ãåé¢ããã«æºåã§ããã®ã¯æ³¥ã ããã®ãããã¿ã€ãã ãã§ããã ããããç§ããã£ãããšãèŠããããšããŸãã
æåã«ã座æšãæäœããããã«äœããå¿ èŠã§ããããããä¿åããããã«
System.Drawing.PointF
ã¯ãããŸããã
public struct Position { public readonly double x, y, heading; public Position(double x, double y, double heading) { this.x = x; this.y = y; this.heading = heading; } private static double Sqr(double d) { return d * d; } public double DistanceTo(double x, double y) { return Math.Sqrt(Sqr(this.y - y) + Sqr(this.x - x)); } public static double NormalizeHeading(double heading) { while (heading < -Math.PI) heading += 2 * Math.PI; while (heading > Math.PI) heading -= 2 * Math.PI; return heading; } // turn angle/2, go ahead distance, turn angle/2 again public Position advance(double distance, double angle) { double newHeading = heading + angle / 2, newX = x + distance * Math.Cos(newHeading), newY = y + distance * Math.Sin(newHeading); return new Position(newX, newY, NormalizeHeading(heading + angle)); } }
advance
ã¡ãœããã¯ãæå®ãããå転è§Ïãšç§»åè·é¢|ã®åº§æšã®åèšç®ãå®è£ ããŸãã AB |ïŒèšäºã®äžå€®ã®å³ã®ããã«ïŒã
ïŒä»ãããã«ã³ãŒããã³ããŒããŠãç§ã¯æ£ç¢ºã«ãäºéè§åºŠåŒããååŸããè§åºŠÏ / 2ã§| AB |ã ãã·ãããã代ããã«ãè§åºŠÏ㧠r 1 + w / 2ã ã移åã§ããããšã«æ°ä»ããŸããããŸããïŒ
ããã«ããµãŒãã¹ã«ã¯
PositionKeeping
ã€ã³ã¹ã¿ã³ã¹ãå«ãŸããŠããããã®å éšã«ã¯
EncoderLog
2ã€ã®ã€ã³ã¹ã¿ã³ã¹ããããŸããã
EncoderLog
ãªã¹ãããåãã€ãŒã«ã®åå¥ã®ã€ã³ã¹ã¿ã³ã¹ã§ãã ïŒçè«çã«ã¯ïŒã»ã³ãµãŒããŒã¿ã¯æç³»åã§å°çããªãå¯èœæ§ãããããããªã¹ãã¯
SortedList
ã«
SortedList
ããŸãã
EncoderLog
å¯äžã®éèŠãªæ¹æ³ã¯ãããã£ãã¯ãã®éãŸãã¯æåŸã®ããã£ãã¯ãã®åŸã®ä»»æã®æç¹ã§å€ãååŸããããã®ãã¹ã®ç·åœ¢è¿äŒŒã§ãã
private class PositionKeeping { private static readonly DateTime initialized = DateTime.Now; public class EncoderLog { private SortedList<DateTime, double> log = new SortedList<DateTime, double> { { initialized, 0 } }; public void Register(DateTime at, double reading) { log[at] = reading; } public void Reset(DateTime at, double reading) { log.Clear(); log.Add(at, reading); } public DateTime LastTick { get { return log.Last().Key; } } public double LastReading { get { return log.Last().Value; }} public double ReadingAt(DateTime at) { int index = log.Count - 1; while(index>=0 && log.Keys[index] > at) index--; if(index<0) return double.NaN; // before first reading; impossible // now, log.Keys[index] <= at, and log.Keys[index+1] > at DateTime preceding = log.Keys[index], following = index<log.Count-1 ? log.Keys[index+1] : DateTime.MaxValue; if(following == DateTime.MaxValue) { // last reading precedes at; extrapolate if(index==0) // there's only one reading return log[preceding]; else { DateTime nextPreceding = log.Keys[index-1]; return log[nextPreceding] + (at-nextPreceding).TotalSeconds * (log[preceding]-log[nextPreceding]) / (preceding-nextPreceding).TotalSeconds; } } else // both readings are available; interpolate return log[preceding] + (at-preceding).TotalSeconds * (log[following]-log[preceding]) / (following - preceding).TotalSeconds; } } public EncoderLog leftEnc = new EncoderLog(), rightEnc = new EncoderLog();
ããã£ãã¯ãªã¹ããã«å ããŠãåããã£ãã¯ãæã®äœçœ®ã®ãªã¹ãã
PositionKeeping
ã«ä¿åããå¿ èŠããããŸãããã®ä¿åãããäœçœ®ããã移åããè·é¢ã枬å®ããŠæ°ããäœçœ®ãååŸããŸãã
private SortedList<DateTime, Position> position = new SortedList<DateTime, Position> { { initialized, new Position(0, 0, Math.PI / 2) } }; public void Register(DateTime at, Position pos) { position.Add(at, pos); } public void Reset(DateTime at, Position pos) { // the position has changed => old ticks logs become obsolete leftEnc.Reset(at, leftEnc.ReadingAt(at)); rightEnc.Reset(at, rightEnc.ReadingAt(at)); position.Clear(); position.Add(at, pos); } public Position Current { get { return position.Last().Value; } }
å°åºãããå ¬åŒã«åŸã£ãŠãäž¡æ¹ã®ãã€ãŒã«ã»ã³ãµãŒã®ããŒã¿ã«åŸã£ãŠæ°ããäœçœ®ãèšç®ããããšã«ããã
PositionKeeping
ã¯ã©ã¹ãè£å®ããŸãã
Update
ã¯ã»ã³ãµãŒãã§ãã¯ãµã€ã¯ã«ïŒ
ServiceHandlerBehavior.Concurrent
ïŒããåŒã³åºãããšãã§ãããµãŒãã¹ããŒããåŒæ°ãšããŠåãåãããã£ãã¯ãç»é²ããããšæ°ãã座æšãéä¿¡ããŸãã ãã®ã¡ãã»ãŒãžã¯ãµãŒãã¹ã®ç¶æ ãå€æŽããããã
ServiceHandlerBehavior.Exclusive
ãšããŠæ±ãå¿ èŠããããŸãã
private static readonly TimeSpan RegisterDelay = TimeSpan.FromSeconds(1); // register null-tick if no actual ticks for this long public void Update(DateTime at, double left, double right, PositionOperations mainPort) { DateTime prevRef = Min(leftEnc.LastTick, rightEnc.LastTick); SetPosition set = new SetPosition { Timestamp = at, LeftEncUpdated = left != leftEnc.LastReading || at > leftEnc.LastTick + RegisterDelay, LeftEncReading = left, RightEncUpdated = right != rightEnc.LastReading || at > rightEnc.LastTick + RegisterDelay, RightEncReading = right }; if(set.LeftEncUpdated || set.RightEncUpdated) { set.Position = Recalculate(prevRef, left, right); mainPort.Post(set); } } private Position Recalculate(DateTime prevRef, double left, double right) { double sLeft = left - leftEnc.ReadingAt(prevRef), sRight = right - rightEnc.ReadingAt(prevRef); Position refPos = position[prevRef]; // has to exist if the encoder reference exists if (Math.Abs(sRight - sLeft) < .5) // less then half-tick difference: go straight return refPos.advance(Constants.CmPerTick * (sRight + sLeft) / 2, 0); else { double angle = Constants.CmPerTick * (sRight - sLeft) / Constants.WheelsDist, distance = Constants.WheelsDist * Math.Sin(angle / 2) * (sRight + sLeft) / (sRight - sLeft); return refPos.advance(distance, angle); } } }
ç®çã®ã³ãŒãã«æ®ã£ãŠããã®ã¯
SetPosition
ãã³ãã©ãŒã ãã§ããããã¯ããããããã¿ãŒã²ããã«åãã£ãŠç§»åããããã«ã¢ãŒã¿ãŒã®é»å§ãèšå®ããŸãã
[ServiceHandler(ServiceHandlerBehavior.Exclusive)] public void SetPositionHandler(SetPosition set) { if (!set.LeftEncUpdated && !set.RightEncUpdated) { // position updated by an absolute reference. positionKeeping.Reset(set.Timestamp, set.Position); } else { if (set.LeftEncUpdated) positionKeeping.leftEnc.Register(set.Timestamp, set.LeftEncReading); if (set.RightEncUpdated) positionKeeping.rightEnc.Register(set.Timestamp, set.RightEncReading); positionKeeping.Register(set.Timestamp, set.Position); } // the navigator Destination dest = state.dest; double distance = set.Position.DistanceTo(dest.x, dest.y); if (distance < 5) // reached { drivePort.SetDrivePower(0, 0); SendNotification(submgrPort, new DriveDistance()); return; } double heading = Position.NormalizeHeading(Math.Atan2(dest.y - set.Position.y, dest.x - set.Position.x)), power = (distance < 50) ? .2 : .4; // a few magic numbers if (Math.Abs(heading) < .05) { // straight ahead drivePort.SetDrivePower(power, power); return; } double r = distance / (2 * Math.Sin(heading / 2)), hump = r * (1 - Math.Cos(heading / 2)); if (Math.Abs(heading) > Math.PI / 2 || Math.Abs(hump) > Constants.MaxHump) { // not reachable by an arc; rotate if (heading > 0) // rotate left drivePort.SetDrivePower(-.3, .3); else // rotate right drivePort.SetDrivePower(.3, -.3); } else { // go in arc double rLeft = Math.Abs(r - Constants.WheelsDist / 2), rRight = Math.Abs(r + Constants.WheelsDist / 2), rMax = Math.Max(rLeft, rRight); // <Patrician|Away> what does your robot do, sam // <bovril> it collects data about the surrounding environment, then discards it and drives into walls drivePort.SetDrivePower(power * Math.Pow(rLeft / rMax, 9), power * Math.Pow(rRight / rMax, 9)); } }
次ã¯ïŒ
ãã®ããããã¯ããªãããŸãé転ããŸãããã环ç©ãšã©ãŒã®ããã«åé¡ãçºçããŸããã 座æšãä¿®æ£ããã«ã¯ãããŒã³ãŒãã®å°ãªããšã20ïŒ ãæ£åžžã«èªã¿åãã
LeftEncUpdated = RightEncUpdated = false
ã§
LeftEncUpdated = RightEncUpdated = false
åŒã³åºããŠ
PositionKeeping
ããåèµ·åã
PositionKeeping
SetPosition
ã§
LeftEncUpdated = RightEncUpdated = false
ã§ãã ããŒã³ãŒãã®èªã¿åãééãæ°ã¡ãŒãã«ã®å Žåã座æšã決å®ããéã®ãšã©ãŒã¯20 cmãè¶ ããŸããã§ãã-ãããããšæ£ã®éã«ããŸãã«ãå€ãæ®ããŸããã
æ¹åãä¿®æ£ãããã®ãäœããªããããããã£ã³ã°ãšã©ãŒã®ç¶æ³ã¯ããã«æªåããŸãããããŒã³ãŒãã¯ã©ã®è§åºŠããã§ãèªã¿åãããšãã§ããŸãïŒãããŠç¥ã«æè¬ããŸãïŒã æ°åºŠã®çŽ¯ç©èª€å·®ã¯ããããããã©ã³ãã ã«ä¹ã£ãŠå šåã§é£éã«å ¥ãã«ã¯ãã§ã«ååã§ãã æ£é¢ã®è§£æ±ºçã¯ããžã£ã€ãã¹ã³ãŒããèšçœ®ããããšã§ãã ããããEddieçšã®æ¢è£œã®ãžã£ã€ãã¯ãããŸãããã¯ãã ããŠãšãã¡ãŒã ãŠã§ã¢ã®æžã蟌ã¿ã§è¬ãåé¿ããããšæããŸãã
ãžã£ã€ãã¹ã³ãŒããä»ã®ãšããŸããã¯ãªã»ã³ãµãŒãªãã§æ¹åãä¿®æ£ããã«ã¯ã次ã®èšäºã«å°å¿µããŸãã