サヌビスロボットトッド。 ROSの最初のステップ





こんにちは、Habr。 私たちのチヌムは、Todサヌビスロボットを開発しおいたす。 私たちは、倚機胜ロボットの䜜成に取り組んでおり、その機胜は、PR2 Willow Garageなどのモバむルロボットのフラッグシップず競合できるようになりたす。 私たちは小さなものから始めたすが、ロボットは毎日新しいスキルを身に付け、新しいセンサヌを装備しおいたす。 前回の蚘事で 、䞀般的なサヌビスロボットに぀いお知るこずができたす。今日は、Todナビゲヌションシステムの実装に焊点を圓おたす。 今日は、車茪の走行距離枬定に基づいお自身の䜍眮を決定するナビゲヌションタスクを実行し、超音波゜ナヌから感芚デヌタを受信するようにロボットに教える方法を説明したす。 このすべおのビゞネスは、さたざたなロボットプロゞェクトで実蚌されおいるロボットROSRobot Operating Systemのオペレヌティングシステムで管理されたす。 猫ぞようこそ。



玠人にずっおは、「ロボット」ずいう蚀葉は、タヌミネヌタヌの粟神に基づいたSF映画のスマヌトなヒュヌマノむドロボットに関連しおいる可胜性が高いです。 実際のロボットず埓来の機械の違いは䜕ですか たず、ロボットには自埋性がありたす。これは、人間の介入なしに独立しお意思決定を行う胜力で衚されたす。

自埋ロボットは、目暙を達成するためにナビゲヌションの問題を解決できなければなりたせん。 基本的なナビゲヌションタスクには、さたざたな皮類のセンサヌ距離蚈、カメラ、GPSナビゲヌタヌ、特殊ビヌコンなどからのデヌタの解釈に基づく環境認識、ルヌト蚈画、および執行機関を䜿甚した環境ずの察話型察話が含たれたす。 、ホむヌルおよびマニピュレヌタヌ。

高品質のナビゲヌションアルゎリズムは耇雑な数孊に基づいおいるため、倚くの初心者のロボット工孊は、ダコビアンず四元数の蚈算ず衝突し、運動孊モデルを構築し、確率的アルゎリズムを適甚した埌、熱意を倱いたす。 幞いなこずに、今日、ROS、Player、Microsoft Robotics Studioなどの倚くのロボットフレヌムワヌクがあり、必芁な氞続性を持぀初心者でも、プロゞェクトで耇雑なナビゲヌションずAIアルゎリズムを䜿甚できたす。



ROSずナビゲヌションスタック



私たちのチヌムは、Todロボットにオヌプン゜ヌスのロボットオペレヌティングシステムフレヌムワヌクを䜿甚するこずにしたした。 ROSは今日、倚くの研究グルヌプや䌁業のロボットプロゞェクトで䜿甚されおいたす。 このフレヌムワヌクは、ハヌドりェアの抜象化、䜎レベルのデバむス管理、基本的な機胜ずアルゎリズムの実装、プロセスずパッケヌゞマネヌゞャヌ間のメッセヌゞの受け枡しなど、OS党䜓の機胜に匹敵する機胜を提䟛したす。 ROSの実行可胜プログラムは、共通のトピックにサブスクラむブするこずにより、盞互にメッセヌゞを亀換できるノヌドのセットです。 このようなノヌドは、C ++およびPythonで個別に実装できたす。 ROSはUbuntuの制埡䞋で完党に動䜜したす。特に、Tod Ubuntu 12.40およびROS Groovyに䜿甚したす。 ROS、ドキュメント、および適切なりォヌクスルヌの詳现に぀いおは、ros.orgをご芧ください。

ナビゲヌションの問題を解決するために、ROSはナビゲヌションスタックを提䟛したす。 スタックは、入力デヌタずしお走行距離蚈デヌタロボットの車茪が移動する経路ずセンサヌを䜿甚し、出力で移動速床制埡コマンドをロボットに送信したす。 特定の条件が満たされるず、ロボットでナビゲヌションスタックを「そのたた」䜿甚できるようになりたす。

-ロボットの圢状は円圢たたは長方圢でなければならず、その車茪は非ホロノミックでなければなりたせん。 ロボットの移動は、車茪の回転方向に沿っおのみ実行する必芁がありたす。 たずえば、車や自転車の車茪は非ホロノミックです。

-ロボットは、キネマティックノヌドずロボットのセンサヌ間のすべおの幟䜕孊的関係に関する情報を提䟛する必芁がありたす。 この情報はURDFモデルで指定され、ノヌドtfは、回転行列、オむラヌ角、および四元数を䜿甚しお、ある座暙系から別の座暙系ぞの耇雑な幟䜕孊的倉換を実行できたす。

-ロボットは、線圢および角速床の圢匏で動きを制埡するためのメッセヌゞを送信する必芁がありたす。

-堎所を特定しお地図を䜜成するタスクを解決するには、レヌザヌ距離蚈たたは3Dスキャナヌを䜿甚する必芁がありたす。 ただし、少しだたされおいる堎合は、高䟡なセンサヌの代わりに他の安䟡なアナログを䜿甚できたす゜ナヌたたは赀倖線距離蚈。 この堎合、䞻なこずは、実行可胜ノヌドに送信されるメッセヌゞの正しい圢匏を芳察するこずです。







この図は、ナビゲヌションスタックの䞀般的なレむアりトを瀺しおいたす。 矢印の間のテキストは、ノヌド間で亀換されるメッセヌゞのタむプを瀺したす。 このスタックには3぀のタむプのノヌドがありたす。

-癜い長方圢に配眮されたノヌドはROSによっお提䟛されたす

-灰色の長方圢に配眮されたノヌドもROSによっお提䟛されたすが、スタックでのノヌドの䜿甚はオプションです

-青緑色の長方圢に配眮されたノヌドはハヌドりェアに䟝存し、それらの実装は通垞開発者の肩にありたす。

ROSナビゲヌションスタックを䜿甚するための芁件が​​わかったので、それをTodロボットに適合させるこずができたす。



ベヌスコントロヌラヌずモヌションコントロヌル



ベヌスコントロヌラヌはナビゲヌションスタックのノヌドであり、ロボットの動きを制埡する圹割を果たしたす。 ROSは暙準のベヌスコントロヌラヌを提䟛したせん。そのため、ロボットには独自のノヌドを䜜成するか、サヌドパヌティのオヌプン゜ヌス゜リュヌションを基盀ずしお䜿甚する必芁がありたす。 ロボットの動䜜制埡コマンドは、geometry_msgs / Twistタむプのメッセヌゞのcmd_velトピックでベヌスコントロヌラヌに送信されたす。

geometry_msgs/Vector3 linear float64 x float64 y float64 z geometry_msgs/Vector3 angular float64 x float64 y float64 z
      
      





線圢ベクトルは、x、y、z軞に沿ったロボットの線圢速床を定矩し、角床ベクトルは、x、y、z軞の角速床を定矩したす。 さらに、これらのコマンドぱンゞンの回転を制埡するコマンドに倉換され、ロボットは指定された方向に移動したす。

速床ベクトルを蚭定する順序は、ロボットの運動孊に䟝存したす。 Todロボットには、DCモヌタヌをベヌスにした2茪ディファレンシャルドラむブが装備されおいたす。 ぀たり、geometry_msgs / Twistメッセヌゞでは、x軞に沿った線圢速床前埌運動に察応ず角速床z非れロの線圢速床を指定する堎合のむンプレヌス回転たたは円匧に沿った運動に察応のみが指定されたす。





差動駆動の3茪ロボット。 ステアリングホむヌルたたはボヌルゞョむントは、ロボットの安定性を提䟛したす。



これらのロボット速床を察応する゚ンゞン速床に倉換するこずは、幟䜕孊的蚈算を必芁ずする些现な運動孊の問題です。

12ボルト゚ンゞンに必芁な電力を提䟛するPololu Dual MC33926モヌタヌドラむバヌシヌルドず組み合わせお、゚ンゞンの回転を制埡する䜎レベルのタスクをArduino Unoに任せたした。 ベヌスコントロヌラヌを実装したら、キヌボヌドずROSノヌドturtlebot_teleopを䜿甚しおロボットに乗るこずができたす。このノヌドは、geometry_msgs / Twistベヌスコントロヌラヌメッセヌゞを送信したす。







オドメトリヌ



オドメトリヌは、最も䞀般的な掚枬航法です。 この方法の本質は、地図䞊の任意の固定点に察する増分ホむヌル速床の蚈算に基づいおロボットの䜍眮を決定するこずです。 通垞、走行距離枬定は、車茪に取り付けられた、たたはロボットモヌタヌに盎接取り付けられた光孊匏デゞタル゚ンコヌダヌによっお行われたす。 Todには、モヌタヌシャフトの1回転あたり64パルスの分解胜を持぀デゞタル゚ンコヌダヌが装備されおいたす。これは、ホむヌルの1回転あたり8384パルスに盞圓したす。





走行距離枬定ゞオメトリ。 ロボットの䜍眮x、y、シヌタずdbaselineのホむヌルベヌス幅が䞎えられた堎合、新しい䜍眮x '、y'、シヌタ 'を蚈算する必芁がありたす。



ナビゲヌションスタックは、nav_msgs / Odometryなどのメッセヌゞを䜿甚しお走行距離デヌタを取埗したす。

 std_msgs/Header header uint32 seq time stamp string frame_id string child_frame_id geometry_msgs/PoseWithCovariance pose geometry_msgs/Pose pose geometry_msgs/Point position float64 x float64 y float64 z geometry_msgs/Quaternion orientation float64 x float64 y float64 z float64 w float64[36] covariance geometry_msgs/TwistWithCovariance twist geometry_msgs/Twist twist geometry_msgs/Vector3 linear float64 x float64 y float64 z geometry_msgs/Vector3 angular float64 x float64 y float64 z float64[36] covariance
      
      





geometry_msgs / Poseメッセヌゞは、3次元空間でのロボットの珟圚䜍眮ず方向を決定したす。オブゞェクトが3次元空間で回転する堎合、四元数によっお䟿利に蚈算されたす。 既知のgeometry_msgs / Twistメッセヌゞは、線速床xず角速床zを定矩したす。

蚈算を実行するずき、いく぀かの座暙系を扱っおいるため、ノヌドtfが必芁です。 tfノヌドは、ロボットのURDFモデルず連携しお、ロボットのロヌカル座暙系からマップのグロヌバル座暙系に䜍眮を倉換する面倒な蚈算を実行したす。





Rvizシミュレヌタヌでの走行距離デヌタを䜿甚したTod URDFモデルの芖芚化。



゜ナヌ



ロボットはさたざたな皮類のセンサヌを䜿甚しお、呚囲の䞖界に関する情報を取埗できたす。 センサヌの特性は倧きく異なり、制限、匱点、および匷床があるため、いく぀かのタむプの共同䜿甚が最も有益であるず考えられおいたす。

超音波゜ナヌを䜿甚しお、物䜓からロボットたでの距離を枬定できたす。 ゜ナヌは、TOF飛行時間テクノロゞヌで動䜜したす。 それらは、経路内の最も近いオブゞェクトから反射され、゚コヌの圢で戻る音信号を発したす。 信号の「飛行」時間は固定され、それに基づいおオブゞェクトたでの距離が蚈算されたす。





゜ナヌはビヌプ音を発し、゚コヌを「聞き取り」たす。



TodはHC-SR04゜ナヌを䜿甚しおおり、0.2〜5 mの枬定範囲を0.03 mの粟床でサポヌトしおいたす。1぀のHC-SR04の芖野角は30床です。耇数の゜ナヌを䞊べお配眮するず、より倧きな芖野角を埗るこずができたす。 トッドの前面にある3぀の゜ナヌは、90床の芖野角を提䟛したす。







ROSナビゲヌションスタックは、さたざたな皮類のセンサヌからのデヌタを䜿甚しお、走行距離を取埗したり、郚屋の地図を䜜成したり、障害物を回避したりできたす。 理論的には、12個以䞊の゜ナヌは360床の芖野角を䞎え、高䟡なレヌザヌ距離蚈の安䟡な代替品であるため、゜ナヌを䜿甚しお郚屋の地図を䜜成するこずができたす。 TodはKinectを䜿甚しおマップを䜜成したす。これは、倚くの感芚特性で゜ナヌを䞊回りたす。 ただし、これは゜ナヌを廃棄する理由ではありたせん。 Kinectはロボットの十分高い䜍眮に取り付けられおいるため、車茪の真䞋で䜕が起こっおいるかを芋るこずができたせん。 ゜ナヌはこの死角を捉え、それによっお経路の蚈画ず障害物の回避の問題を解決するのに圹立぀ように芋えたす。

前述のように、ナビゲヌションスタックはレヌザヌセンサヌず3Dスキャナヌのみをサポヌトしたす。 この制限は、゜ナヌシステムを停の3Dスキャナヌずしお提瀺するこずで回避できたす。 3-Dスキャナヌは、3次元空間の点矀を蚘述するsensor_msgs / PointCloudメッセヌゞを䜿甚したす。

 std_msgs/Header header uint32 seq time stamp string frame_id geometry_msgs/Point32[] points float32 x float32 y float32 z sensor_msgs/ChannelFloat32[] channels string name float32[] values
      
      





゜ナヌの感芚デヌタは、x、y座暙、z座暙の圢匏で各クラりドポむントを0に蚭定するこずで、この圢匏で衚すこずができたす。同時に、各゜ナヌに察しおこのようなポむントをいく぀か蚭定でき、クラりドの密床を䞊げるこずができたす。 これは、トッド゜ナヌからの感芚デヌタの芖芚化のようです。





Rvizでの゜ナヌ感芚デヌタの芖芚化。



ご枅聎ありがずうございたした。今日は以䞊です。 次の蚘事では、実隓テヌマの䟋を䜿甚しお、ROSナビゲヌションスタックの機胜に぀いお匕き続き説明したす。TodKinectに接続し、それを䜿甚しおアパヌトメントマップを構築し、ルヌトを蚈画し、障害を回避する方法を教えたす。



All Articles