News

著者:yamamoto.yosuke

Gazebo/MoveIt のための 3D モデリング(8)滑らかなサーフェス – 作成編(その3)

前回は「Gazebo/MoveIt のための 3D モデリング(7)滑らかなサーフェス – 作成編(その2)」としてサーフェスのプロファイル曲線の制御点や次数を少し意識した滑らかなサーフェスの作成例を紹介しました.

今回は NURBS サーフェスの制御点や次数を編集する作成・調整方法について紹介しつつ,前回の記事中では暫定的にオープンエッジのままとしていた箇所,左の図で赤く示した辺りのサーフェスを作成します.

編集対象となる「サーフェスを抽出(ExtractSrf)」してから洗濯機のソリッドモデルを非表示にしておきます.

前面の上下を接続する大きめのフィレットサーフェスに合わせて新しいサーフェスを作成したいので,既存のフィレットサーフェスを「分割(Split)」して不要部分を削除します.

この際,コマンド内設定で「切断に用いるオブジェクトを選択」に「アイソカーブ(I)」を指定し,洗濯機前面の上下を接続する大きめのフィレットサーフェスの端点にアイソカーブを合わせて分割します.

アイソカーブ(Isocurve)
「アイソカーブ」はサーフェスの UV 各方向に沿った曲線で,サーフェス上の1点における各方向の制御点配置と次数がそのまま反映されます.アイソカーブではないサーフェス上の曲線や分割線は Rhinoceros では 多点3次 の曲線として扱われるため,3次 よりも大きな次数の NURBS サーフェスの場合はそのアイソカーブに比べてアイソカーブではないサーフェス上の曲線は滑らかではない可能性が高いです.よって,サーフェスを分割する場合は可能であればアイソカーブで分割すると,その分割部に接続するサーフェスを作成する際に滑らかなサーフェスを作成しやすくなります.

フィレットサーフェスに隣接する角部の大きい方のサーフェスも同様にアイソカーブで「分割(Split)」します.

新規に作成するサーフェスを既存の洗濯機前面上下間サーフェスに合うものにしたいのでその既存のプロファイル曲線の制御点をサーフェスの1辺の曲線を作成するための参考点とします.

洗濯機前面上下間サーフェスの中心の「アイソカーブを抽出(ExtractIsocurve)」し,抽出したアイソカーブに対して「点を抽出(ExtractPt)」を行い,扱いやすいように「グループ化(Group)」します.

抽出した制御点のグループをブレンド曲線の参考点とするために「配置 > 2点指定(Orient)」で「コピー」を「はい」,「スケール」を「3D」に設定することで作成するサーフェスのレール曲線を作成する部分の各両端にスケールコピーします.

「曲線ブレンド(調整)(BlendCrv)」で各制御点をコピーした点群にスナップすることで曲線を作成します.曲線を作成できたら点群は非表示にするか削除しておきます.

洗濯機側面の平面も暫定的なトリムラインになっているので「境界曲線を複製(DupBorder)」してから「すべてトリム解除(UntrimAll)」を一度して,境界曲線の一部を作成したレール曲線に置き換えて再度「トリム(Trim)」します.

ここの新しいサーフェスは周辺の面構成から判断するに「レールに沿って回転(RailRevolve)」で作成するのが良さそうです.

「レールに沿って回転(RailRevolve)」でのサーフェス作成に必要なデータは「プロファイル曲線」「レール曲線」「回転軸」で,前者2つは既にあり,「回転軸」の方向は Y軸と平行 にするので回転軸の「中心点」1つを準備します.

準備として下の図のように,解析ツールの「半径(Radius)」のコマンド内オプションで「半径カーブを作成(M)=はい」にすると曲率半径に対応した円を作成してくれるのでそれを利用します.そして作成した円の中心点と作成するサーフェスの端点を結んだ線を2つ描画してその交点を「レールに沿って回転(RailRevolve)」の回転軸の1つの「中心点」として軸方向はその中心点から Y方向の1点 を [ Shift ] キーで指定することにします.

準備が整いましたので「レールに沿って回転(RailRevolve)」でサーフェスを作成します.

「輪郭曲線」(プロファイル曲線)と「レール曲線」回転軸の「始点」(交点)と「終点」(交点からY軸と並行方向の1点)を指定します.

「レールに沿って回転」で作成したサーフェスは周辺のサーフェスとの接続および接続条件が確約されたものではないので,作成したサーフェスのエッジで接続先サーフェスがある3辺について接続条件のマッチングを行います.

サーフェスの「マッチング(MatchSrf)」を実行し,コマンド内オプション「複数マッチング(M)」として「m」を設定してから3辺それぞれにおいて「接続させたいエッジ」とその「接続先のサーフェスエッジ」の選択を行います.

( 都合 6回 選択クリック = 3辺 ✕( 接続させるエッジ + 接続先のサーフェスエッジ ) )

  • 連続性: 曲率
  • 一番近い点でエッジをマッチング
  • アイソカーブの方向を維持

サーフェスのマッチングを行ったら他のサーフェスと「結合(Join)」して,まずは「エッジを表示(ShowEdges)」で隙間が無い(=位置連続)ことを確認します.

「マッチング(MatchSrf)」では「曲率連続」までしか合わせないので「曲率変化率連続」については各種「解析」ツールを利用して目視でチェックします.

「ゼブラマッピング(Zebra)」は作成したサーフェスと上下のサーフェスや洗濯機側面の平面ともに縞模様が滑らかにつながっていますので曲率連続から曲率変化率連続ぐらいの連続性であろうと思われます.

ポリサーフェスを「分解(Explode)」して作成したサーフェスだけ「曲率表示オン(CurvatureGraph)」させたのが右の図です.

洗濯機側面の平面(曲率ゼロ)に対して V方向 の曲率が変化率も含めて連続しているように見えます.

右の図は作成したサーフェスに対して「制御点表示オン(PointsOn)」をして洗濯機前方(Rhinoceros での Right ビュー)から見た図です.

洗濯機側面の平面からつながる制御点各4点が洗濯機側面平面と同一平面内にあるので,制御点の配置からも曲率ゼロの平面に曲率変化率連続で接続しているであろうことが見て取れます.

ゼブラマッピングを見ていて今回作成したサーフェスとは別のサーフェスの接続連続性があまり良くない箇所を見つけました.

ゼブラのずれは単に「解析メッシュが粗いことで生じてしまう見かけ上のずれ」の場合もあります. その確認は「ゼブラオプション」内の [ メッシュを調整… ] ボタンから「最大エッジ長さ」を短くしてメッシュを細かくしてゆくことで解消されるような場合は「見かけ上のずれ」と考えられます.

ただ,今回はメッシュを細かくしてもゼブラのずれは解消されませんでした.

筆者の経験では「円弧(Arc)」を分割すると,サーフェスの作成経緯からはゼブラはずれないであろう箇所でゼブラのずれが生じることが多く起きるように感じています.

このフィレットサーフェスはこの後作成するフィレットサーフェスにも影響するのでこの時点で修正しておきます.フィレットサーフェスの U方向 である 3点2次 の円弧を必要な部分だけを 8点7次 の NURBS データに変換してからサーフェスの「マッチング(MatchSrf)」することで曲率変化率接続のサーフェスに修正します.

「マッチング(MatchSrf)」で接続する先のサーフェスの端点からのアイソカーブで「分割(Split)」して必要な部分を残します.

「分割(Split)」を行っただけでは基となるサーフェスの一部となっているだけですので,基となるサーフェスをトリム境界線近くまで縮小するために「トリムサーフェスをシュリンク(ShrinkTrimmedSrf)」を実行します.

そして「次数を変更(ChangeDegree)」で縮小したサーフェスの U方向 の次数を 7 に変更し, V方向 についても指示を問われますがこちらも基と同じ 7 として実行します.これにより U方向 の制御点が次数に合わせて 8 (=次数+1)に変わります.

次数の変更を行ったサーフェスに対して「マッチング(MatchSrf)」を実行して2辺を接続先のサーフェスと曲率連続にします.

「制御点表示オン(PointsOn)」と「曲率表示オン(CurvatureGraph)」により曲率連続にしたサーフェスの曲率接続状況を確認します.

曲率変化率連続は「マッチング(MatchSrf)」では調整されないので,目視確認して修正が必要であれば接続端から4番目の制御点を手動で調整します.

今回は元々のサーフェスが曲率変化率連続接続で作成して変更も主に次数のみの小さなものだったので第4の制御点の調整は必要ありませんでした.

このサーフェスの U方向 の制御点は 8点 なので曲率変化率連続の場合は 4番目の制御点 も 1辺あたり8個 で 両辺で16個 ありますのでざっと各16点について確認します.

このように制御点が多くなると調整作業も多くなってしまうのでサーフェスを作成・修正変更する場合に必要十分な少ない制御点のサーフェスとなるようにすると良いです.

修正前と後のゼブラマッピングをアニメーションで比較してみると改善されているようです.

修正したフィレットサーフェスが良さそうなので Z=350mm でミラーリングして下部のフィレットサーフェスも置き換えておきます.

分析メッシュの消去
Rhinoceros 7 の Mac 版ではあまり気にしたことなかったのですが Windows 版の場合に解析で作成されたメッシュが全て保存されるようになっており 3MB ほどのデータが 6GB ほどのファイルとして保存されて上書き保存も難しい状況に陥ってしまいました.この対策として時々「分析メッシュを消去(ClearAnalysisMeshes)」を行うと再度分析するときには時間がかかりますがファイルサイズを小さくすることができます.

洗濯機前面と側面間に穴として残っているフィレットサーフェスも「レールに沿って回転(RailRevolve)」で作成して「マッチング(MatchSrf)」で修正を行います.

今回の記事はここまでです.


本シリーズ次回の記事は

「Gazebo/MoveIt のための 3D モデリング(9)滑らかなサーフェス – 作成編(その4)」

として,暫定的に隙間を開けてしまっている部分の残り,洗濯機前面・上面・側面が合わさるコーナー部を塞ぐサーフェスの作成例を紹介する予定です.

著者:yamamoto.yosuke

Gazebo/MoveIt のための 3D モデリング(7)滑らかなサーフェス – 作成編(その2)

前回は「Gazebo/MoveIt のための 3D モデリング(6)滑らかなサーフェス – 作成編(その1)」として Rhinoceros のコマンドを利用した滑らかなサーフェスの作成例を紹介しました.

今回は NURBS の次数と制御点を少し意識したサーフェスの作成方法について説明します.

洗濯機両サイドの角部周辺サーフェス

まず,洗濯機両サイドの角部周辺のサーフェスを作成します.

側面視(Rhinoceros の Back ビュー)に線があるのでこれをサーフェスの1辺とします.このサーフェスの1辺に相当する線を「直線(Line)」で描画します.

また洗濯機側面後部の辺を「エッジを複製(DupEdge)」で複製します.

そして「洗濯機側面後部の辺を複製した曲線」の「サーフェスの1辺に相当する線」よりも高い部分を「トリム(Trim)」します.

ブレンド曲線を「曲線ブレンド(調整) (BlendCrv)」で描画します.

  1. 1つ目の接続先に先程トリムした曲線を選択
    • 接続条件: G3(曲率変化率連続)
  2. 2つ目の接続先を BlendCrv コマンド内の設定で「エッジ(E)」に設定してから洗濯機上面後端のエッジを選択
    • エッジ接続の場合は接続条件は「位置連続」になる
    • 描画時にそのエッジ上で制御点を調整可能

ブレンド曲線の描画中にビューを洗濯機正面(Rhinoceros の Right ビュー)に移動して図面上の洗濯機上部角部形状に沿うように制御点の調整をしてからブレンド曲線の描画の確定をします.

結果, 5点4次 の NURBS 曲線になります.

「曲線を押し出し(ExtrudeCrv)」でサーフェスを作成します.

洗濯機上面と側面間のサーフェス作成で使ったプロファイル曲線をコピー移動して洗濯機前面と側面間のサーフェスも作成します.

洗濯機前面は球面サーフェスですので平断面でトリムすると円になりますのでその円の中心を通る Y軸 と平行な軸回りにプロファイル曲線を「回転(Revolve)」します.

洗濯機前面サーフェスをこれまで作成してきた洗濯機ソリッドモデルから「サーフェスを抽出(ExtractSrf)」して新規サーフェスの作成作業を失敗しても元ソリッドに影響がないようにしておき,また洗濯機ソリッドモデルは「非表示」か「ロック」状態にしておきます.

洗濯機前面サーフェスのトリムをします.洗濯機上面と側面間のサーフェスの上端のエッジを「複製(DupEdge)」した曲線で上面視(Top ビュー)でトリムします.

前述のようにここでトリムされた前面サーフェスのエッジは円弧ですので,洗濯機側面視(Rhinoceros の Back ビュー)で Osnap の「中心点」をチェックして「円(Circle)」を描画します.この円弧エッジをクリックすることで中心点を選択してこの円弧の端点をクリックして半径を決定します.

円を描画したら「回転(Revolve)」でサーフェスを作成するプロファイル曲線の配置が容易なのと洗濯機前面付近のみサーフェスを作成したいので,円の中心から水平に直線を描画して円の下半分をトリムします.

円の前端部にサーフェスのプロファイル曲線を配置します.「コピー(Copy)」して「回転(Rotate)」しても良いですし,前回の記事で利用した「3点指定配置(Orient3Pt)」でコピー配置しても良いです.

「回転(Revolve)」を使ってプロファイル曲線を円の中心を通る Y軸 に並行な軸回りに 0° から洗濯機上面より高い位置までサーフェスが作成するよう角度を指定してサーフェスを作成します.

洗濯機前面下部のサーフェスが上部サーフェスを Z=350mm の面で「ミラー(Mirror)」したものであるのと同様に洗濯機前面と側面間のサーフェスもミラー反転するとともに Z=350mm でトリムして「結合(Join)」します.

前回の記事までで作成した洗濯機ソリッドモデルのサーフェスをトリムしたものに置き換えるなどして今回新しく作成したサーフェスと「結合(Join)」したポリサーフェスが右の図です.

結合したポリサーフェスでは「エッジを表示(ShowEdges)」で洗濯機前面・側面・上面の交わる頂点付近に隙間が確認できますが,この箇所は後でフィレットサーフェスを作成して閉じるので,ここでは暫定的に各辺の交点を結んだ直線で洗濯機側面視で両サーフェスをトリムしています.

互いが同じサーフェスに接続する曲率変化率連続のサーフェス同士の場合,サーフェスの交差角度が浅すぎて交わる曲線を Rhinoceros が計算できないことがあります.サーフェスを細分しながら交線を計算させたり,計算できた範囲の交線と大体それらしい曲線を手動で描画したりして閉じたポリサーフェスにすることも可能ですが,今回は最終的には使わないトリムラインですので暫定的にオープンエッジにしています.

曲率変化率連続フィレットサーフェス

前回の記事の四角いボタンのモデリングでは「曲率連続フィレットサーフェス」を作成し,また丸いボタンの角部は「曲率変化率連続曲線」を「回転(Revolve)」して「曲率変化率連続のフィレットサーフェス」を作成しました.

ここでは前回の丸いボタンの方法の応用として「曲率変化率連続曲線」を「曲線を押し出し(ExtrudeCrv)」し,また「制御点を編集した曲率変化率連続曲線」を「回転(Revolve)」して「曲率変化率連続フィレットサーフェス」を作成します.

まずは洗濯機上面と側面コーナー部の間に「曲率変化率連続のフィレットサーフェス」を作成します.先述のコーナー部の大きめのサーフェスと同じように曲率変化率連続のプロファイル曲線を作成して「曲線を押し出し(ExtrudeCrv)」でサーフェスにします.

プロファイル曲線は洗濯機の上面図にフィレットの長辺の線が見られるのでそれを目安にして両端の接続条件「G3(曲率変化率連続)」にて 8点7次 の曲線を描画します.

プロファイル曲線を「曲線を押し出し(ExtrudeCrv)」してフィレットサーフェスを作成します.

次に洗濯機前面と側面コーナー部の間に「曲率変化率連続のフィレットサーフェス」を作成します.これもコーナー部の大きめのサーフェスと同じように曲率変化率連続のプロファイル曲線を作成して「回転(Revolve)」でサーフェスにします.

先程の “洗濯機上面と側面コーナー部の間に「曲率変化率連続のフィレットサーフェス」” のプロファイル曲線をコピー配置します.

洗濯機前面の球面サーフェスに曲率変化率連続で接続するので曲線の修正が必要で,次の図にあるような側面コーナー部形状と洗濯機前面の形状の両方に曲線変化率連続接続するプロファイル曲線にします.

また,修正したプロファイル曲線が元のプロファイル曲線と同じような制御点配置をしていると後の記事で取り上げる両フィレットサーフェス間をつなぐフィレットサーフェスを作成するときに便利なので制御点の Y方向位置 を揃えるようにします.

制御点の Y方向位置 を揃えるための補助線を描画しておきます.

  1. コピー配置したプロファイル曲線を選択後「点を抽出(ExtractPt)」にて制御点を描画
  2. 抽出した制御点群をまとめるために「グループ化(Group / Ctrl-G)」
  3. Y座標の補助線として洗濯機前面形状側から第2,3,4点目から「直線(Line)」を X軸方向 に描画
  4. 描画した3直線をまとめるために「グループ化(Group / Ctrl-G)」

プロファイル曲線の修正の方法は主に2つの方法「再構築的方法」と「修正+調整的方法」があるのではないかと考えています.

8点7次 の曲線のようなブレンド曲線(BlendCrv)の機能に備わっているのと同じ曲線の場合は「再構築的方法」を用いて,曲線の次数+1個よりも多い制御点を持つようなブレンド曲線(BlendCrv)の機能に備わっていない曲線の場合は「修正+調整的方法」を用いると比較的整った曲線ができるのではないかと思います.

  • 再構築的方法
    1. 「曲線ブレンド(調整)(BlendCrv)」で修正元の曲線と同じ接続条件を選択
      (今回は両端とも G3 接続)
    2. 「曲線ブレンド」で描画中に制御点を修正元の曲線の制御点(の抽出点)や
      補助線上に合わせたら描画確定
  • 修正+調整的方法
    1. 曲線を選択して「マッチング(Match)」コマンドを開始して接続先曲線の端点近くをピック
    2. 連続性を「曲率」に設定してマッチングを確定実行
      (Rhinoceros のマッチングの機能として「曲率連続」までしかない)
    3. 修正している曲線の制御点を表示(P-On)と曲率を表示(CurvatureGraph)にする
    4. 曲率変化率連続にしたい場合は曲率表示のグラフを見ながら接続先側から第4の点をガムボールで位置調整
    5. 第2,第3の点も補助線上に来るように調整した場合はそれぞれ接線連続性と曲率連続性も崩れるので本リストの 1. に戻って良好な曲線が得られるまで繰り返す

「修正+調整的方法」はサーフェスのマッチング修正でも同様のことを3次元的に行います.これは次回の記事で紹介する予定ですので,予習的に今回の2次元上での調整方法を体験しておくのも良いかもしれません.

プロファイル曲線ができてしまえば後は洗濯機の上面と側面のコーナー部サーフェスと同じ軸回りの「回転(Revolve)」と「ミラー(Mirror)」を実行して適切にトリム・結合するとフィレットサーフェス作成は終了です.

ここでも暫定的にオープンエッジを残しています.

一部のサーフェスを曲率分析(CurvatureAnalysis)したときのキャプチャ画像が次の図です.

洗濯機前面フィレットサーフェス

洗濯機の前面と上面の間の少し大きめのフィレットサーフェスと洗濯機前面の上下のミラー反転されているサーフェス間の大きめのフィレットサーフェスもこれまで紹介してきた方法と同様に曲率変化率連続のサーフェスとして作成しますので,大まかに紹介します.

フィレットを架けるサーフェスを洗濯機のポリサーフェスから抽出して編集します.

  • 洗濯機の前面と上面の間のサーフェス
    1. 上面図にあるフィレットのエッジと思われる曲線などから判断して,
      上面から 30mm 低い高さを洗濯機前面側のエッジとする
    2. 洗濯機中央(XZ平面)上にプロファイル曲線を側面図と照らし合わせながら
      曲率変化率(G3)連続で描画
    3. 「回転(Revolve)」でサーフェスを作成
  • 洗濯機前面の上下のミラー反転されているサーフェス間のサーフェス
    1. 上下ミラーした高さ Z=350mm から ±50mm の範囲の前面サーフェスをトリム
    2. 同様に洗濯機中央(XZ平面)上にプロファイル曲線を側面図と照らし合わせながら曲率変化率(G3)連続で描画
    3. 「回転(Revolve)」でサーフェスを作成

右の図は洗濯機両サイドのフィレットエッジの Y座標 で新規作成した2つのフィレットサーフェスをトリムして結合したものです.

洗濯機全体のポリサーフェスのうち洗濯機前面と上面のサーフェスをフィレットを追加したポリサーフェスで置き換えて結合して「エッジを表示(ShowEdges)」したのが右の図です.

まだ暫定的に隙間を開けたままにしています.

さらにレンダリング表示をしてキャプチャした画像が右の図です.

だいぶ洗濯機本体の細かいサーフェスも作成できてきたように思います.

今回の記事はここまでです.


本シリーズ次回の記事は

「Gazebo/MoveIt のための 3D モデリング(8)滑らかなサーフェス – 作成編(その3)」

として,今回は暫定的に隙間を開けてしまっている部分を塞ぐサーフェスの作成をする過程で

  • NURBS サーフェスの制御点や次数を直接的に編集するようなケース

について説明する予定です.

著者:yamamoto.yosuke

Gazebo/MoveIt のための 3D モデリング(6)滑らかなサーフェス – 作成編(その1)

前回 「Gazebo/MoveIt のための 3D モデリング(5)滑らかなサーフェス – 知識編」 では 3D モデリングにおける滑らかなサーフェスとは何かについて曲率などの連続性や CAD やサーフェスモデラ内での形状表現のされ方について説明しました.

今回は前回の記事の知識を踏まえて滑らかなサーフェスの作成例について説明します.

滑らかなサーフェスは Gazebo や MoveIt のモデルを作成する場合においてはあまり重要性は高くない… と前回の記事を書いた時点では考えていましたが,今後,Gazebo や MoveIt を走らせる PC の CPU / GPU 性能が向上して細密メッシュモデルを使った精密なシミュレーションへの要求も段々と高くなるかもしれない,とも思いました.

洗濯機前面上部の操作ボタン

サーフェスはモデル内で大きいものから順に作成していった方が全体のバランスを確認しながら作業を進められて修正作業が必要になる量も少なくなるので良いと思います.

ただ,本記事ではまず,Rhinoceros に備わっているコマンド1つほどであまり制御点とか次数とか細かく意識しなくても作成できる曲率連続の滑らかなサーフェスの例として小さいサーフェスの洗濯機前面上部の操作ボタンのモデリングについて説明します.

四角いボタンのモデリング

洗濯機の前面視( Rhinoceros の Right ビュー )で四角いボタンの大きさを見ると大体 20mm 角でした.

ボタンを1つモデリングして,それを洗濯機前面のサーフェス上に8つコピーして配置します.

左の図は四角いボタンのソリッドモデルの作成過程をアニメーション化した画像です.

各手順を以下に順を追って説明します.

20mm の正方形の線を選択して「テーパで平面曲線を押し出し(ExtrudeCrvTapered)」 を実行し,ドラフト角度 15° の設定で 3mm 押し出します.

  • テーパで平面曲線を押し出し
    • メニュー: ソリッド(O) > 平面曲線を押し出し(X) > テーパ(T)
    • コマンド: ExtrudeCrvTapered

四隅を「曲率連続」で丸めるために「エッジをブレンド(BlendEdge)」を実行して四隅のエッジを選択します.

デフォルトでは半径が 1mm となっていてモデリングしたい四隅の半径はもう少し大きいので洗濯機前面図と比較しながら寸法を調整します.

  • エッジをブレンド
    • メニュー: ソリッド(O) > エッジをフィレット(F) > エッジをブレンド(B)
    • コマンド: BlendEdge

「エッジをブレンド」コマンド内の設定を次のようにして

  • ハンドルを連動(L)=はい
  • レールタイプ(R)=レール間の距離(I)

次にコマンド内設定で「全てを設定(T)」で半径(上記設定の場合はレール間の距離)を 8mm にしてコマンドを確定します.

「エッジをブレンド」コマンド内の「レールタイプ」の設定は「レール間の距離」にした場合が比較的綺麗なフィレットがかかるように思っているので設定しました.フィレットをかけるサーフェスの組み合わせによって他の設定の方が良い場合もあるので各モデリング対象にて適宜選択してください.

今度は指で押す面の周囲にブレンドエッジを作成します.「エッジをブレンド(BlendEdge)」コマンドを実行してコマンド内設定 「次の半径(R)」 を 2mm に設定してから該当するエッジをすべて選択して確定・実行します.

下の図は「エッジのブレンド」でフィレットを作成した四角いボタンの平均曲率解析とゼブラ解析の表示結果です.

これらのブレンドエッジは数ミリと小さいので問題にはあまりなりませんが,大きなサーフェスとしてブレンドエッジを作成する場合は応用的に次のリストの項目を調整編集すると良いでしょう.

  • ブレンドエッジ関連で応用的な項目
      • BlendEdge だとフィレット接続する方向は 5次-6点 で「曲率連続」になるが,長手方向は 3次-多点 になってしまいガタつく
        • →「次数を変更(ChangeDegree)」で長手方向の次数を 7次 に変更してサーフェスマッチングを行い再接続する
        • → 制御点が多すぎる場合は RebuildUV コマンドで U方向 のみ制御点を少なくしてリビルドして(この時点ではまだ 3次-多点 ),その後で「次数を変更(ChangeDegree)」で U方向を 7次 に変更してサーフェスマッチング(MatchSurf)
      • テーパ押し出しの基となった正方形も各辺直線ではなく少し外に膨らむ緩い円弧にするとより滑らかな感じになる

四角いボタンのモデルができましたので洗濯機前面のサーフェス上にコピーして配置します.

ボタンの押される方向の軸と洗濯機前面のサーフェスの法線軸を合わせ,かつ上下辺を水平に配置したいので「配置(3点指定)・(Orient3Pt)」を利用してコピーします.「 配置(3点指定)」は下記リストの 3点 を移動元と移動先で指定して配置変換するものです.

  1. 移動原点
  2. 移動原点から第1の方向を決める方向上の点
  3. 移動原点と第1方向点で構成される軸回りの方向を決める点

四角いボタンの移動先とするために配置するサーフェス上の法線方向と接線方向の直線を各配置点で描画します.まず,YZ 平面上に四角いボタンを配置する中心線を描画して,洗濯機前面視(Rinoceros の Right ビュー)にてそれらをサーフェスに「投影(Project)」します.

  • 投影
    • メニュー: 曲線(C) > オブジェクトから曲線を作成(F) > 投影(P)
    • コマンド: Project

「直線(Line)」を実行してコマンド内で「法線(N)」を指定,もしくはメニューから「サーフェス法線(U)」を実行して,サーフェスを選択後,サーフェス上にある投影した中心曲線の交点を選択して法線を描画します.

今回の「配置(3点指定)・(Orient3Pt)」ではスケーリングコピーはしないので長さは適当で大丈夫です.順次各点における法線を描画して合計8軸を準備します.

  • サーフェス法線
    • メニュー: 曲線(C) > 直線(L) > サーフェス法線(U)
    • コマンド: Line → 法線(N) を選択

洗濯機前面の球面サーフェスに食い込む形で四角いボタンを配置したいのでコピー元となる点を 1mm ボタンの高さ方向へ移動しておいてから「配置(3点指定)・(Orient3Pt)」でコピー元,コピー先の各3点を指定してボタンをサーフェス上に配置します.

  • 配置(3点指定)
    • メニュー: 変形(T) > 配置(O) > 3点指定(3)
    • コマンド: Orient3Pt

コピー元の3点指定
コピー先サーフェス上のの3点指定

8つの四角いボタンを洗濯機前面のサーフェス上に配置してゴースト表示とレンダリング表示をしてそれぞれキャプチャしたものが次の2つの画像です.

丸いボタンのモデリング

丸いボタンの直径は大体 50mm ぐらいのようです.

丸いボタンのように軸回転形状のものは回転形状のプロファイル曲線を作成してそれを軸回りに回転してソリッドモデル(閉じたポリサーフェス)とするのが一番簡単だと思います.

丸いボタンモデルの作成自体は上記四角いボタンのように作成しやすい場所で作成して,軸回りの形状は軸対称で同じなのでそれを今度は「配置(2点指定)・(Orient)」でコピー移動して洗濯機上のサーフェスに配置します.

丸いボタンのモデリングと配置の作業手順をまとめると次のようになります.

  1. 回転中心軸を含む平面上に回転形状プロファイル曲線を描画
  2. 回転中心軸回りに「回転(Revolve)」にて1周分のサーフェスを作成
  3. 作成されたサーフェス群を「結合(Join)」してソリッド(閉じたポリサーフェス)にする
  4. 丸ボタンモデルのコピー元原点とコピー先の原点と方向(サーフェス法線方向)を描画
  5. 「配置(2点指定)・(Orient)」でコピー移動

回転方向は曲率一定になるので回転プロファイルの曲線さえ滑らかな曲線を作成すれば回転で作成するポリサーフェスも滑らかになります.そこで丸ボタンの回転プロファイルを次の図のように作成するのですが,ボタンの側面と指で押される面に相当する曲線間に滑らかなフィレット曲線を作成します.

ボタンの側面と指で押される面に相当する両曲線に接する円を描画して円の接する点でトリムするとその間の曲線の接続も比較的バランス良く繋がります.円との接点でトリムされた両曲線間に「接続(BlendCrv)」で曲線を作成します.

  • 接続
    • メニュー: 曲線(C) > 接続(U)
    • コマンド: BlendCrv

「接続(BlendCrv)」内の設定で各接続点における接続条件を設定します.連続性を「曲率」もしくは「G3(曲率変化率)」を設定すると各設定に応じた滑らかな曲線が描画されます.各制御点は [ Shift ] キーを押しながらマウスでドラッグすると対象な点も同時に移動してくれるので便利です.曲線形状や曲率変化を見ながら制御点を調整して意図した形状で確定をします.

回転形状のプロファイル曲線が作成できたら「回転(Revolve)」 で曲線を回転したサーフェスを作成します.

  • 回転
    • メニュー: サーフェス(S) > 回転(V)
    • コマンド: Revolve

1回転分のサーフェスを作成するにはコマンド内で「360度(F)」を指定します.

右の図(ワイヤーフレーム表示)のようなボタン形状のサーフェスが作成されます.

1回転分作成したサーフェスをすべて選択して「結合(Join・Ctrl-J)」してソリッドモデル(閉じたポリサーフェス)にします.

<参考>
Rhinoceros 上では回転形状プロファイル曲線群を先に「結合(Join)」してから「回転(Revolve)」しても同じ形状になるのですが,サーフェスのフィレットのような回り込みの大きい形状と一体化したサーフェスをメッシュ化するときにフィレット形状付近を飛ばして粗いメッシュが作成されてしまうことがあります.フィレット形状部分のサーフェスは一体化したものとせずに別体のものを作成した後「結合(Join)」した方がフィレットサーフェスのエッジがメッシュ境界に反映されるので適切な形状のメッシュ作成のためには良いでしょう.

丸いボタンのソリッドモデルが作成できたら「配置(2点指定)・(Orient)」で洗濯機前面サーフェス上の法線方向に合わせてコピー移動します.先述したように軸回りの形状は軸対称で同じなので位置と方向1つのみの指定の移動変換をします.

四角いボタンと同様に前面サーフェスに少し食い込ませたいので丸いボタンの背面から 1mm 入ったところをコピー原点としてからボタンを押す方向軸上の1点を選択して,コピー先の洗濯機前面サーフェス上の点と法線方向を指定してスケーリングしない設定でコピー移動します.

  • 配置(2点指定)
    • メニュー: 変形(T) > 配置(O) > 2点指定(2)
    • コマンド: Orient

丸いボタンを洗濯機前面サーフェス上に配置したものを四角いボタンと併せて Perspective ビューにゴースト表示させたものが次の図です.

レンダリング表示にしてキャプチャした画像が次の図です.

洗濯機本体とボタン類のソリッドモデルをブーリアン演算して一体化するのは全ての作業の最後で良いので,他のモデリング作業の邪魔にならないようにとりあえず新しいレイヤー buttons(例)を追加してそこに移動しておきます.

今回の記事はここまでです.


本シリーズ次回の記事は引き続き滑らかなサーフェスの作例紹介で

「Gazebo/MoveIt のための 3D モデリング(7)滑らかなサーフェス – 作成編(その2)」

を予定しています.

著者:yamamoto.yosuke

Gazebo/MoveIt のための 3D モデリング(5)滑らかなサーフェス – 知識編

前回 「Gazebo/MoveIt のための 3D モデリング(3)基本形状編 – その2」 では洗濯機の基本的な形状で構成されるサーフェスのモデリングを行いました.

今回は発展的な内容として滑らかなサーフェスのモデリングに向けた予備知識的な内容の説明をします.

ロボットモデルはシミュレータ上で使うために結局メッシュ(ポリゴン)にしてしまうのでシミュレーションなどに利用する 3D モデル作成においては 「滑らかなサーフェス」 である必要性は高くありません.

しかし,モデリング対象の中には滑らかなサーフェスになるように設計されている製品もあります.そのような製品のモデリングの際に対象物の形状が円弧のように見えるけど何か違うので合わなくて悩むようなことがあります.そういったときに円弧などの基本的な形状以外のサーフェスもあることを知っていると,それは厳密には合わないものとして割り切って近似的に円弧などのシンプルな形状としてモデリングするということも適切に判断できると思います.

このようなことから,今回の記事はそういった 「滑らかなサーフェス」 について 「知る」 ことを目的としています.

「滑らか」とは?

「滑らか」 とはは何であるかというと,曲線やサーフェスの位置や接線方向,曲率,曲率の変化率に連続性があるということです.

上の図は 90° の角度をもつ直線間を曲線で接続させたときの連続性の違いによる曲率(黄色カーブ)のグラフ(CurvatureGraph)を表した画像をアニメーション化したものです.
(クリックで拡大)

各接続条件は次のリストのように連続性の条件が加わってゆくように考えてください.
「R形状」は「接線連続」のうち円弧で接続できる特殊なケースと捉えることができます.

  1. 位置連続
  2. 位置連続 + 接線連続
  3. 位置連続 + 接線連続 + 曲率連続
  4. 位置連続 + 接線連続 + 曲率連続 + 曲率変化率連続
  5. 位置連続 + 接線連続 + 曲率連続 + 曲率変化率連続 + 曲率変化率の変化率連続

上の図の接続連続性の異なる曲線を 「押し出し」 してサーフェスを作成してレンダリング表示にしたものが次の図です.

影の付き方が曲率や曲率変化率などの連続条件を加えてゆくと段々と滑らかになるのが見て取れるでしょうか?

サーフェスの曲率を解析して色で表した(CurvatureAnalysis)ものが次の図で,青が曲率が小さく,赤が曲率が大きいコンタ図になっています.

連続性の条件が加わるにつれて接続部周辺の曲率の変化が緩やかになっています.

また,サーフェスの滑らかさを評価するために 「ゼブラ(縞模様・Zebra)」 解析もわかりやすいのでよく利用します.

ゼブラ表示によりサーフェスの連続性がより強調されます.縞模様の通り方の滑らかさがサーフェスの接続性の滑らかさを表しています.サーフェスが滑らかに接続しているかどうかを評価したり,接続を滑らかに修正する際に役立ちます.

本シリーズの記事のモデリング対象として作成した洗濯機モデルの曲率とゼブラを表示したものが次の2つの図です.モデル全体で解析すると解析用のメッシュを細かく出来なくなるので,実際には接続性を評価する面に限って解析用メッシュをなるべく細かくして解析をするようにしています.

「制御点」と「次数」

実際に滑らかなサーフェスをモデリングする場合は,サーフェスが CAD やサーフェスモデラ内部でどのように表現されているかを理解しているとより意図したものに近いサーフェスを作成できるように思います.

Rhinoceros や一般的な CAD などでは曲線やサーフェスは NURBS (Non-Uniform Rational B-Spline/非一様有理Bスプライン) という数学的モデルで表現されています.

NURBS 以外にもサーフェスの 3D 表現モデルとして SubD (Subdivision/細分割曲面) もあります. SubD はコンピュータグラフィックス系の 3D モデリングソフトウェアで利用されていますが,機構設計分野ではあまり使われていませんので本シリーズの記事の対象としません.

NURBS で表現される曲線やサーフェスが何で構成されているかは大まかに述べますと 「制御点」 と 「次数」 です.

上の図は前項目で 90° の角度をもつ直線間を連続性の異なる接続をした曲線がそれぞれどのような 「制御点」 と 「次数」 で表現されているかを示した図をアニメーション化したものです.

NURBS カーブにおいてはその接続における連続性は次のリストにある各数の「制御点」により構成されています.

  1. 位置連続 → 端点の 1 点
  2. 接線連続 → 端点を含めたの 2 点
  3. 曲率連続 → 端点を含めたの 3 点
  4. 曲率変化率連続 → 端点を含めたの 4 点
  5. 曲率変化率の変化率連続 → 端点を含めたの 5 点

「次数(degree)」 は大きな数字になるほど曲線が滑らかになります.

上の図は 90° の角度をもつ直線間を接続した 「制御点:8 次数7 の曲線(曲率変化率連続)」 をあえて 「リビルド(Rebuild)」 して 「制御点:8 次数: 3 の曲線」 にして両端点の曲率を接続先の直線に 「マッチング(Match)」 した曲線の曲率の比較です.同じ制御点数でも次数が低いと曲線内で曲率の変化率の連続性が保てなくなってしまいます.

曲線に設定できる 「次数の最大値」 は 「制御点数 – 1」 です.

両端を曲率連続にするための 「制御点が6個」 の曲線の場合は 「次数の最大値は5次」,両端を曲率変化率連続にするための 「制御点が8個」 の場合は設定できる 「次数の最大値は7次」 になります.

制御点が多いとより細かく曲線やサーフェスの形状の制御が出来ますが,編集が大変だったり,データサイズが大きくなってしまうので,最小の制御点と適切な次数で表現したい形状や滑らかさを規定できるのがベストです.

接続条件は曲線の両端で同じである必要はないので,例えば片方の端は 「位置連続」 にして,もう片方の端は 「曲率変化率連続」 にするということも可能です.この場合の必要最小限の制御点は 「位置連続側: 1点」 と 「曲率変化率連続側: 4点」 と合わせて 「5点」 は必要になります.制御点を 「5点」 とした場合の次数の最大値を採って 「4次」 とするのが良いでしょう.

制御点が少なくて意図する形状が得られないようでしたら適宜制御点を多くして,次数もそれに合わせて大きくすると良いですが,次数の方は最大でも 「7次」 で十分なように筆者は考えています.

サーフェスにおける「制御点」と「次数」

これまで曲線を例に 「制御点」 と 「次数」 について説明してきましたが,サーフェスは曲線の「制御点」と「次数」を2方向に拡張したものです.

サーフェスは 「U方向」 と 「V方向」 の2方向がある 「四角い布」 をベースに,それを伸縮・曲げを行ったり,トリムしてその一部を使ったりするイメージとして捉えることができます.

円錐体のような三角形のサーフェスもありますが 「四角い布」 の特殊例と捉えることができ,同様にUV方向それぞれの要素があります.

次の図は本シリーズでモデリング対象とするために作成した洗濯機モデルのボディの角部のサーフェスの制御点と曲率のグラフを表示したものです.四方にある接続先のサーフェスとそれぞれ(なるべく)曲率変化率まで連続するように作成しました.そのため次数を 7次 とし,制御点を U方向に 15点,V方向に 8点 を持つサーフェスとしました.

  • 図示したサーフェス例の制御点と次数
    • U方向: 制御点 15点 / 次数 7
    • V方向: 制御点 8点 / 次数 7

曲線の連続性と同じように,サーフェスの連続性も各辺毎に作成時設定できるサーフェスもありますし,マッチングの際に異なる設定で各辺で行えば可能ですが,四辺の接続先と矛盾がないようにしないと隙間のないサーフェスにならない可能性もある点が曲線に比べて難しいところです.

どれほど滑らかにする?

さて,ロボットシミュレータのための 3D モデリングにおいてはどれほど滑らかなサーフェスを作成したら良いのでしょうか?

本記事冒頭で述べたように,ロボットモデルはシミュレータ上で使うために結局メッシュ(ポリゴン)にしてしまうのでシミュレーションなどに利用する 3D モデル作成においては 「滑らかなサーフェス」 である必要性は高くありません.

曲率連続や曲率変化率連続のサーフェスでモデリングしてメッシュ化してもそのような連続性に近い状態を維持しようとするとメッシュが細かくなりデータが重くなります.ただ,そのロボットシミュレーションをデモンストレーションやプレゼンテーションで綺麗に見せたく,少しメッシュデータが重くても良いような場合はなるべく滑らかなサーフェスをモデリングすることもあるように思います.

また,メッシュのデータ量の他にモデル作成の手間も考えておくべきでしょう.

下のリストにサーフェスの連続性の違いをまとめました.技術的なロボットシミュレーションが目的であれば 接線連続 までとしてモデリング時間を省くのも1つの方法です.大きな面はメッシュで形状が潰れてしまわないので 曲率連続 や 曲率変化率連続 まで考慮したモデルとして,小さな面はメッシュ形状に埋もれてしまうので R形状 や 接線連続 としてメリハリをつけるのも良いでしょう.

Rhinoceros では「曲率連続」までは標準の機能として普通に利用できるのでロボットシミュレータのための 3D モデリングでも用いるのはそんなに手間のかかることではないように思います.

  1. 位置連続
    • 面取り形状など
    • 機械設計的
  2. R形状
    • 隅R・角Rや.前回の記事で作成したフィレットのロフトなどが例
    • フライスや旋盤で機械加工された対象物のモデリングには必須
    • 機械設計的
  3. 接線連続
    • ロボット 3D モデリングの自由曲面では多く使う場合が多いか?
  4. 曲率連続
    • 滑らかに見えるサーフェス
    • デザイン的
    • 使っている CAD やサーフェイスモデラで機能的に簡単に作成できるようだったら用いてみるのもあり
    • Rhinoceros では
      • 標準で曲率連続にサーフェフをマッチング修正する機能がある
  5. 曲率変化率連続
    • より滑らかに見えるサーフェス
    • ロボット 3D モデリングでは知識として持っていたら十分
    • 使えると造形できるものが増える
    • デザイン的
    • Rhinoceros では
      • 「作成時」に曲率変化率連続性のある曲線・サーフェスを作成する機能はある
      • 「修正時」は曲率連続マッチング機能を利用した後に,加えて曲率目視で4番目の制御各点を手動調整する必要があるので手間
        • (この曲率変化率連続マッチングを行う Plug-in があれば筆者にも教えて欲しい!)
  6. 曲率変化率の変化率連続
    • Rhinoceros では
      • 「作成時」に曲率変化率の変化率連続性のある曲線・サーフェスを作成する機能はある
      • 「修正時」に曲率目視で5番目の制御点まで手動調整するのは難しいか?

今回の記事はここまでです.

大体どのような滑らかさのサーフェスの種類があって,CAD やサーフェスモデラでそれを作成するために必要な条件や作成の手間のイメージが伝わっていると良いのですが.


本シリーズ次回の記事は

「Gazebo/MoveIt のための 3D モデリング(6)滑らかなサーフェス – 作成編」

を予定しています.

著者:yamamoto.yosuke

Gazebo/MoveIt のための 3D モデリング(4)基本形状編 – その2

前回 「Gazebo/MoveIt のための 3D モデリング(3)基本形状編 – その1」 で Box 形状や球面で洗濯機の大きな面のモデリングを行いました.

今回はその続きで,洗濯機の背面や底部のモデリングを行います.

今回のゴールは左の図の状態です.

ボディ背部のモデリング

ボディ背面の突出形状部の最後部から 40mm の幅がありますので,洗濯機の主要形状部をその分トリムします.(前回 Box 形状の Scale1D を前後方向に行わずにガムボール移動などで World 座標系で X の正方向に 40mm 移動した場合はこの手順は不要)

洗濯機の側面視で最背部から垂直な直線を描画して,前方向に 40mm 移動させ,この直線を使ってボディをトリム(Trim)します.

Perspective ビューでトリムされたボディのエッジ分析(ShowEdges)をすると次の左の図のようになります.

このような開口部エッジが同一平面内にあって閉曲線になっている場合は平面で塞ぐ 「キャップ(Cap)」 を実行できます.

  • キャップ
    • メニュー: ソリッド(O) > キャップ(H)
    • コマンド: Cap

「キャップ」の実行結果

同一平面内にある閉エッジ

次は背部に突出している形状を作成します.

背部の台形状の輪郭を描画します.上面視(Top ビュー)で座標 (-320,0) から水平の直線(Line)を後部に向かって描画して,その直線からオフセット(Offset)で オプション Both(B) で両サイドへのオフセット線をオフセット量 260[mm] = 520mm/2 で描画します.メインボディ最後部のエッジと 260mm オフセットした両直線の交点を中心に回転(Rotate)で 45°,-45° を指定して回転させて上面図画像の輪郭に合うことを確認します.

  • 回転
    • メニュー: 変形(T) > 回転(R)
    • コマンド: Rotate

また直線(Line)を座標 (-360,0) から「両方向(B)」を指定して洗濯機の幅方向に描画します.

描画した3つの直線の台形での不要部分を互いにトリムします.

Perspective ビューに移って台形の開いている部分を直線で接続して結合(Join)して曲線を閉じます.閉じた曲線を洗濯機の高さ方向(Z方向)に +90mm ガムボールで移動させます.

背面部の基礎となる 3D 形状をソリッドの「垂直に押し出し」で作成します.とりあえず上面高さまで押し出しします.

  • 垂直に押し出し
    • メニュー: ソリッド(O) → 平面曲線を押し出し(X) → 直線(S)
    • コマンド: ExtrudeCrv

洗濯機の側面視(Back ビュー)にて洗濯機背部形状の上端に相当する斜めの直線を描画して先程「押し出し」したソリッドを トリム(Trim) して キャップ(Cap) で閉じます.

洗濯機背面部上面でトリムしたモデル(キャップの前の段階)

三面図から読み取れる形状としてはここまでなのですが,洗濯機背部は角部や隅部に 「R形状」 や 「フィレット」 と言われる形状がつけられていることが多いです.

今回は三面図から 「R形状」 の寸法は読み取れないので,それを想像して寸法を決めて 「ロフトサーフェス(Loft)」 で作成します.

ロフトサーフェスは曲線と曲線の間にサーフェスを作ります.ロフトサーフェスの基となる曲線を 「フィレット(Fillet)」 で描画します.

  • フィレット
    • メニュー: 曲線(C) → フィレット(F)
    • コマンド: Fillet

フィレットの半径は最後部の平面上の方に 40mm メインボディとつながる平面上の方に 80mm のフィレットをかけるとバランスの良さそうなロフトサーフェスになるかと思います.

  • ロフト
    • メニュー: サーフェス(S) > ロフト(L)
    • コマンド: Loft

洗濯機背部上方のコーナー部にロフトでフィレットサーフェスが作成できたら ミラー(Mirror) でX軸対称に反転コピーします.そしてミラーリングして左右2つになったフィレットで洗濯機背部のソリッドモデルを トリム(Trim) します.

2つのフィレットとそれらでトリムされた背部ポリサーフェスを 結合(Join) すると1つのソリッド(閉じたポリサーフェス)になります.

洗濯機のメインのボディと背部の2つのソリッドモデルは互いに接し合っているので2つのソリッドの 「和の演算(BooleanUnion)」 を行って1つのソリッドモデルにします.

  • 和の演算
    • メニュー: ソリッド(O) > 和(N)
    • コマンド: BooleanUnion

1つのソリッドになるので,くどいようですが ShowEdges で 「閉じたポリサーフェス(=ソリッド)」 であることを都度確認すると良いでしょう.

ボディ底部のモデリング

Gazebo や MoveIt のモデルとしては洗濯機底部はロボットとインタラクションすることはあまりないと思いますので大体の雰囲気をモデリングできれば十分です.

洗濯機の足部は三面図だけではなくカタログ画像からも少し形状が分かるので三面図と併せて参考にしてモデリングします.

カタログ画像や3面図から,足部はテーパのかかった円錐台形状であろうと思われます.

側面視や前面視からそれぞれの足の中心座標を推定し,下面と上面の直径はそれぞれ 50[mm] と 54[mm] ぐらいと当たりをつけて円を描画してロフトとキャップを組み合わせてソリッドモデルを作成します.

洗濯機底部の足以外のサーフェスのモデリングの大まかな様子は次の GIF アニメーションのような感じです.モデリングの履歴(ヒストリー)を使わないモデリングなので作成手順はやり易い順番で大丈夫です.またサーフェスの作成方法も1通りしかないのではなく,例えば 「ロフト (Loft)」 でフィレット形状を作成する代わりに 「サーフェス > フィレット(FilletSrf)」 や 「エッジをフィレット(FilletEdge)」 ,「回転(Revolve)」 を使ったりすることもできます.

これまで取り上げていない機能で利用したのは 「曲線を押し出し(ExtrudeCrv)」 と 「円柱(Cylinder)」 の機能です.

  • 曲線を押し出し
    • メニュー: サーフェス(S) > 曲線を押し出し(X) > 直線(S)
    • コマンド: ExtrudeCrv
  • 円柱
    • メニュー: ソリッド(O) > 円柱(Y)
    • コマンド: Cylinder

今回は洗濯機ボディの背部や底部のモデリング方法を紹介して,次のモデルとなり本記事のゴールに到着しました.

基本形状編はひとまず今回の記事までです.

本シリーズ次回の記事は 「Gazebo/MoveIt のための 3D モデリング(5) 滑らかなサーフェス – 知識編」 を予定しています.

著者:yamamoto.yosuke

Gazebo/MoveIt のための 3D モデリング(3)基本形状編 – その1

前回の Gazebo/MoveIt のための 3D モデリング(2)準備編 で右の図のように三面図を空間上に配置してモデリングの準備を行いました.

今回から実際のモデリング方法の紹介を行います.今回のゴールは基本的な形状で構成された次の図の状態です.

直方体と球面でモデリングします.

レイヤ03 を model という名前にしてこのレイヤ内でモデルを作成します.

レイヤ model をダブルクリックするとチェックマークが model レイヤに付いて編集対象のレイヤになります.

直方体

三面図を見るとボディの上面や側面,1段上がった底面,背面から1つ前方の面は平面で構成されているようです.(筆者が基のモデルを作成しているので自作自演なのですが…)

直方体を描画してそれらのサーフェスとします.

まず,準備で描画した outline のボックスを利用して直方体を描画するために Osnap の「端点」のチェックを入れておきます.

直方体は Box コマンドかメニューから ソリッド(O) > 直方体(B) > 2コーナー,高さ指定(C) を選択して描画します.

outline の底面の対角点の2点と高さとして上面のいずれかの角の点を順次クリックすると右の図のように直方体が描画できます.

次に,1方向のみのスケーリング Scale1D( 変形(T) > スケール(S) > 1Dスケール(1) )を使ってボディの底面の位置と奥行方向の2つの寸法調整をします.

底面の位置は Scale1D で上面位置を基準として変形を行います.

奥行方向の寸法調整は後で前面のサーフェスを作成してそれでトリムをしたいので少し前に出しておきます.もしくは背面の突出している部分の基となる面がが 40mm 分前に来るのでガムボール移動で X方向 に 40mm 移動するようにしても大丈夫です.

前面のサーフェス(球面)

洗濯機前面の主なサーフェスは球面ぽい感じがします.(自作自演ですが…)

まずは球面の半径を推定します.

洗濯機の側面視,Rhinoceros での Back ビューにて外形カーブに沿って3点指定の円を描画しておおよその半径を見てみます.

3点指定の円はメニューからは 曲線(C) > 円(C) > 3点指定(3) で実行し,コマンドでは Circle を実行してから 3点(O) を指定します.アイコンからは円形状から3点付いた円を選択します.

洗濯機前面の側面視への投影輪郭線上の3点を指定して円を描画します.

次に描画した円の半径を調べます.メニューからは 解析(A) > 半径(R) を選択し,コマンドの場合は Radius を入力して描画した円を選択します.その結果,先程描画した円の半径は「5182.7590331 ミリメートル」と解析されました.

切りの良い数字で半径は 5000mm ぐらいかな?と当たりをつけて球を描画してみます.

描画した円を削除します.

先程と同じメニュー・コマンドの「3点指定の円」を利用しますが今度は投影輪郭線上の2点と半径 5000mm を指定して描画します.

描画した半径 5000mm の円の中心から半径 5000mm の球を作成します.Osnap の「中心点」にチェックを入れます.球を作成するにはコマンドでは Sphere,メニューからは ソリッド(S) > 球(S)です.球の中心に円の中心を選択して半径 5000mm を指定して球を作成します.

このように側面視では半径 5000mm の球であるとみなしましたが,他の投影図で見ても洗濯機前面のサーフェスとしてこの半径 5000mm の球面が妥当であるか? を見てみます.

上面視(Rhinoceros の Top ビュー)から見ても半径 5000mm から作られる形状が三面図と整合するかを確認します.

作成した球を上面の高さでトリムします.上面高さで水平な直線を描画してそれを用いてトリムします.

側面視で Line コマンドかメニュー 曲線(C) > 直線(L) > 線 もしくはアイコン選択で直線描画を開始し,Osnap の「端点」にチェックが入っている状態で上面の1つの頂点を選択して Shift キーを押しながら水平に直線を描画します.

トリムに用いる直線を選択した状態でキーボードショートカット Ctrl+T を選択するとトリムコマンドが開始されますのでトリム対象として球のサーフェスを選択します.この時トリム設定として ( 切断線を延長(E)=はい 仮想交差(A)=はい ) として実行します.

  • トリム
    • キーボードショートカット: Ctrl+T
    • コマンド: Trim
    • メニュー: 編集(E) > トリム(M)

次の図は洗濯機の上面高さでトリムした球面サーフェスの上端エッジの円とその上端エッジを曲線として複製( DupEdge )してその曲線を洗濯機の上面図上の曲線とほぼ重なる場所にオフセット( Offset )させた比較です.

  1. DupEdge : メニューからは 曲線(C) > オブジェクトから曲線を作成(F) > エッジを複製(E)
  2. Offset : メニューからは 曲線(C) > オフセット(O) > 曲線をオフセット(O)
    • → コマンド内の指定で 通過点指定(T)

(画像クリックで拡大) オフセットさせた曲線は洗濯機上面図の曲線と比べて少し半径の大きい円のようですので,実際の洗濯機の前面の球面の半径は 5000mm よりも小さい可能性が高いです.

洗濯機前面を球面とした場合は 5000mm では少し半径が大きいようですので,半径 4000mm の球面として半径 5000mm で行ったのと同じように描画して評価する手順を再び行います.

  1. 側面視で洗濯機前面の投影輪郭線上の2点と半径 4000mm を指定して円を描画
  2. 描画した半径 4000mm の円の中心に半径 4000mm の球を作成
  3. 半径 4000mm の球面を洗濯機上面の高さでトリム
  4. 上面視でトリムした球面エッジからオフセットカーブを洗濯機上面図の曲線にほぼ一致する位置に描画
  5. オフセットカーブの曲率などから妥当なサーフェスか否かを判断

洗濯機前面サーフェスを半径 4000mm の球面とした場合の洗濯機上面図とトリムされた球面エッジを比較したのが次の図です.

画像では「上端エッジからオフセットした曲線(円)」が黄色になっているので少し見づらいかもしれませんが洗濯機の上面図内の曲線と一致しているように見えます.(画像クリックで拡大) このことより洗濯機前面のサーフェスを半径 4000mm の球面としたのはおおよそ妥当だと判断しました.

Perspective ビューで少し広めにモデリング空間を表示させたのが次の図です.ボックスと上面高さでトリムされた球面が見えています.

側面視で描画した円は オブジェクトを非表示( メニュー: 編集(E) > 表示(V) > 非表示(H) / コマンド: Hide ) にしてしまっても良いかもしれません.

球面とボックスを互いにトリムして洗濯機のボディ形状に近づけます.

ボックスを球面サーフェスでトリム

球面サーフェスをボックスでトリム

互いに完全に交差した球面サーフェスと Box サーフェスを互いにトリムしたので両者間に隙間はないはずです.ただ,これらは結合(Join)して一体化していないので,状態としては隙間なく互いにただ並べられている状態,英語では Watertight(水密)などと言われる状態です.
それを確認するために解析ツールで「エッジを表示」してみます.

  • エッジを表示
    • メニュー: 解析(A) > エッジツール(E) > エッジを表示(E)
    • コマンド: ShowEdges

エッジ分析の小ウィンドウが表示されたらその中の 表示 – オープンエッジ(N) を選択します.
トリムされた球面サーフェスと Box サーフェスの境界部分が明るい紫からピンクのような色で表示されると思います.

トリムした球面サーフェスと Box サーフェスを結合(Join)してオブジェクトとして1体化ます.両方のサーフェスを選択してから結合を実行します.

  • 結合
    • メニュー: 編集(E) > 結合(J)
    • コマンド: Join
    • キーボードショートカット: Ctrl+J

結合したら再び「エッジを表示」を実行してオープンエッジがないかを確認します.
オープンエッジがなかったら次のようなエッジ分析の結果が出るかと思います.

合計??個のエッジ.オープンエッジ,非多様体エッジはありません.

これは 「閉じたポリサーフェス」 や 「ソリッド」 と呼ばれるモデルの状態を意味します.

今後「ソリッドモデル」や「閉じたポリサーフェス」であるはずのモデルを作った場合は都度確認するようにしましょう.都度確認しないで何かのはずみで僅かな隙間が残っているまま作業を進めてしまうと後々にサーフェスが閉じなくなり多くの作業をやり直さないとならなくなってしまうことがあります.

  • Tips
    • 「ソリッドモデル(閉じたポリサーフェス)」 モデルにしておくと Gazebo や MoveIt だけではなく有限要素解析による応力計算や数値流体解析などにも応用することができます.

次に前面下部のサーフェスも似たような面であろうと目論んで,側面視(Rhinoceros の Back ビュー)で半径 4000mm の円を描画してみると,大体 Z=350mm ぐらいの平面で上下反転しているように見えます.

球面サーフェスを反転コピーするために先程結合したソリッド(閉じたポリサーフェス)モデルから 「サーフェスを抽出」 して球面サーフェスを分離します.

  • サーフェスの抽出
    • メニュー: ソリッド(O) > サーフェスを抽出(A)
    • コマンド: ExtractSrf

球面サーフェスを反転コピーするために側面視(Rhinoceros の Back ビュー)で直線(Line)を座標 (0,350) から水平に引きます.

前面の球面サーフェスを選択してミラー変形で反転コピーします.

  • ミラー
    • メニュー: 変形(T) > ミラー(I)
    • コマンド: Mirror

座標 (0,350) から水平に引いた線の両端を順に選択して反転させます.

座標 (0,350) から水平に引いた線で不要になる球面サーフェスをトリムし,またミラーコピーした球面サーフェスの Box サーフェスからはみ出る部分や Box サーフェスのはみ出る部分を球面サーフェスでトリムします.

これらのトリムされた上下の球面サーフェスと Box サーフェスを結合(Join)すると次のようなソリッド(閉じたポリサーフェス)モデルになり,記事の冒頭で述べたゴールに辿り着きました.

次回は, 「3D モデリング(4)基本形状編 – その2」 として洗濯機の背面や底部の形状のモデリングを説明する予定です.

著者:yamamoto.yosuke

Gazebo/MoveIt のための 3D モデリング(2)準備編

今回の記事のゴールは右の図のようにモデリングに必要な情報を Rhinoceros 上に表示することです.

筆者はこの作業を「召喚の儀式」と勝手に呼んでいます.召喚の儀式を行っても勝手にモデルが湧き出てくるわけではないのですが,このようにすることで効率的にモデリングができると考えています.

作業の流れは次のようになっています.

  1. カタログ → 各投影図の画像
  2. Rhinoceros 上に外形寸法大の直方体を描く
  3. 各投影図画像を空間上に配置

1. カタログ → 各投影図の画像

まず,カタログの PDF ファイルから寸法図の各投影を画像として切り取ります.カタログが紙面の場合はスキャナで画像として取り込むと良いでしょう.

本例では右の図をクリックするとサンプルカタログ画像が表示されるのでそれを使ってください.また同じサンプルカタログの PDF ファイルは下記リンク先にあります.

正面図 左側面図 上面図

Windows の場合は一例として次のように PDF ファイルから投影図を画像として保存します.

  1. PDF ファイルを「Acrobat Reader」で表示
  2. 画像保存したい部分を拡大して
  3. Win+PrintScreen キーで画面をクリップボードにコピー
  4. ペイントを開いて「貼り付け」
  5. 必要部分を選択してトリミング

Mac の場合は同様のことを次のように行います.

  1. PDF ファイルを「プレビュー」アプリで開く
  2. PNG 画像でエクスポート
  3. 2. で保存した PNG 画像ファイルを「プレビュー」で開く
  4. 「プレビュー」でトリミング編集して各投影図としてそれぞれ保存

2. Rhinoceros 上に外形寸法大の直方体を描く

各投影図の画像を Rhinoceros の空間上に配置する前に画像のサイズ調整やモデリングしながら大きさの確認をするなどの目的のためモデリング対象の外形寸法を反映した線画(ワイヤーフレーム)の直方体を描画します.

Rhinoceros を起動します.起動時に表示されるテンプレートの Small Millimeters か Large Millimeters を開きます.

Rhinoceros の設定変更は必須ではないですが,洗濯機のような大きさの対象物の場合は次のようにしておくのをお奨めします.設定変更はメニューバーの ファイル(F) → プロパティ(R)… を選択して小ウィンドウ「ドキュメントのプロパティ」内で行います.

  • グリッド
    • グリッドのプロパティ
      • グリッド線数(E): 200
      • 細グリッド線間隔(G): 10.0 ミリメートル
      • 太グリッド線間隔(M): 10 本(細グリッド線)
    • グリッドスナップ
      • スナップ間隔(S): 0.5 ミリメートル
  • 単位
    • 単位と許容差
      • 絶対許容差(T): 0.001 単位
      • 角度許容差(A): 0.01 度
    • 距離表示
      • 距離の精度(E): 1.0000

それでは Rhinoceros 空間内にモデルの外形寸法に対応したワイヤーフレームボックスを描画します.

分かりやすいように「レイヤ 01」の名前を本記事では「outline」に変更します.レイヤ名は何でも良いです.

  • 「レイヤ 01」上で右クリック → レイヤ名を変更
    • もしくはレイヤ名上でダブルクリック

そして outline レイヤ名の少し右をクリックしてチェックマークを入れて編集対象にします.

カタログの3面図を見ると洗濯機のボディの高さが 1050 [mm],主な幅が 640 [mm],奥行きが 720 [mm] とあります.

またロボットの座標構成は一般的には次のようになっています.

  • ロボットの一般的な座標構成
    • X 正方向 : 前
    • Y 正方向 : 左
    • Z  正方向 : 上

なお,Rhinoceros はどのような分野の座標系を採用しているのか分かりませんがビューの名前とロボットの一般的な座標構成による前後・左右が異なっているので,それはそれとしてビューの名前は気にしないこととします.

このように製品の外形寸法やロボットの一般的な座標構成をふまえて,最初に XY 平面上に原点を重心とする X方向 740 [mm] Y方向 640 [mm] の長方形を描きます.

  1. Top ビューを選択
  2. 曲線(C) → 長方形(G) → 中心,コーナー指定(N)
  3. 「長方形の中心: 」に 0,0 を入力して Enter キーを押す
  4. 長方形の X 方向の長さ(=奥行き)の 720 を入力して Enter キーを押す
  5. 長方形の Y 方向の長さ(=幅)の 640 を入力して Enter キーを押す

次に XY 平面上に描いた長方形を洗濯機の上面に相当する上方に 1050 [mm] コピー移動させます.このような単純な移動は Rhinoceros の「ガムボール」を利用すると良いでしょう.Rhinoceros ウィンドウ内の下の少し右の方に「ガムボール」ボタンがあるのでクリックして有効にします.

  1. Perspective ビューを選択
  2. XY 平面上に描画した長方形をクリックして選択(選択されるとガムボールも表示される)
  3. コピー移動するために Alt キーを押しながら Z 軸(青)をクリック
  4. テキストボックスが表示されるので移動量 1050 を入力して Enter

ガムボールを用いた移動は Ctrl や Alt キーを組み合わせることで次のように働きます.

  • ガムボールの要素をクリックのみ → 選択オブジェクトの移動
  • Alt キー + ガムボールの要素をクリック → 選択オブジェクトのコピー移動
  • Ctrl キー + ガムボールの要素をクリック → 選択オブジェクトのガムボールのみ移動

また,ガムボール以外のコピー移動の方法としてメニューバーの 変形(T) → コピー(C) もしくはコピーのコマンド入力「Copy」もあります.この場合は移動する始点と終点の座標を順次入力してコピー移動させます.

あとは2つの長方形の各頂点間に直線を描画して線で構成された直方体にします.

次の図のようにオブジェクトスナップ Osnap をオンにして端点にスナップするようにチェックを入れると描画時に端点にスナップして正確に描画することができます.

直線コマンドはメニューバーからは 曲線(C) → 直線(L) → 線 で,コマンド入力では Line で実行できます.
(画像をクリックすると大きな画像として表示されます.)

線で構成された直方体が描画できたらそれをグループ化しておきます.全体を選択してメニューバーからは 編集(E) → グループ(G) → グループ化(G) で,コマンド入力では Group で,キーボードショートカットでは CtrL + G でグループ化できます.

後で各投影図画像を配置する時に補助線を描き加えますが,とりあえず outline レイヤーは編集終了ということでロックします.

現在編集中のレイヤはロックできないので「レイヤ 02」を次の各投影図画像を貼り付けるためのレイヤーとして名前を「drawings」などに変更して,drawings レイヤのチェックマーク列をクリックして編集レイヤを変更します.その後で outline レイヤの鍵マークをクリックして南京錠が掛かったアイコンに変更するとレイヤーがロックされます.

 

3. 各投影図画像を空間上に配置

本記事冒頭の「召喚の儀式」の図で示したように Rhinoceros では空間上に画像ファイルを平面として配置することができます.

まず,正面の投影図の画像を配置してみます.

Rhinoceros のビュー名の設定は一般的なロボット座標系の投影面名と異なるので,ロボット座標系から考えると「正面図」は YZ平面(とその平行面)なので,Rhinoceros では Right ビューに相当します. ビューの下にある Right タブを選択したり,Perspective などのビュー左上のビュー名をダブルクリックするなどして4ビュー画面にしてからビュー名 Right をダブルクリックして Right ビュー1つの表示にします.

ビュー左上のビュー名 Right をダブルクリックして全体に表示します.

画像はメニューバーから サーフェス(S) → 平面(P) → ピクチャー(E)  を選択すると「ビッマップを開く」子ウィンドウが開くので正面図の画像ファイルを選択して開きます.

すると「ピクチャーの1つ目のコーナー」を指定するよう言われるので,位置やスケールは後から outline レイヤの直方体に合わせるので,ここでは適当にクリックして指定します.次に「もう一方のコーナーまたは長さ」を指定するように言われるので,Ctrl キーを押しながらマウスを動かすと画像の縦横比を保持したままもう一方の頂点の座標が変化しますのでここでも先ずは適当にクリックしてピクチャーを配置します.

画像の位置とスケールを合わせてゆきます.

まずはコーナー位置を合わせます.正面図のピクチャオブジェクトを選択してオブジェクトを直接ドラッグしたりガムボールを使って移動させ,右の図の例では洗濯機の正面図の右下コーナーを外形の直方体の角に合わせています.画像ファイルなので線はある程度ドット幅を持っていると思いますが,outline レイヤの外形の直方体の線と画像上の線の大体の中心が合うようにします.

次は画像のスケールを outline レイヤの外形の直方体の大きさに合わせます.スケールはまず縦横2方向同時スケールの操作をします.縦横どちらで合わせても良いですが寸法が長い方が相対的に精度がでやすいので縦方向で合わせます.メニューバーからは 変形(T) → スケール(S) → 2Dスケール(2) ,コマンドでは Scale2D で実行します.

  1. 正面図のピクチャを選択,他はスケールしないので選択終了
  2. 正面図右下コーナーをスケールする原点に指定(レイヤーにロックが掛かっていてもオブジェクトスナップはできる)
  3. スケールする元の方向と長さを指定するために,Shift を押しながらマウスを動かすとポインタがスケール原点から縦もしくは横に動きが限定されるので,Shift キーを押しながら正面図ピクチャの上辺付近をクリックして指定
  4. 正面図ピクチャの上辺が outline レイヤの外形直方体の上辺に一致するようにしてクリックでスケール決定

画像ファイルはドット絵(ラスターデータ)であることや,カタログの印刷とスキャンや PDF 化の過程で図形としての縦横比が必ずしも保たれているわけではありません.そのため先ほど 2D スケールを行って縦方向のスケールは合ったものの横方向を確認してみると少しずれているようなことが結構あります.その場合は1方向のみの Scale1D コマンド(メニューバーなどからも選択可能)で横方向のみスケール調整します.

このように位置とスケールを合わせるのですが1回でバシッと綺麗に決まらないことがままあるので何回か「位置」「スケール」を繰り返して調整します.

配置した正面図ピクチャーをビューを Perspective に変更して見てみると,おそらく YZ 平面上にあると思います.この場所だとこれから 3D モデルを作るスペースのド真ん中にあり邪魔になるので X 軸方向に -1500[mm] ぐらい移動させておきます.

あとは同様にして「左側面図」と「上面図」の画像を Rhinoceros 上のピクチャとして配置します.

「左側面図」は一般的なロボット座標系では XZ平面 を Y軸 のプラス方向からマイナス方向へ見ることになります.この視点は Rhinoceros の設定では Back ビューに相当します.Rhinoceros のデフォルトでは Front ビューが最初のセット内に設定されていると思いますのでこれを Back ビューにします.ビュー内左上のビュー名右隣にある ▼(逆三角形)マーク → ビューの設定(V) → Back(A) で変更します.

今回の作例用に用意した「左側面図」には最も外側の寸法だけではなく洗濯機の設置検討に参考にする寸法を入れてあります.外寸のスケール調整をした後に寸法の数値から拾った線を outline レイヤーに加えて寸法補助線と重なるかを見て,スケールが合っているか?,位置が合っているか?など確認できます.今回は洗濯機の設置脚が付いている下部ボディの前端の寸法の数値を拾うと最後部から前方に 605[mm] ( = 550 + 55 )の位置だということが分かりますのでそこに線を引き該当する寸法補助線と重なるかを確認しました.

最初の各投影図をレイアウトする時点で間違ったまま進めてしまうとているとそのあとモデリングしたものが使えないものになってしまう可能性があるので注意してください.

他のヒストリータイプの CAD では遡って修正することも可能ですが,時として修正可能なパラメータから外れてモデルが成立しなくなる可能性も無きにしもあらずなのでまず最初の段階で寸法等確認しながら先に進むことをお薦めします.

Rhinoceros ではオブジェクトの位置や距離を確認するにはメニューバーの 解析(A) → 点(P)距離(D) で確認しながら進めると良いでしょう.

「上面図」は Rhinoceros でも Top ビューですので X方向,Y方向 を間違わずに配置すれば問題ないと思います.

さてこれで本記事の最初に述べました「召喚の儀式」が整いました.

おそらく本記事の読者に召喚術を使える「魔術師」や「陰陽師」の方はそう多くはないと思いますので,次回の記事からは今回準備した「召喚の儀式」の情報を基に地道に Rhinoceros 上で 3D モデリングを行う方法をご紹介したいと思います.


<追記:つづきの記事>

著者:yamamoto.yosuke

Gazebo/MoveIt のための 3D モデリング(1)はじめに

ROS で Gazebo や MoveIt を利用してシミュレーションや動作計画を行うときに既存のモデルも多くあり重宝しますが,それだけでなくて実際の製品の形状でシミュレートしたいと思う場面もあるかと思います.

モデリング対象物の実物があれば 3D スキャンすることもあるでしょうがメッシュを整える手間があったり,実物がない場合もあります.

そこで本シリーズでは複数回の記事に分けてカタログにある図面から 3D モデリングを行って Gazebo / MoveIt で利用できるようにするにはどのようにするのかの例をご紹介します.

モデリング作業のゴールとなる Gazebo と MoveIt のモデルに必要なデータを次の表にまとめます.

Gazebo モデル MoveIt モデル
モデルファイル URDF or SDF ファイル URDF ファイル
チュートリアル

最終的に必要になる URDF ファイルや SDF ファイルは XML データのファイルですのでテキストエディタなどで編集します.

URDF と SDF に内包するのに利用可能な 3D モデルデータを次の表に示します.

SDF ファイル URDF ファイル
モデルファイル STL ファイル Collada or STL ファイル
表示用メッシュ
  • 色毎の STL メッシュファイル
  • メッシュは開いていても良い
  • Collada (*.dae) モデルファイル
  • STL メッシュファイルも可
干渉用メッシュ
  • 干渉範囲を定義する閉メッシュ STL メッシュファイル
  • 干渉チェックに問題ない範囲であれば表示用メッシュよりも粗くしてデータを軽くすると良い
  • 干渉範囲を定義する閉メッシュ Collada (*.dae) モデルファイルもしくは STL メッシュファイル
  • データ量的に重くなければ表示用メッシュをそのまま使っても良い

それぞれ画面表示用とロボットリンク干渉チェック用のデータは別々に設定されるので必要に応じてメッシュの粗密を調整します.SDF ファイルの表示用メッシュは Collada (*.dae) フォーマットも使えるのですが色情報が表示に反映されないのでここでは色ごとに分けた STL フォーマットファイルを作ります.

全体の作業と記事の流れは次のようになります.

  1. 全体の工程(本記事)
  2. カタログ図面のキャプチャとモデリング空間への配置
  3. 基本的な形状の作成
  4. なめらかなサーフェスの作成(オプション)
  5. MoveIt モデルの作成
  6. Gazebo モデルの作成

今回のモデリング例の対象物は多くの製品でカタログに寸法図が掲載されている洗濯機としました.

意匠権や著作権などの侵害がないように本記事の作例用に予めドラム式洗濯機モデルを作成してそれから寸法図を含む模擬的なカタログの PDF ファイルを作成しました.

  • 注) 読者の皆さんも実在する製品・商品をモデリングして公開する際には意匠権や著作権などの侵害が無いようにしてください.

このカタログの図面を元にレンダリング図も参考にしながらモデリングします.本記事筆者が対象モデルを作りカタログ化して再びモデリングするということで自作自演になってしまいますが,モデリングの流れや方法をお伝えするためと思ってご容赦ください.

本シリーズの記事では 3D モデル作成ソフトウェアは Rhinoceros 7 を用いています.Rhinoceros は CAD ソフトウェアの1つと言えますが,どちらかと言うとサーフェスモデラに近いと思います.各機能自体は読者が使っている CAD と共通点があると思いますのでコマンド等それぞれ置き換えて読んでいただけるとありがたいです.

参考のため比較的安いもしくは無料で入門的にも利用可能な CAD を次の表に示します.

Rhinoceros 7 Fusion 360 FreeCAD
URL https://www.rhino3d.co.jp/ https://www.autodesk.co.jp/products/fusion-360/ https://www.freecadweb.org/
商業利用 158,400円 61,600円/年 無料
教育利用 39,600円 1年間無償 無料
モデリング 非パラメトリック*注 パラメトリック パラメトリック
  • 注) ヒストリーや Grasshopper,Rhino-Python でパラメトリックモデリングも可能

モデリングでは下記リストのような色々なサーフェス要素の作成方法を説明する予定です.

  • 基本的な 3D 形状(平面・円筒・球など)
  • 各種フィレット
    • 接線連続の単純Rフィレット(機械設計様形状)
    • 曲率連続フィレット
    • 曲率変化率連続フィレット
  • 自由形状サーフェス

このうち曲率連続や曲率変化率連続のサーフェスは Gazebo や MoveIt で利用する場合は結局メッシュデータ( STLメッシュ / Collada も内部ではメッシュ )になってしまうので必須ではないですが参考までに紹介します.

本シリーズ,次回はモデリングの準備編です.

著者:yamamoto.yosuke

トランジスタ技術 2020年9月号 の ROS 入門の記事を執筆しました

トランジスタ技術 2020年9月号https://toragi.cqpub.co.jp/tabid/918/Default.aspx )の ROS 入門の記事を執筆しましたのでご紹介します.

東京オープンソースロボティクス協会は次の章を執筆しました.

(各章リンク先にサンプル PDF ファイルがあります)

これらの章では TORK の ROS ワークショップなどでつまづきやすかった点を踏まえて,次の内容をなるべく分かりやすく書いたつもりです.

  • ROS の概要や使うメリット
  • ROS の学習入門時のパソコンの選定
  • ROS を実行する Ubuntu Linux OS のパソコンへのインストール
  • ROS やロボットシミュレータのインストール方法とその利用
  • ROS のロボット動作計画・実行プログラムの実行や改造

続きを読む

著者:yamamoto.yosuke

パソコン1台で出来るロボットの学習素材集

ROS(ロス/Robot Operating System)の学習は実際にロボットがなくてもロボットのシミュレータが入手できるのでネットワークにつながるパソコンが1台あればできますので結構自習に向いています.この記事では ROS の学習を始める,進めるにあたり必要な情報がある Web へのリンクを中心に紹介します.

大まかに言うと次のインストールを行えば ROS の学習をスタートすることができます.

  • パソコンにオペレーティングシステムの Ubuntu Linux をインストール
  • Ubuntu Linux に ROS をインストール
  • ROS 上で動くロボットソフトウェアのインストール
    • → 紹介 ROS チュートリアル内にて

ROS と Ubuntu Linux のバージョンは後述する ROS 学習のチュートリアルが現時点では ROS Kinetic というバージョンを基本としているので下記の組み合わせをお勧めします.

  • Ubuntu 16.04
  • ROS Kinetic

ROS Melodic は ROS Kinetic と基本的な操作のほとんどは変わらないので ROS Kinetic で学習してから ROS Melodic に移行しても難なく可能です.

 

パソコンへの Ubuntu Linux のインストール

パソコンはどのようなものを使えば良いのか?については下記記事を参考にしてください.

ROS 導入ノートパソコン比較調査

ROS 導入ノートパソコン比較調査

最新高性能パソコンよりも数年型落ちや廉価の機種のほうが Ubuntu Linux をインストールしやすい傾向にあるように思います.

 

Ubuntu Linux への ROS のインストール

下記リンク先に各 ROS のバージョンにおけるインストール手順が書かれています.

また,Ubuntu のバージョンと ROS のバージョンには1対1の対応関係があるので組み合わせを気をつける必要があります.

 

ROS のチュートリアル

各チュートリアルを進めるとそれらの中で ROS シミュレータなどのインストールも行います.

TORK MoveIt チュートリアル

ROS の入門には TORK MoveIt チュートリアルをお薦めします.MoveIt は ROS のマニピュレーションロボット動作計画ソフトウェアです.このチュートリアルでは数種のロボットの ROS シミュレータのインストールや基本的な操作,プログラムでのロボット操作を学習することができます.TORK MoveIt チュートリアルではプログラミング言語に Python を用いていますが,プログラミングの経験がほとんどない人にもプログラムによるロボット操作の体験と学習ができるように構成しています.

ROS を初めて使う方に TORK MoveIt チュートリアルを学習したときのレポートも下記の記事に書いてもらっています.学習過程でいろいろと疑問をもった点などの体験を書いてもらいましたので参考にしてみてください.

初めてのROS(ROSチュートリアルを使って)

 

ROS-Industrial トレーニング(日本語版)

より発展的な ROS プログラミングを学習したい場合は ROS-Industrial トレーニングを行ってみるのも良いでしょう.この教材で取り上げられているプログラミング言語は主に C++ と Python です.C++ によるロボット制御や画像処理,3D ポイントクラウド処理などとそれらの組み合わせのプログラムの学習ができます.

ROS-Industrialのトレーニング教材を日本語訳しました!

 

ROS で質問したいことが出てきたら

ROS Discourse やチュートリアル,パッケージの GitHub Issues に質問を投稿してみてください.

 

入門的な実機マニピュレーションロボット

1台のパソコンだけ,シミュレータだけでなく入門的な実機マニピュレータを利用してみたいと思った方は入門的なマニピュレーションロボット2例の導入検証を行った記事を参考にしてみてください.

ROS 入門向けマニピュレータ導入検証

著者:yamamoto.yosuke

ROS 入門向けマニピュレータ導入検証

ROS やその MoveIt の学習を始めたい,もしくは Gazebo などのシミュレータでの実行はできたので,実際のロボットも動かしてみたい!と思っている方もいらっしゃるのではないでしょうか.

また,Ubuntu ROS をインストールする PC はどのようなものにしたら良いのか?というご質問と同じように,マニピュレータを ROS で動かす学習をしたいが実際にどのようなロボットを導入したら良いのか?といったご質問を TORK にいただくことがあります.

そこで,価格なども含めて比較的入手性の良さそうな次の2種のマニピュレーションロボットを購入して ROS や MoveIt で利用した場合について調査・検証しました.

  • uArm Swift Pro
  • Open Manipulator X
uArm Swift Pro Open Manipulator X
販売価格 ¥99,000.- ¥272,800.-
納期 数日 2〜7週間
腕部自由度 3 DOF 4 DOF
PC 接続 micro USB-B micro USB-B
外観

 

各マニピュレータ ROS 対応情報

uArm Swift Pro

Open Manipulator X

ROS での導入方法

uArm Swift Pro

GitHub ページ SwiftAndProForROS https://github.com/uArm-Developer/RosForSwiftAndSwiftPro のトップページにある README.md に従ってダウンロードとインストールを行いました.

まず前提としてロボットに接続する側の PC に  Ubuntu と ROS がインストールされている必要があります.ROS のインストールは下記サイトを参考に行うことができます.

README.md にはおおまかにしか書いていないように思えたので,補足的に書き加えると次のようになります.

$ sudo apt-get install git ros-kinetic-serial
$ mkdir -p ~/catkin_ws/src  #既にワークスペースがあるならそちらを使ってもOK
$ cd ~/catkin_ws/src
$ catkin_init_workspace
$ git clone https://github.com/uArm-Developer/RosForSwiftAndSwiftPro.git
$ cd ~/catkin_ws
$ rosdep install --from-paths src --ignore-src -r -y
$ catkin_make
$ source ~/catkin_ws/devel/setup.bash

ここでは Ubuntu 16.04 + ROS kinetic のケースを書いていますが Ubuntu 18.04 + ROS melodic でも下記の kinetic のところを melodic にしてインストール・実行できました.

「 2. Set up enviroment 」は手順通りに ROS 環境がターミナルに反映されるための設定を行いました.ROS melodic の場合もインストールに関するコマンドの kinetic を melodic に変更することでインストールでき,今回の記事の範囲の動作を確認しました.

Open Manipulator X

eマニュアルが充実しているので下記 URL の手順に沿ってインストール作業を進めました.

こちらも ROS melodic の場合もインストールに関するコマンドの kinetic を melodic に変更することでインストールでき,今回の記事の範囲の動作を確認しています.

eマニュアルの手順に従い,Arduino IDE でポートの設定なども行いました.

MoveIt GUI でのマニピュレーション操作

uArm Swift Pro と Open Manipulator X を ROS の MoveIt の GUI(グラフィカル・ユーザ・インタフェース)から動かした手順を中心に報告します.

uArm Swift Pro

まずは uArm Swift Pro の電源投入と PC との接続を行います.

  1. uArm Swift Pro に ACアダプター電源を接続して電源を入れる
  2. USB ケーブルで uArm Swift Pro と Ubuntu PC を接続する

次にターミナルを2つ開いて,1つ目のターミナルでは uArm Swift Pro への接続と制御を実行します.

ターミナル1

$ sudo chmod 666 /dev/ttyACM0
$ roslaunch swiftpro pro_control.launch

2つ目のターミナルでは MoveIt を実行します.

ターミナル2

$ roslaunch pro_moveit_config demo.launch

腕自由度が 3 自由度しかないため MoveIt 上の空間の 6 自由度(XYZ, RPY)でインタラクティブマーカを動かそうとすると上手く動かせません.”Allow Approx IK Solutions” のチェックを入れるとロボットの自由度・可動範囲内でインタラクティブマーカの厳密ではないものの最適解が計算されるので比較的楽にインタラクティブマーカを動かすことができます.

  • Allow Approx IK Solutions のチェックを入れる

インタラクティブマーカを動かして目標姿勢を定めてから [ Plan and Execute ] ボタンを押します.

必須ではないですが MoveIt の表示上調整すると良かった項目を挙げます.

  • Displays → MotionPlanning
    • Planning Request → Interactive Marker Size : 0.1
    • Planned Path → Loop Animation : オフ

問題もありました.MoveIt に表示される uArm Swift Pro のロボットモデルがパラレルリンク分の運動学計算がされていないような状態と正常に計算されたような状態を交互に繰り返していました.この件は GitHub Issue – Missing robot joints としても報告されているようですが改善はされていないようです.

MoveIt やコントローラを終了するには各ターミナルで Ctrl+C を入力することで終了します.

uArm Swift Pro は動作時の剛性感が高いように思いました.ステッピングモータでガッチリと固定されているような印象を受けました.ただ MoveIt から制御した動作はカタカタカタとしていました.これはロボット側のファームウェアを更新したらカタカタの度合いが少し細かくなりましたがまだ残っています.uArm Swift Pro を uArm Studio から動かすと動きがスムーズだったので ROS や MoveIt と uArm Swift Pro のインタフェース部分に詰めきれていない部分があるように感じました.

Open Manipulator X

Gazebo Simulation

まずは Gazebo シミュレータが用意されているので Gazebo 上の Open Manipulator X を MoveIt から動かしてみました.

ターミナルを2つ開いて,1つ目のターミナルでは Open Manipulator X の Gazebo シミュレータを起動します.

ターミナル1

$ roslaunch open_manipulator_gazebo open_manipulator_gazebo.launch

正常に実行されると次の画像のような Gazebo のウィンドウが表示されます.ここで一番下段の部分にある ▶ ボタンをクリックしてシミュレータを走らせます.

次にコントローラと MoveIt を起動します.

ターミナル2

$ roslaunch open_manipulator_controller open_manipulator_controller.launch use_moveit:=true use_platform:=false

空間6自由度に対して腕部自由度が4自由度と少ないので Allow Approx IK Solutions のチェックを入れると楽にインタラクティブマーカを動かすことができます.

インタラクティブマーカを動かして目標姿勢を定めてから [ Plan and Execute ] ボタンを押します.

実機動作

次に Open Manipulator X の実機ロボットを MoveIt GUI から動かしてみました.

今回は Ubuntu PC と Open Manipulator X を OpenCR 回路を経由して接続しました.接続方法は下記ページに説明があります.

http://emanual.robotis.com/docs/en/platform/openmanipulator_x/ros_setup/#opencr

  1. Open Manipulator X から出ているケーブルを OpenCR ボードに差し込む
  2. AC アダプタからの直流電源を OpenCR ボードに接続
  3. USB ケーブルで Ubuntu PC と OpenCR ボードを接続
  4. OpenCR ボードの電源を入れる

ターミナルを1つ開いてコントローラと MoveIt を起動します.

ターミナル1

$ roslaunch open_manipulator_controller open_manipulator_controller.launch dynamixel_usb_port:=/dev/ttyACM0 use_moveit:=true

Gazebo シミュレーションのときと同様に “Allow Approx IK Solutions” のチェックを入れます.

インタラクティブマーカを動かして目標姿勢を定めてから [ Plan and Execute ] ボタンを押すと,Gazebo シミュレータで行ったときと同じように実機ロボットを操作できました.

MoveIt Commander でのマニピュレーション動作

MoveIt の GUI 経由で uArm Swift Pro と Open Manipulator X を操作することができました.次の段階としてプログラムから MoveIt を操作してロボットを動かしてみました.

GUI からではなくプログラムからロボットを操作できることで,例えば画像処理から得られた座標をもとににマニピュレータを動かすといった応用につながります.

プログラムから MoveIt を動かすには MoveIt Commander を利用します.MoveIt Commander には C++ や Python のインタフェースが用意されていますので,今回は Python にてプログラムを作成して各ロボットを動作させました.

uArm Swift Pro

MoveIt の GUI にあった “Allow Approx IK Solutions” にチェックを入れた場合と同様の動作指令を出せる MoveIt Commander の機能が set_joint_value_target() メソッドです.一般的には set_joint_value_target() メソッドには各関節の目標角度を引数として渡すことがまず説明されるかと思いますが,第1引数に Pose 型か PoseStamped 型のデータを第2引数に True (=近似解=Approximate / デフォルトは False =厳密解)を渡すことでマニピュレータの自由度が少ないことにより厳密解が得られない状態を近似解を用いることで回避します.

なお,6自由度以上を有するマニピュレータでは一般的に set_pose_target() に Pose 型か PoseStamped 型のデータを渡して厳密解をもって動作させますので,そのようなマニピュレータのプログラムを応用する場合には注意が必要です.

今回作成したテストプログラムを以下に記します.

uArm Swift Pro – MoveIt Commander テストプログラム

#!/usr/bin/env python

import sys, math, copy
import rospy, tf, geometry_msgs.msg

from moveit_commander import MoveGroupCommander, RobotCommander
from geometry_msgs.msg import Pose, PoseStamped

if __name__ == '__main__':
    
    node_name = "commander_example"
    rospy.init_node( node_name, anonymous=True )
    
    group = MoveGroupCommander("arm")
    
    group.set_planning_time( 600.0 )
    
    # Getting Initial Pose & RPY
    pose_init = group.get_current_pose()
    rospy.loginfo( "Get Initial Pose\n{}".format( pose_init ) )
    rpy_init  = group.get_current_rpy()
    rospy.loginfo( "Get Initial RPY:{}".format( rpy_init ) )
    
    # Pose 1
    rospy.loginfo( "Starting Pose 1")
    group.set_start_state_to_current_state()
    
    pose_target_1 = Pose()
    pose_target_1.position.x =  0.20
    pose_target_1.position.y =  0.00
    pose_target_1.position.z =  0.15
    pose_target_1.orientation.x =  0.0
    pose_target_1.orientation.y =  0.0
    pose_target_1.orientation.z =  0.0
    pose_target_1.orientation.w =  1.0
    
    group.set_joint_value_target( pose_target_1, True )
    group.go()
    
    rospy.sleep(5.0)
    pose_current = group.get_current_pose()
    rospy.loginfo( "Get Current Pose:\n{}\n".format( pose_current ) )
    
    # Pose 2
    rospy.loginfo( "Starting Pose 2" )
    
    pose_target_2 = Pose()
    pose_target_2.position.x =  0.15
    pose_target_2.position.y =  0.15
    pose_target_2.position.z =  0.10
    pose_target_2.orientation.x =  0.0
    pose_target_2.orientation.y =  0.0
    pose_target_2.orientation.z =  0.3826834
    pose_target_2.orientation.w =  0.9238795
    
    group.set_joint_value_target( pose_target_2, True )
    group.go()
    
    rospy.sleep(5.0)
    pose_current = group.get_current_pose()
    rospy.loginfo( "Get Current Pose:\n{}\n".format( pose_current ) )
    
    # Pose 2 Z:+0.05[m]
    rospy.loginfo( "Starting Pose 2 Z:+0.05[m]")
    pose_target_2.position.z += 0.05
    
    group.set_joint_value_target( pose_target_2, True )
    group.go()
    
    rospy.sleep(5.0)
    pose_current = group.get_current_pose()
    rospy.loginfo( "Get Current Pose:\n{}\n".format( pose_current ) )
    
    # Back to Initial Pose
    rospy.loginfo( "Back to Initial Pose")
    group.set_joint_value_target( pose_init, True )
    group.go()
    
    rospy.sleep(5.0)
    pose_current = group.get_current_pose()
    rospy.loginfo( "Get Current Pose:\n{}\n".format( pose_current ) )

基本的な流れとしては Pose 型のインスタンス pose_target_1 などに位置・姿勢のデータを代入して group.set_joint_value_target( pose_target_1, True )で目標をセットし,group.go() で実行しています.

プログラムの実行方法は前述の MoveIt GUI でロボットが動作する状態にしてからもう1つターミナルを開いてテストプログラムを実行します.今回はテストプログラムのファイルを ~/catkin_ws/src/pro_moveit_config/script/uarm-sp_moveit_tutorial_poses.py としましたので,次のようにターミナルで実行しました.

$ rosrun pro_moveit_config uarm-sp_moveit_tutorial_poses

MoveIt Commander プログラムで uArm Swift Pro を動作せたときの動画です.

Open Manipulator X

Open Manipulator X のテストプログラムも基本は uArm Swift Pro と同様に set_joint_value_target( Pose, True ) を利用して作成しました.

追加的に Open Manipulator X の運動学上の「厳密解」の位置・姿勢データを予め計算しておいて set_pose_target() に与えたときの動作の様子もテストしました.

今回作成したテストプログラムを以下に記します.

uArm Swift Pro – MoveIt Commander テストプログラム

#!/usr/bin/env python

import sys, math, copy
import rospy, tf, geometry_msgs.msg

from moveit_commander import MoveGroupCommander, RobotCommander
from geometry_msgs.msg import Pose, PoseStamped

if __name__ == '__main__':
    
    node_name = "commander_example"
    rospy.init_node( node_name, anonymous=True )
    
    group = MoveGroupCommander("arm")
    
    group.set_planning_time( 600.0 )
    
    # Getting Initial Pose & RPY
    pose_init = group.get_current_pose()
    rospy.loginfo( "Get Initial Pose\n{}".format( pose_init ) )
    rpy_init  = group.get_current_rpy()
    rospy.loginfo( "Get Initial RPY:{}".format( rpy_init ) )
    
    # Pose 1
    rospy.loginfo( "Starting Pose 1")
    pose_target_1 =  [ 0.12, 0.0, 0.1, 0.0, math.pi/2.0, 0.0 ] # [ x, y, z, r, p, y ]
    group.set_pose_target( pose_target_1 )
    group.go()
    
    rospy.sleep(5.0)
    pose_current = group.get_current_pose()
    rospy.loginfo( "Get Current Pose:\n{}\n".format( pose_current ) )
    
    # Pose 2
    rospy.loginfo( "Starting Pose 2")
    group.set_pose_target( [ 0.2, 0.0, 0.2, 0.0, 0.0, 0.0 ] )
    group.go()
    
    rospy.sleep(5.0)
    pose_current = group.get_current_pose()
    rospy.loginfo( "Get Current Pose:\n{}\n".format( pose_current ) )
    
    # Pose 3
    rospy.loginfo( "Starting Pose 3")
    
    pose_target_3 = Pose()
    pose_target_3.position.x =  0.10
    pose_target_3.position.y =  0.10
    pose_target_3.position.z =  0.10
    pose_target_3.orientation.x = -0.2706
    pose_target_3.orientation.y =  0.6533
    pose_target_3.orientation.z =  0.2706
    pose_target_3.orientation.w =  0.6533
    
    group.set_joint_value_target( pose_target_3, True )
    group.go()
    
    rospy.sleep(5.0)
    pose_current = group.get_current_pose()
    rospy.loginfo( "Get Current Pose:\n{}\n".format( pose_current ) )
    
    # Pose 3 Z:-0.05[m]
    rospy.loginfo( "Starting Pose 3 Z:-0.05[m]")
    pose_target_3.position.z -= 0.05
    
    group.set_joint_value_target( pose_target_3, True )
    group.go()
    
    rospy.sleep(5.0)
    pose_current = group.get_current_pose()
    rospy.loginfo( "Get Current Pose:\n{}\n".format( pose_current ) )
    
    # Pose 4
    rospy.loginfo( "Starting Pose 4")
    
    pose_target_4 = Pose()
    pose_target_4.position.x =  0.10
    pose_target_4.position.y = -0.10
    pose_target_4.position.z =  0.05
    pose_target_4.orientation.x =  0.2706
    pose_target_4.orientation.y =  0.6533
    pose_target_4.orientation.z = -0.2706
    pose_target_4.orientation.w =  0.6533
    
    group.set_joint_value_target( pose_target_4, True )
    group.go()
    
    rospy.sleep(5.0)
    pose_current = group.get_current_pose()
    rospy.loginfo( "Get Current Pose:\n{}\n".format( pose_current ) )
    
    # Pose 4 Z:+0.05[m]
    rospy.loginfo( "Starting Pose 4 Z:+0.05[m]")
    pose_target_4.position.z += 0.05
    
    group.set_joint_value_target( pose_target_4, True )
    group.go()
    
    rospy.sleep(5.0)
    pose_current = group.get_current_pose()
    rospy.loginfo( "Get Current Pose:\n{}\n".format( pose_current ) )
    
    # Back to Initial Pose
    rospy.loginfo( "Back to Initial Pose")
    group.set_joint_value_target( pose_init, True )
    group.go()
    
    rospy.sleep(5.0)
    pose_current = group.get_current_pose()
    rospy.loginfo( "Get Current Pose:\n{}\n".format( pose_current ) )

このテストプログラムのうち # Pose 1 と # Pose 2 の部分は set_pose_target() で目標姿勢を設定しています.このようにXZ平面上に位置する点の厳密解を指定した場合は set_pose_target() でも動作しましたが,# Pose 3 や # Pose 4 のようにXZ平面から外れたところは set_joint_value_target( Pose, True ) を利用しないと動作しませんでした.

プログラムの実行方法は前述の MoveIt GUI でロボットが動作する状態にしてからもう1つターミナルを開いてテストプログラムを実行します.今回はテストプログラムのファイルを ~/catkin_ws/src/pro_moveit_config/script/openmanipulatorx_moveit_tutorial_poses.py としましたので,次のようにターミナルで実行しました.

$ rosrun open_manipulator_moveit openmanipulatorx_moveit_tutorial_poses.py

Open Manipulator X を MoveIt Commander から動作させたときの動画です.

まとめ

今回 ROS の入門向けを念頭に2つのマニピュレータを導入し調査・検証しました.その結果を以下にまとめます.

  • 自由度が 6DOF 未満であることによる影響
    • MoveIt (GUI) では  “Allow Approx IK Solutions” のチェックを入れる必要あり
    • MoveIt Commander では目標姿勢のセットに set_joint_value_target() を使う必要あり
  • uArm Swift Pro に関して
    • ROS・MoveIt 対応パッケージの更新は滞っているように思える
      • MoveIt モデルの不備
      • MoveIt からの動作がカタカタする(遅い制御周期?)
    • ユーザ対応やユーザ間交流は ROS も含めてフォーラムで行われているよう
    • ロボット-PC 間が USB ケーブル1本で接続ができ簡単
    • Open Manipulator X に比べたら安価
  • Open Manipulator X に関して
    • eマニュアルが充実
    • Gazebo シミュレータあり
    • グリッパ付属
    • ロボット-PC 間に OpenCR ボードを挟み,そのポート設定も必要
      • OpenCR を使いこなせば拡張性が高い
    • uArm Swift Pro に比べたら高価

 総評

今回の2台のマニピュレータであれば Open Manipulator X の方が提供されている情報も多く,予算的に許されるのであれば入門に適していると思いました.

 

著者:yamamoto.yosuke

ROS 導入ノートパソコン比較調査

TORK の ROS ワークショップを受講された方などから ROS を使用するにあたりどのような PC を利用したら良いかを問い合わせいただくことがあります.

基本的には利用したい ROS の各バージョンに対応した Ubuntu のバージョンが動作可能な PC であれば良いのですが,スペックが多岐にわたるパソコンの数々からどのようなパソコンを選んだら良いのか迷ってしまいます.

  • ROS Kinetic → Ubuntu 16.04 が動作可能な PC
  • ROS Melodic → Ubuntu 18.04 が動作可能な PC

そこで ROS を導入するパソコンの選定の参考なるよう,4つの異なる特徴のノートパソコンに実際に Ubuntu と ROS を導入して,その導入のポイントや動作結果を報告したいと思います.

  1. 10万円未満 モバイルノートパソコン : Dell Inspiron 13 5390
  2. 軽量モバイルノートパソコン : Dell XPS 13 7390
  3. モバイルワークステーション : Lenovo ThinkPad X1 Extreme 2nd Gen
  4. 2018年モデルモバイルノートパソコン : Lenovo ThinkPad T480s (既存品)

各ノートパソコン主要スペック

各ノートパソコンの主要なスペックは以下のとおりです.

Inspiron 13 5390 XPS 13 7390 ThinkPad X1 Extreme 2nd ThinkPad T480s
CPU Core i5-8265U Core i7-10710U Core i9-9880H Core i7-8550U
Threads / Cores 8 / 4 12 / 6 16 / 8  8/ 4
iGPU Intel UHD 620 Intel UHD 630 Intel UHD 630 Intel UHD 620
dGPU NVIDIA GeForce GTX 1650 Max-Q NVIDIA GeForce MX150
メモリ 8 GB 16 GB 32 GB 16 GB
SSD 256GB 512 GB 512GB + 1.0 TB 512 GB
ディスプレイサイズ 13.3″ IPS 13.3″ IPS 15.6″ IPS 13.3″ IPS
ディスプレイ解像度 1920 x 1080 3840 x 2160 (4K) 1920 x 1080 1920 x 1080
ディスプレイその他 グレア グレア・タッチ ノングレア ノングレア・タッチ
WiFi チップ Intel AC 9462 Intel AX200 Intel AX200 Intel AC 8265
電源 独自規格 USB-C 独自規格 USB-C
販売年 2019 2019 2019 2018
購入先 Amazon.co.jp Dell Lenovo
税込価格 ¥89,609.- ¥235,499.- ¥400,928.-
納期 即納 即納 約3週間
外観

Ubuntu Certified hardware

ROS / Ubuntu の導入機種を選ぶにあたって Ubuntu Certified hardware という Web ページが参考になります.

Ubuntu Certified hardware で今回の各ノートパソコンの対応状況を調べた結果が次の通りです.

これらのノートパソコンに限れば,2018 年の日付があるものは Ubuntu 16.04 に対応していて,2019 年の日付があるものは Ubuntu 18.04 に対応していると記載されています.

次項目で記述しますが対応が非明記のバージョンの Ubuntu をインストールしても問題なく動作する組み合わせもあります. Ubuntu Cetrified hardware を参考にしつつ,各ノートパソコンで使用されている各種チップの Linux デバイスドライバの対応状況等ふまえて導入を検討するのが良さそうです.

Ubuntu のインストール手順

Ubuntu はバージョン 16.04 と 18.04 をそれぞれのノートパソコンにインストールを試みました.各ノートパソコンに購入時にインストールされている Windows 10 を残したまま Ubuntu も起動できるように SSD にパーティションを切ってインストールすることとしました.

Ubuntu のインストール手順は Dell と Lenovo のノートパソコンで BIOS の設定方法が少し違うので分けて説明したいと思います.

なお,本記事では必要な手順の項目を中心にお伝えします.実際に PC に Ubuntu をインストールする際には具体的な方法を十分調査の上作業を行ってください.

Dell ノートPCへの Ubuntu のインストール手順

後述する Lenovo ThinkPad への Ubuntu のインストールと比べて BIOS の設定変更に関する手順が多くなっています.

  • Windows で記憶デバイスのパーティションを切って Ubuntu をインストールするディスク領域を確保
  • BIOS(UEFI) の設定変更
    • Secure Boot を OFF にする = USB メモリからのブートを可能にする
    • SATA Operation を RAID から ACHI モードに変更 = Linux ディスクにアクセスできるようにする
    • RAID モード(デフォルト)の状態で Windows を通常起動
    • 管理者権限でコマンドプロンプトを起動しbcdedit /set {current} safeboot minimal を実行
    • PC の再起動
    • PC 再起動時の Dell ロゴ画面にて F2 を押して BIOS(UEFI) 設定に入る
    • System Configuration の SATA Operation を RAID から ACHI に変更
    • APPLY CHANGES で設定変更を反映させてから EXIT にて再起動
    • Windows 10 のセーフモードの起動
    • 管理者権限でコマンドプロンプトを起動して bcdedit /deletevalue {current} safeboot を実行
  • Ubuntu Linux のインストール
    • Ubuntu インストーラの入っている USB メモリを PC に接続
    • PC の起動
    • PC 再起動時の Dell ロゴ画面にて F12 を押して One-Time Boot Settings に入る
    • Ubuntu インストーラの入っている USB メモリを選択して起動
    • Ubuntu のインストールの実行
  • デバイスドライバのアップデート・インストール
    • インターネットに接続した状態で Ubuntu のソフトウェアのアップデートを行う
    • XPX 13 7390
      • Ubuntu 18.04 には Dell からデバイスドライバが用意されているのでダウンロードしてインストールする
      • Ubuntu 16.04 にはデバイスドライが対応していない
        • ディスプレイのスケーリングができない = 文字が小さすぎて見えない
        • WiFi チップの Intel AX200 がドライバ対応されていない
          • USB 接続の有線 Ethenet なら利用可能

インストールにあたっては次のサイトを参考にしました.

Lenovo ThinkPad ノートPCへの Ubuntu のインストール手順

  • Windows で記憶デバイスのパーティションを切って Ubuntu をインストールするディスク領域を確保
  • BIOS の設定変更
    • 起動時 Lenovo ロゴ画面で Enter を押した後にメニューに従って F1 で BIOS Setup Utility に入る
    • Security Chip の無効化
    • Secure Boot の無効化
  • Ubuntu のインストール
    • Ubuntu インストーラの入っている USB メモリを PC に接続
    • PC の起動
    • 起動時 Lenovo ロゴ画面で Enter を押したあとにメニューに従って F12 で choose a temporary startup device を選択
    • Ubuntu インストーラの入っている USB メモリを選択して起動
    • Ubuntu のインストールの実行
  • デバイスドライバのアップデート・インストール
    • インターネットに接続した状態で Ubuntu のソフトウェアのアップデートを行う
    • NVIDIA GeForce ドライバの適用
      • グラフィックドライバのリポジトリの追加
        • sudo add-apt-repository ppa:graphics-drivers/ppa
        • sudo apt-get update
      • Software Updater → Settings … → Additional Drivers → nvidia-driver-440 → Apply changes
    • ThinkPad X1 Extreme のみ
      • WiFi チップの Intel AX200 がドライバ対応されていない
        • USB 接続の有線 Ethenet なら利用可能

Dell と Lenovo のノートPCインストール手順の比較・総評

  • Dell に比べて Lenovo ThinkPad の方が BIOS 関連の設定変更が楽
    • Dell の SATA Operation を RAID から ACHI モードに変更する手順が複雑
  • Ubuntu インストール後アップデート作業までは…
    • WiFi 接続ができないので USB 接続有線 Ethernet アダプタが必要
    • タッチパッドが機能しない可能性があるので USB 接続のマウスが必要
  • 13インチ 4K ディスプレイはスケーリングが適用されるまでは文字が小さくて非常に見づらい
  • Ubuntu 16.04 においては WiFi チップ Intel AX200 のドライバを適用しても WiFi に接続しようとすると OS がフリーズした
  • 最新のチップ構成だと Linux ドライバが対応していない可能性に注意
  • Ubuntu 18.04 は今回試したいずれの PC でも正常に動作可能と言える
  • Ubuntu Certified hardware で各 PC の Ubuntu バージョンの対応関係は参考になる

ベンチマークテスト

CPU ベンチマーク比較

各 PC で UnixBench を実行して,シングルコア・マルチコアのスコアを調査しました.

Dell Inspiron 13 5390 Dell XPS 13 7390 ThinkPad X1 Extreme Gen2 ThinkPad T480s
スペック
CPU ナンバー Core i5-8265U Core i7-10710U Core i9-9880H Core i7-8550U
スレッド / コア 8 / 4 12 / 6 16 / 8 8 / 4
ベース周波数 1.6 GHz 1.1 GHz 2.3 GHz 1.8 GHz
最大周波数 3.9 GHz 4.7 GHz 4.8 GHz 4.0 GHz
UnixBench
シングルコア 1640.1 2106.8 1829.1 1234.6
マルチコア 3550.8 6012.3 7960.4 3399.5

Multi Cores はコア数に応じたスコアを示しているように思います.

また Dell Inspiron 13 5390 が値段の割に良い結果が得られました.

GPU ベンチマーク比較

GPU は ROS では Gazebo シミュレーションの 3D 表示能力などと関係がある項目です.

各 PC で Unigine Benchmark – Heaven (1920 x 1080) と glmark2 をそれぞれ実行して,スコアを調査しました.

Dell Inspiron 13 5390 Dell XPS 13 7390 ThinkPad X1 Extreme Gen2 ThinkPad T480s
GPU Intel UHD 620 Intel UHD 630 Intel UHD 630 GeForce GTX 1650 Intel UHD 620 GeForce MX150
Unigine Benchmark – Heaven 1920 x 1080
Score 281 310 290 1565 267 548
FPS 11.2 12.3 11.5 62.1 10.6 21.8
Min FPS 5.0 5.9 8.1 21.4 5.3 6.3
Max FPS 23.7 25.9 23.2 124.7 22.1 46.2
glmark2
Score 2244 2892 2978 2633 2500 3343

Unigine Benchmark – Heaven では NVIDIA グラフィックの優位性が顕著に出ました.

一方 glmark2 の方は NVIDIA GeForce MX150 の優位性はあるものの NVIDIA GeForce GTX 1650 はむしろ Intel UHD 630 よりも低いスコアとなりました.これらの PC では glmark2 実行時に 2000 〜 4000 fps ほど出てしまうので,現在の GPU に対しては負荷が軽すぎるような印象を持ちました.

ROS PCL プロセス処理周波数比較

実際の ROS プロセスの動作状況を比較するためにポイントクラウドのフィルタリング処理能力を比較しました.

予め記録したポイントクラウドメッセージの rosbag データを各 PC で Voxel Grid フィルタと Statistical Outlier Removal フィルタをかけて ROS トピック /camera/statistical_outlier_removal/output として出力して周波数を調査しました.

$ rostopic hz /camera/statistical_outlier_removal/output
Dell Inspiron 13 5390 Dell XPS 13 7390 ThinkPad X1 Extreme Gen2 ThinkPad T480s
MAX 2.855 5.052 4.333 2.000
Average 2.353 3.759 3.830 1.873
min 2.126 2.975 3.623 1.787

3D グラフィクの表示は行わなかったので基本的には CPU によるデータ処理と考えられます.

CPU Multi Cores のスコアが一番近い傾向にあるように思いますが,Dell XPS 13 と ThinkPad X1 Extreme Gen2 の差は CPU Multi Cores ほどは出ませんでした.より多い数のスレッドを必要とするプロセスでは差が出るかもしれません.また Dell XPS 13 7390 は処理周波数の最大,最小の差が大きかったです.

Dell Inspiron 13 5390 は値段の割に良い結果を出している印象を持ちました.

まとめ

  • インストール・設定関係
    •  BIOS
      • Lenovo ThinkPad の方が Dell に比べて BIOS 関連の設定変更が楽
    • 13インチ 4K ディスプレイ(今回は Dell XPS 13 7390)
      • スケーリングが適用できるようになるまでは文字が小さくて非常に見づらい
    • Ubuntu 18.04 は今回試したいずれの PC でも正常動作
    • Ubuntu 16.04 においては一部 WiFi チップ Intel AX200 のドライバに不具合
    • 最新のチップ構成だと Linux ドライバが対応していない可能性に注意
    • Ubuntu Cetrified hardware で各 PC の Ubuntu バージョンの対応関係は参考になる
  • 各ノートパソコン性能など
    • Dell Inspiron 13 5390
      • 10万円未満という値段の割には良い性能
        • 低コストやドライバ対応の面を考えると Ubuntu + ROS 入門用に向いている
          • ただ BIOS の設定に手間がかかる
    • Dell XPS 13 7390
      • 今回の ROS ポイントクラウド処理では ThinkPad X1 Extreme に肉薄する性能
    • ThinkPad X1 Extreme Gen2
      • CPU・GPU・ROS PCL の全ベンチマークで最高性能を発揮
    • ThinkPad T480s
      • Intel GPU に比べて NVIDIA GPU の優位性あり
      • BIOS 設定も簡単で基本的なドライバは追加する必要もなくインストールが楽
  • その他
    • グレアディスプレイだと写真や動画を撮るときに反射・映り込みに配慮する必要あり
Dell Inspiron 13 5390 Dell XPS 13 7390 ThinkPad X1 Extreme Gen2 ThinkPad T480s
Ubuntu 16.04 + ROS Kinetic
Ubuntu 18.04 + ROS Melodic
BIOS 設定の容易さ
ROS ポイントクラウド処理性能
価格
著者:yamamoto.yosuke

CIS ToF カメラセンサ がネット購入できるようになりました

2019年に ROS パッケージをリリースしました CIS ToF カメラセンサ DCC-RGBD1 がネットから購入できるようになりました.

Amazon.co.jp で購入の場合は日本国内への出荷のみですが,日本国外へも 株式会社シーアイエス の販売窓口メールアドレス ec-sales@ciscorp.co.jp にお問い合わせいただくと販売可能とのことです.

著者:junmonma

初めてのROS(ROSチュートリアルを使って)

皆さん,こんにちは

今回,TORKのROSチュートリアルを使って,初めてロボットのプログラムの勉強をしたので,そのときに苦労した点を中心に感想を書いていきたいと思っています.

私のプログラミングレベルはDOSやBASICを少し知っている程度,WindowsはOSとして利用するだけで,Windowsのプログラムを書いたこともありません.もちろんLINUXも最近のプログラム言語であるPythonは全く知りません.個人的にはかなりハードルが高いのですが挑戦してみたいと思います.

ここではROSチュートリアルとして,TORKのMoveIt! Tutorial Documentation Release0.0.7を使っていきます.ちなみに日本語ですので大変助かります.

1章(CHAPTER ONE)

とりあえずサラッと読んで次へ

2章(CHAPTER TWO)

あれ,シミュレータ上のロボット? シミュレータはロボットのシミュレータじゃないのNEXTAGE OPEN,Baxter・・・・なんだなんだ? その下,2.1にはROSのシミュレータ,Hrpsys(RTM)シミュレータ??? 全然わからない???

これはすぐには理解できなかったので,実際はこのチュートリアル通りに淡々と進め,ぼんやりと分かってきた時点で整理してみると下記のようなことでした.

最初に出てきたNEXTAGE OPEN,Baxter・・・・というのはシミュレータ上で動作するロボットの名前でした.具体的なイメージは以下の画面キャプチャを見てください.このチュートリアルで使うシミュレータ上のロボットはこの4種です.

NEXTAGE OPEN Baxter Research Robot MINAS TRA1 KHI duaro

 

2.3.2項 2.3.3項 2.3.4項 2.3.5項

初めから整理した形で進めると2章の理解が早いと思いました.

更にこれらのロボットが動作するベースとなるシミュレータはGUIでロボットの動作を計画(指示)するMoveIt!というものと,その計画に沿って動作するロボットの土台となる物理シミュレータであるGazeboというものがあるということです.

これらの関係を理解しておくとチュートリアルで何をしようとしてその手順を踏んでいるのか理解しやすくなります.

私はこの関係が理解できないまま進めてしまったので,進めている割には何をしているのか理解できずまごついてしまいました.

 

2.2 ソフトウェアのインストール

まずUbuntuのインストールから始めました.最初はWindows10にOracleのVirtual Boxをインストールし,VMの中にUbuntuをインストールしました.インストールは無事できたのですが,その後トラブル続出で,途中であきらめてしまいました.やはり慣れていない人は素直にネイティブでインストールすることが必須と思いました.

ちなみに,Ubuntuは16.04LTEの英語版を使用しました.日本語版だとディレクトリの名称に日本語が入り,うまく動かないことがあるので注意です.英語版をインストール後,日本語が使えるようにMozcをインストールしました.また,ROSのバージョンはKineticです.本チュートリアルのROS Kinetic版を行う上では Ubuntu16.04LTEとの組合わせが必須です.前のバージョンであるIndigoはUbuntu 14.04LTEとの組み合わせで検証されているため,問題が発生しても初心者では解決ができません.私自身,このチュートリアルのテキストを読む前はこの組み合わせを把握していなかったので,16.04にIndigoを入れてしまい,訳が分からなくなってしまいました.要注意です.

私は10年程前からUbuntuを試用してきましたが,基本GUIベースでしか使っていませんでした.今回はターミナル上のコマンドベースです.昔MS-DOSのコマンドを使ってみたことはありましたが,Ubuntuでは初めてです.これも勉強しながら進めていこうと思います.

さていよいよROS関連ソフトウェアのインストールです.

ソフトウェアは3ページ下部に書いてあるROS,チュートリアルパッケージ,ロボットソフトウェア3種です.

まず,ROSのインストールです.

現時点ではチュートリアルも修正されているかもしれませんが,掲載されている内容はキー情報が古いため,下記URLに記載されている手順でインストールを行いました.これはスムーズにインストールできました.

http://wiki.ros.org/ja/kinetic/Installation/Ubuntu

次にチュートリアルのインストールです.これも現時点で apt-getで取ってこれないとのことでGithubからdebianパッケージをダウンロードしてインストールすることが必要でした.具体的には下記場所から ros-kinetic-tork-moveit-tutorial_0.0.7-oxenial_amd64.deb をダウンロードし,これを下記のようなコマンドでインストールしました.

ダウンロード先:https://github.com/tork-a/tork_moveit_tutorial/releases/tag/0.0.7

インストール: $sudo apt-get install -f ./ os-kinetic-tork-moveit-tutorial_0.0.7-0xenial_amd64.deb

NEXTAGE OPEN,MINAS TRA1,KHI duaroのロボットソフトウェアはチュートリアル通り行っていくと問題なくインストールできました.

Ubuntuをコマンドベースで使っている方には初歩の初歩ですが,私はこの過程で,↑,↓キーを押すことで,前後に実行したコマンド履歴から選んで,再実行できることや,コマンド入力途中でTabキーを使うことにより,オートフィルのような機能があることを知りました.MS-DOSの時代のコマンドに比べるとすごい進化ですね.

さて全てインストールできたので,チュートリアルに沿って,実行してみました.実際にMoveIt! GUIで動作目標の位置を設定(InteractiveMakerを動かして設定)し,Plan and Execute ボタンを押すと,Gazeboシミュレータ上のロボットがその通りに動きました.ちょっと感動です.

MoveItもGazeboも表示画面のメニューを見ると機能が豊富そうなので,もう少し慣れてきたら,どんなことができるのか確認をしてみたいと思っています.

 

3章(CHAPTER THREE) プログラムでロボットを動かす.

ようやく,ロボットを動かす環境が整い,実際にシミュレータ上で,NEXTAGE OPENロボットをコマンドで動かしてみるところまでたどり着きました.

ワクワクしますが,ここでプログラム言語のPythonを使う必要が出てきました.この言語は全く初めてなのでこれも勉強しながらやっていこうと思います.PythonはCのようにコンパイルしたりすることがなく,1行ずつ実行する環境があるとわかり少し安心しました.また,Pythonの開発環境はROSをインストールしたときに同時にインストールされているとのことなので,そのまま進められそうです.

Pythonに関しては7章(CHAPTER SEVEN)にチュートリアルが書いてありますので,時々参照しながら行っています.

3章では基本的に1行づつの実行で確認を進めていけます.Python を1行ずつ実行する環境は tork_moveit_tutorial demo.py を実行することで可能になります.最初の行の冒頭 In[1]:は何を意味するのか分からなくて,最初はこのチュートリアル通り1から始まるのですが,1行実行すると2になってしまいます.チュートリアルでは2行目実行後でも1になっている場合があるので,何とか戻そうとしましたが戻りません.これも聞いたところ,1行実行する度に増えていく仕組みになっているので戻すことはできないし,実行上の意味は無いので気にする必要はないとのことでした.聞けば「そうですか」なのですが,本当に初めはこんなつまらないこともわかりません.トホホです.

それ以上に難しいのが,位置や姿勢を示す用語の意味です.ロール,ピッチ,ヨーについては下記のページを参照させていただきました.

https://watako-lab.com/2019/01/23/roll_pitch_yaw/

クォータニオンについては下記のページを参照させていただきました.

https://qiita.com/drken/items/0639cf34cce14e8d58a5

一通り読みましたが,ベースとなる知識がないので,十分には理解できませんでした.ここで立ち止まってもしょうがないので,とりあえずそういう定義の方法があるということだけ記憶し,次へ進むことにしました.

 

4章(CHAPTER FOUR) 発展的なロボットプログラミング

いよいよプログラミングのスタートです.チュートリアルではいきなりプログラムの実行のコマンドが書いてありますが,3章終了時にすべてのターミナルを閉じていた私には「あれ?いきなりコマンドを実行するの??」と,具体的にどうしたらよいかわかりませんでした.聞いたところ,この章で使用するロボットはNEXTAGE OPENとのことなので,まずコマンドを実行する前に3.2.1項に書いてあるようにまず一つ目のターミナルでNEXTAGE OPENを起動し,二つ目のターミナルでMoveIt!を起動した後,もう一つターミナル(ターミナル3)を開いて,そこでプログラムファイルを実行していく必要があるとのことでした.

ここまで準備ができれば,チュートリアルのプログラムファイルを“rosrun ファイル名” で実行していけば動作を確認できますが,問題はそのプログラムファイルの中身ですね.

4.1.1項の nextage_moveit_tutorial_poses_ifqyn.py の下にいきなり最初のプログラムファイルの中身が書いてあります.これがPythonで書かれたプログラムです.

Pythonは細かな文法はBASIC等と異なるものの,大きな考え方は共通するものがあり,それほど違和感はありませんでした.ただ,クラスという考え方は新しいことでした.それも7.3.3項を読んでみると,なんとなくわかったような気になって,そのまま進めることにしました.

4.3.2項 まではスムーズにプログラムを理解し,実行できたのですが,4.3.3項のtfでつまずいてしまいました.最初からtf=Transform Frameと理解しておけばよかったのですが,単なる記号として読み進めたため,なかなか理解できなかったのです.これまでは,単純に動作の目標位置を設定し,実行するとそこへ動くという内容だったのですが,ここで時間の概念が入ってきたことになかなか気が付かなかったのです.

考えてみれば,ロボットは逐一動いていて,時間ごとにどんどん位置や姿勢が変わっていくので,時間の概念を入れないと,自動的に判断して動いていくようなロボットのプログラムは作れないのは当然でした.そう思って,この4.3.3項以降を読むとすんなりと理解できました.

つぎに思ったことは4.3.5項の障害物の設定です.障害物は box_poseで設定すれば,MoveIt!が自動的に動作計画を作りますということなのですが,実際にはどういうステップで障害物を避けながら動いていくのか知りたいと思いました.この辺りは,これから実際にプログラムを書いて試してみて,慣れてきたら,勉強してみようかと思います.

 

以上,理解がまだまだ不十分ですが,チュートリアルを終えた感想をまとめます.

 

1.本チュートリアルでROSを使ったロボットの基本的な動作は解説されているので,これらの動作の組み合わせやセンサーからのフィードバックで目標姿勢を変えながら,繰り返し動作をさせていけば,物を掴んで移動させたり,両腕を使って,何かを組み立てさせたりすることが比較的簡単にできそうだという感触は掴むことができました.

2.しかし,チュートリアルを終えても,ROS=通信機構+ツール+ライブラリ群+コミュニティという定義に対し,ROSはこれというような概念がつかめていないことが反省です.というのは,①具体的に通信機能,ツールにはこのチュートリアルのどの部分が該当しているのか,ライブラリ群は多分膨大にあるのだとは思いますが,例としてどんなものがあるのか,ここまではROSでカバー,ここは自分でプログラムを作らないとダメとか,ROSの全貌と境界が良く見えないことです.それと②私個人の問題ですが,ROSは分散システムであり,従来自分が接してきたシリアルなプログラムとは取り扱う概念が異なるため,分散システムの同期,非同期等の考え方等,もう少し勉強しないといけないと感じました.

3.ここまでのチュートリアルでMoveIt!等の便利に使えるツールが存在すること等からロボットの動きを比較的簡単にシミュレーションしたりすることができるということは面白いと思いました.実際のプログラムを書いて実行してみたいと感じています.これから,プログラムを書く上での細かなルールや手順,作成上のツール等をもっと勉強してみたいと思います.これは,TORKのROSセミナー初級編が参考になるのではと思っています.また,最新版のMoveIt! Tutorial Documentation Release0.0.10では新しく「独自プログラムの実行」という章が加筆され,この辺を重点的に解説されているので,今後読み進めて,簡単なプログラムを書けるようになりたいと思っています.

4.CommandベースのUbuntuの操作やPythonを初体験したのですが,昔のMS-DOSのCommand操作やBasicの延長で,当初想定していたよりは取り組みやすかったと思っています.

以上,本当の初心者がチュートリアルをやってみて単純に思ったことを書いてみました.あまりにも初心者でお叱りを受けそうなところも多々ありますが,これからROSを使ってみたい人の参考にしていただければ幸いです.

 

 

 

 

著者:yamamoto.yosuke

CIS ToF カメラセンサの ROS ドライバパッケージをリリースしました

新しい ROS パッケージ cis_camerahttps://github.com/tork-a/cis_camera )をリリースしました.

この ROS パッケージは 株式会社シーアイエスhttps://www.ciscorp.co.jp/ ) ToF (Time of Flight) カメラセンサ DCC-RGBD1 のためのドライバパッケージです.

DCC-RGBD1 は小型ながら広いレンジの深度画像が取得可能な ToF カメラセンサ(ディベロップメントキット)です.

  • 15cm 〜 5m のレンジで高精度な深度画像を取得可能
  • 小型 H:50mm × W:55mm × D:35mm(突起部を含まず)
  • RGB (QVGA) と Depth / IR (VGA) の3つの画像を同時取得
  • インタフェースは USB 3.0( USB 3.0 micro B コネクタ搭載:USB 給電は非対応 )
  • 屋内使用向け

本パッケージでは CIS ToF カメラセンサの ROS ドライバに加え,ノイズ除去,平面検出・除去,対象物点群抽出とフレーム座標算出のポイントクラウド処理ならびに,それらの処理結果を RViz で 3D 表示するためのサンプルプログラムおよび launch ファイルを同梱しています.

使い方は GitHub のドキュメントをご参照ください.
もし問題にぶつかった場合は GitHub Issues で報告をお願いします.

CIS ToF カメラセンサのハードウェアの入手などに関するお問い合わせは下記連絡先までお願いします.

ハードウェアに関するお問合せ先:株式会社シーアイエス 営業担当
メールアドレス:newbiz@ciscorp.co.jp
電話番号:042-664-5568

著者:ryo.kabutan

World MoveIt Day 2019 in Tokyoが開催されました!

11月20日に,World MoveIt Day 2019 in Tokyoが開催されました! 当日の様子を写真をたくさん載せながらレポートしたいと思います.参加できなかった方もWorld MoveIt Dayの雰囲気を感じていただけると幸いです.当日の実施したスケジュールをたどりながら記事にしたいと思います.

会場

外の様子

会場は株式会社オムロンサイニックエックス様のオフィスでした.オフィス玄関,エレベータ,会場などにTORK作成のWorld MoveIt Dayのポスターを貼って雰囲気を盛り上げました.

会場内

会場したときの写真です.オムロンサイニックエックス様のご提供の会場はおしゃれなオフィスでした.参加者みなさん,それぞれ開発の準備をしています.

開会

TORKよる開会の挨拶がありました.1日の日程の説明を行いました.

ハッカソン

早急に開会の挨拶を終了し,ハッカソン開始!みなさんそれぞれの課題を見つけ開発を行います.わからないことがあれば,スタッフに積極的に質問してくださったり,参加者同士で助け合ったりと良い雰囲気でした.

昼食

昼食はTORKの提供でした.ごはんをしっかり食べて午後からも頑張れそうです!!

スポンサープレゼン

お昼ごはんを食べながら,主催者によるスポンサープレゼンがありました.

オムロンサイニックエックス

オムロンサイニックエックスのフェリクスさんからのスポンサープレゼンが実施されました.オムロンサイニックエックスとしての活動,MoveItの開発スケジュールなどの説明がありました.

TORK

TORKから,TORKの会社説明,活動(セミナー,トレーニング教材の作成,MoveItへのコミット)などを説明しました.

ハッカソン

午後もハッカソンが続きます.午後には事前に用意していたロボットを参加者さんが動かせるようになりました.そのときのトラブル事例などをシェアしたりと,開発者同士の積極的な交流がありました.またホワイトボードに今実施している内容(Issue番号なども)を書き出したりしました.

参加者による発表

夕方17時から,今日一日の成果発表です.参加者皆さん,今日一日やったことを発表するスタイルでした.「私のやったことなんて…」みたいなことがなく,互いの成果を称え合うすばらしい時間だったと思います.たくさんの発表があったので,一部だけご紹介します.

MoveItプラグイン上の不具合

MoveItプラグインのScene Objectsの設定画面にて,各Sceneに紐付けられたインタラクティブマーカのサイズがおかしいという問題をTORK から発表しました.当日は間に合いませんでしたが,その後問題を解決し,Pull Request を本家リポジトリへ出し,現在 merge を待っています.

RViz broken Interactive Marker in “Scene Objects” Tab #1115

https://github.com/ros-planning/moveit/issues/1115

Add interactive marker resizing #1795

https://github.com/ros-planning/moveit/pull/1795

https://github.com/ros-planning/moveit/pull/1796

Previousの実装

MoveItプラグインで,ロボットの開始終了姿勢を指定するときにCurrentという設定があると思います.それに追加で,Previousを実装したという発表でした.これによって,プランニング実行後,更にプランニングを行う場合,以前の姿勢を目標姿勢に設定することができます.なんとこの成果はMoveItのマスターブランチにマージされました!!すばらしいです.

add “<previous>” robot state to RViz motion display #14

https://github.com/ros-planning/moveit/issues/14

MoveIt チュートリアルの日本語化

MoveItチュートリアルの日本語化を現在取り組んでいます.その一部を2名の方に手伝ってもらいました!ありがとうございます.

Japanese Translation #415

https://github.com/ros-planning/moveit_tutorials/issues/415

プラグインのサイズ調整

MoveItのプラグインは横幅のサイズが固定で.ディスプレイサイズが小さいとRvizを専有してしまいます.このIssueに取り組んでくださいました.

make MoveIt’s RViz display properly resizable #13

https://github.com/ros-planning/moveit_tutorials/issues/13

xArmの動作デモ

ロボットを持ち込んで参加してくださった方々もいらっしゃいました.xArmの動作デモを実施していただきました.xArmの実物を見たことがなかったので,新鮮でした!

TrajOptについて

TORKからMoveItの新しいプランナであるTrajOptの説明を行いました.WMD当日時点では,TrajOptの機能はプルリクエストがあがっていますが,動作しなかったので,そのプルリクエストの内容のレビューを実施しました.WMDの時間内でなんとかプランニングを実行することまではできるようになりました.

Trajopt with no dependency to tesseract #1626

https://github.com/ros-planning/moveit/pull/1626

他にもたくさんの発表がありました

発表時間には多くの発表があり,この記事のボリュームの関係で紹介しきれなかったものもたくさんあります.発表してくださった方にはMoveItステッカーやTORK作成のMoveIt DayのTシャツをプレゼントさせていただきました.

記念写真

集合写真

集合写真もとりました.途中からの参加や,途中でお帰りになった方もいらっしゃいますが,定員で設定していた30名をお迎えすることができ非常によかったです.

スタッフ写真

閉会後スタッフとPanda,URのコラボ写真を撮影しました.

おわりに

今年のWorld MoveIt Dayの日本開催では,Masterブランチへマージされるようなすばらしい成果を出してくださった参加者さんもいらっしゃいました.だんだんと日本でもMoveItを使う側から開発側に入り込めるように推進活動をしたいと思っています.参加者の皆さん,ありがとうございました! 今年参加してくださった方も,参加できなかった方も,来年お会いしましょう!

著者:YamamotoRyu

MoveIt2のビルドとマニピュレータ「MARA」による動作確認(WMD 2019 in Tokyo 準備編)

0. はじめに

本記事はWorld MoveIt Day 2019 in Tokyo(WMD 2019 in Tokyo)へ参加するにあたり,ROS2を用いて開発したいという人向けに,現在対応が進められている「MoveIt2」の環境構築とサンプルの実行方法について解説します.
MoveIt2は,本家ros-planningのレポジトリとAcutronicRobotics社の2つのレポジトリでそれぞれROS2への対応が進められていましたが,現在どちらとも更新が止まっています.そのため完全にROS2への対応が完了している訳ではないですが,AcutronicRobotics社が提供するマニピュレータ「MARA」がROS2対応されており,Gazebo上でMoveIt2を動作させるためのチュートリアル動画が公開されています.本記事ではROS2 Dashingでの動作確認およびチュートリアルを動かすことを目標としています.

続きを読む

著者:yuki.onishi

MoveItでPandaを動かそう:後編(WMD 2019 in Tokyo 準備編)

はじめに

本記事では,World MoveIt Day 2019 in Tokyo(WMD 2019 in Tokyo) の会場にて動かすことのできるロボットアーム Panda を,実際にPCと接続して動かす方法を紹介します.
後編では,Panda のパッケージ群である franka_ros の中身について紹介します.
当日実際に機体を動かしてみたい方は,必見です!

Panda を動かすPCの環境構築と,PCと実機の接続方法を説明した前編はこちらになります.
MoveItでPandaを動かそう:前編(WMD 2019 in Tokyo 準備編)

続きを読む

著者:ryo.kabutan

MoveItの各プランナーについての解説(WMD 2019 in Tokyo 準備編)

0. はじめに

本記事はWorld MoveIt Day 2019 in Tokyo(WMD 2019 in Tokyo)へ参加するにあたり,MoveItで使用できるプランニングアルゴルリズムに関して解説します.
MoveItでは非常に多くのプランニングアルゴリズムが利用できます.プランニングアルゴリズムは理論や実装方法によって軌道の計算時間や軌道そのもののが大きく変わるため,ユーザにあまり意識させないような実装にMoveItは設計されているものの,実は非常に重要な要素です.しかしその豊富さが災いして,結局どのアルゴリズムがよいのかわからなくなっているのが現状です.そこでこの記事では現段階で実装されているアルゴリズムについて整理しようと思います.
アルゴリズム内部を理解していると,適用先のロボット,環境によってどのアルゴリズムが適しているかを判断しやすくなりますので,この記事を読んでアルゴリズムの理解を進めていきましょう.

続きを読む

著者:yuki.onishi

MoveItでPandaを動かそう:前編(WMD 2019 in Tokyo 準備編)

はじめに

本記事では,World MoveIt Day 2019 in Tokyo(WMD 2019 in Tokyo) の会場にて動かすことのできるロボットアーム Panda を,実際にPCと接続して動かす方法を紹介します.
前編では,Panda を動かすPCの環境構築と,PCと実機の接続方法について紹介します.当日実際に機体を動かしてみたい方は,必見です!

続きを読む

著者:TanakaRyodo

MoveIt の本家リポジトリへコミットする方法(WMD 2019 in Tokyo 準備編)

0. はじめに

本記事は World MoveIt Day 2019 in Tokyo(WMD 2019 in Tokyo)へ参加するにあたり,MoveItのソースコードを変更し,コミットするためのやり方を紹介します.
MoveItにはPull Requestを送るためのルールがあるので,これに沿ったやり方が出来るよう解説します.WMD 2019 in Tokyoへ参加しない方でも,MoveItを使う方なら参考になると思うので,是非ご覧ください!
なお,今回想定しているROSのバージョンは,ROS1 melodicです. 続きを読む

著者:TanakaRyodo

World MoveIt Day 2019 in Tokyo を開催します!「準備編」

World MoveIt Day 2019 in Tokyo とは?

MoveIt の利用者,開発者のための世界的なイベント World MoveIt Day 2019 (以下WMD 2019)のローカルイベントを,東京で開催します.

MoveItとは ROS コミュニティ が開発している,ロボットマニュピレータを対象としたROSの主要パッケージの一つで,障害物にぶつからないようなロボットアームの軌道を計画するモーションプランニングのソフトウェアパッケージです.WMD 2019 は,このMoveItの開発を世界中の人々で一気に推し進めようという開発者のためのイベントです.

私はWMD2019に参加するべきでしょうか?

MoveItに興味はあるけどまだ使っていない方,全く聞いたことのない方へ

  • MoveItの一通りの使い方を紹介します.是非ご覧いただき,開発者になりましょう!

すでにMoveItを使われたことのある方へ

  • MoveItへの貢献の仕方も紹介しています.こちらも,是非ご覧ください!

当日の雰囲気はどのようなものでしょうか?

和気あいあいと開発を行っていきたいと考えています.

実機 Panda Arm の用意をはじめ,開発中に詰まったポイントは随時ホワイトボードに書き出し,みんなで共有->わかる人がいれば一緒に解決する.というスタイルで開発していきます.
さらに昼食も無料ですし,閉会後も可能な時間まで開発を続けることもできます…!是非産業ロボット大国日本から一丸となってMoveItに貢献し,MoveItとロボットを楽しみましょう!!

はじめてのMoveIt

初めてMoveItに触れる方におすすめの日本語教材が2つあります.
自分にあっている方を選んでまずはご覧ください.

ROSってなに…? MoveIt…?という方向け

はじめてMoveItに触れる方のために, ROS Industrial トレーニング教材(英語) が提供されています.しかし,これらは英語で書かれているため,日本語も欲しいところですよね!!
実はTORKでは以前にこのページを日本語化し,公開しています.MoveItの基本的な使い方,他のチュートリアルやマニュアルへのリンクなどがまとめられているので,まずはこちらをご覧ください.

また,2019年11月16〜17日には,日本ロボット学会(RSJ)の主催でMoveItとROSを用いたマニピュレータ制御に関するセミナーが開かれます.申し込み期限は2019年9月27日なので,是非参加されてみてください.

ROSは知ってる!MoveItははじめて…という方向け

TORKからMoveItの日本語チュートリアルを無料で公開しています.是非ご覧ください.

チュートリアルを終えたら…

どんなロボットを用いて開発をされても構いませんが,WMD 2019 では,Panda Arm の実機を用意しています.これは,Moveit!のチュートリアルで使用されているロボットです.
WMD 2019では,このチュートリアルの不備があれば公式リポジトリへIssueを出していただくことも推奨しています!!ただし英語のため,TORKにて部分的に日本語訳を行っていく予定です.

ここまでに登場したリンク以外にも,参考になるリンクをまとめて紹介しておきます.

MoveItに貢献しよう!

MoveItが使えるようになったら,是非MoveItに貢献しましょう!WMD 2019もROS Industrial に貢献することが開催目的です!
といっても,何から始めたら良いかわからないですよね…
実は公式ページからそのガイドラインが出ています.このページの”Finding Where You Can Help” と書かれてる箇所に具体的に載っています.内容は下記のとおりです.

  • moveit day candidate WMD 2019 の間に解決が可能なIssue
  • simple improvements 数時間で解決できそうなIssue
  • documentation 新しいチュートリアルの提案やWebページの更新等
  • no label ラベル無しももちろん解決が望まれているIssueです.WMD 2019 以降に伸びて開発を行うことももちろん歓迎です!

上記の中からとくに,WMD Tokyo 2019では実機のPanda Arm もあるため,documentation の項目を更新できるかもしれません…他のラベルもどんどん解決していきましょう!!!
筆者も昨年のWMD 2018 では simple_improvements の解決にチャレンジしていました.もちろん,WMD 2019 開催前にどんどんと解決していってもらっても構いません(むしろ歓迎).そして,その内容をWMD 2019で発表してください.

なお,WMD 2019で成果発表を行ってくださった方には素敵なプレゼントがあります!!!

記事の更新情報

「MoveItの本家リポジトリへコミットする方法」 を公開しました!(2019/10/24)
「MoveItでPandaを動かそう:前編」を公開しました!(2019/10/28)
「MoveItの各プランナーについての解説」を公開しました!(2019/10/30)
「MoveItでPandaを動かそう:後編」を公開しました!(2019/11/18)
「MoveIt2のビルドとマニピュレータ「MARA」による動作確認」を公開しました!(2019/11/19)

MoveIt2のビルドとマニピュレータ「MARA」による動作確認

さいごに

記事の更新情報は随時公開していきます.是非RSS等登録頂き,チェックしてください!

著者:Yumiko Suzuki

2019年4月のROSワークショップ日程

以下日程でROSワークショップを行います.

4月19日(金)13:30~ ROSワークショップ初級編
4月25日(木)13:30~ ROSワークショップ初級編
場所は都内・有楽町の会議室で実施します.

お申込みは以下より詳細をご確認の上,ページ内のお申込みリンクよりエントリをお願い致します.
ROSワークショップ初級編

上記以外での日程の調整,その他ご相談,開発委託も承っております.
お気軽にご相談ください.
info[at]opensource-robotics.tokyo.jp

IMG_20151112_182120

著者:Yumiko Suzuki

初級者の方のために – Linux環境に慣れる

春ですね!春は新しく勉強をはじめる方も多いと思います.

ROSワークショップはLinuxで実施しますが,Linux環境を簡単に準備できない方やLinuxが初めての方もいらっしゃいます.
環境をすぐに準備できない方はWeb上のターミナル環境を使ってまずはLinuxコマンドに慣れておくのをおすすめします.

Web上のターミナル環境
・ターミナル:Unix Terminal Online
http://www.tutorialspoint.com/unix_terminal_online.php

おすすめのLinuxコマンドのサイト
・ Linuxコマンド
http://robotics.naist.jp/edu/text/?Robotics%2Flinux-command

・参考:ROSを初めて勉強するときに
https://opensource-robotics.tokyo.jp/?p=1361

著者:Yumiko Suzuki

2019年2月のROSワークショップ日程

以下日程でROSワークショップを行います.

2月26日(火)13:30~ ROSワークショップ初級編
場所は都内・有楽町の会議室で実施します.

プライベートでのお申込みが大変増えております.
人数が揃うようでしたら,プライベートでのワークショップ,出張のワークショップも開催可能です.
ご希望の日程をお問い合わせください.

お申込みは以下より詳細をご確認の上,ページ内のお申込みリンクよりエントリをお願い致します.
ROSワークショップ初級編

上記以外での日程の調整,その他ご相談,開発委託,出張ワークショップ,カスタマイズワークショップも承っております.
お気軽にご相談ください.
info[at]opensource-robotics.tokyo.jp

IMG_20151112_182120

著者:Ryosuke Tajima

ROS-Industrialのトレーニング教材を日本語訳しました!

ROS-Industrialって?

産業用などのロボットアームとROSの組み合わせについて調べると,”ROS-Industrial(以下ROS-I)”というのが見つかって,気になりますよね.自分のロボットに対応しているのだろうか,ロボットにやらせたいことが出来るパッケージが揃っているんだろうか,そもそもROS-Iって何なんだろうか,ROSとは違うの? そのような問い合わせをTORKでも多く受けています.

ROS-Iは,国際的なコンソーシアムの名前です.このコンソーシアムでは,ROSを産業用途に用いる際の技術的な問題を参加メンバー企業間で共有し,メンバー内の企業が(契約に基づき)パッケージやソリューションを提供する,という活動です.ROS-Iという規格やパッケージ群が,ROSと独立してあるわけではありません.あくまで,ROSのエコシステムの中での話です.

ROS-Iで開発,管理されたパッケージは,しばらくはメンバー企業の中でのみ共有されますが,最終的にはオープンソースとすることが契約で決められています.ROS-Iのレポジトリで公開されているのは,これらの成果です.

ROS-Iでは,この成果を使うためのトレーニングコースを北米,EU,そしてアジアではシンガポールで定期的に開催されています.3日間ぐらいのコースとなっています.このトレーニングコースは,ROS-Iのメンバーでなくても受講することができます.

さらにそのトレーニング用の教材も公開されていて,これを参考にすれば興味がある人はだれでも,ROS-Iの主要パッケージについて勉強することができます.

これには,ROSの基本的な解説やセットアップの他に,C++でのノードの書き方,MoveIt!,ROS-Iで最近開発された直交座標系でのプランニングパッケージ”Descartes”や,センサを使った点群処理,画像処理といった内容が含まれています.演習が主になっていて,自分のPCもしくはVMで試しながら習得するというスタイルです.

正直言って,難易度はけっこう高いと思いますが,ROSをすでに習得していて産業用ロボットでこれからガンガン使うぞ!という方にとっては,大いに参考になる内容ではないかと思われます.

トレーニング教材を日本語訳しました!

「でも英語じゃーなあ...」と思ったそこのあなた,朗報です! このトレーニングコースの教材をTORKで日本語訳し,このたび完成しました!

ROS Industrial トレーニング教材

日本語の目次は以下のようになっています.興味が湧いた方は,ぜひ日本語でチャレンジしてみてください.

PC のセットアップ
準備
C++
Linux の基礎

演習 0.1 – Ubuntu GUI 入門
演習 0.2 – Linux のファイルシステム
演習 0.3 – ターミナルを使う
基礎編
セッション 1 – ROS の概念と基礎

演習 1.0 – ROS のセットアップ
演習 1.1 – ワークスペースの作成
演習 1.2 – パッケージのインストール
演習 1.3 – パッケージとノード
演習 1.4 – トピックとメッセージ
セッション 2 – 基本的な ROS の使用法

演習 2.0 – サービス
演習 2.1 – アクション
演習 2.2 – launch ファイル
演習 2.3 – パラメータ
セッション 3 – マニュピレータの制御

演習 3.0 – URDF 入門
演習 3.1 – 作業セルの XACRO
演習 3.2 – TF を用いた座標変換
演習 3.3 – MoveIt! パッケージのビルド
演習 3.4 – RViz 上での動作計画
セッション 4 – Descartes パッケージと認識

演習 4.0 – C++ 上での動作計画
演習 4.1 – 直交座標系動作軌道計画入門
演習 4.2 – 知覚・認識系入門
応用デモ 1 – センサ認識を用いたマニュピレーション
デモ 1 – センサ認識を用いたマニュピレーション
応用デモ 2 – Descartes パッケージによる動作計画と実行
デモ 2 – Descartes パッケージによる動作計画と実行
応用編
セッション 5 – 軌道生成と知覚パイプラインの作成

演習 5.0 – 高度な直交座標系動作軌道計画
演習 5.1 – 知覚パイプラインの構築
演習 5.2 – STOMP 入門
演習 5.3 – Python のためのシンプルな PCL インタフェースの構築
演習 5.4 – OpenCV 画像処理( Pyhton )
セッション 6 – ドキュメント生成 / ユニットテスト / ROS ユーティリティ / デバッグ

演習 6.0 – ドキュメント生成
演習 6.1 – ユニットテスト
演習 6.2 – rqt 分析ツール
演習 6.3 – ROS スタイルガイドと ros_lint
演習 6.4 – ROS と Docker / Amazon Web Service

冬休みの課題として,チャレンジしてみてはいかがでしょうか.

注意点ですが,日本語版の内容に問題や間違い,改善点があった場合には,本家ではなくTORKの方へご連絡およびPull Requestをお願いします.

それではみなさま,良いお年を.

著者:東風上奏絵

ROS2チュートリアル体験記 (3/3)

ROS2のこれから

ROS2はこれからどのように開発が進んでいくのでしょうか.

2018年の9月末頃から,こちらのスレッドで,ROS1からROS2への移行計画についての議論が行われました.簡単に議論内容をまとめてみようと思います.

最初の議論の出発点は,ROS1のリリースをある年度までで辞めることにして,その間の4.5年間にコミュニティ全体でROS2への移行を進め,その後はROS2の開発に集中するというのはどうか,という提案でした.ROS1のリリースをやめる背景には,Python2からPython3への移行の問題もありました.

  • 皆がどう思っているか知りたいんだ.ROS2に完全移行するのに,2023年だったら十分な時間があるだろうか? 2020年にROS1のLTSリリースは必要だろうか?僕の提案は,2020年にROSのリリースはやめて,代わりにROS2の開発に尽力していくこと.

(… So, I’d like to know other users thoughts. Is 2023 enough time to move fully to ROS2? Do we need a LTS release in 2020? My proposal is to forgo a ROS release in 2020 and put the effort in to ROS2 instead. … by mkhansen)

これに対し,複数の賛成意見が寄せられました.

  • すぐにできることではないけれど,ROS1の開発とリリースを徐々に減らしていくことを望んでいるよ.代わりに限られたコミュニティの資源を,2007年に大学院の研究室では作れなかったより良いロボティクスミドルウェアの開発に集中していく必要があるからね.

(… While no one is saying it will happen tomorrow, I’m looking forward to ramping down ROS1 development and future releases. Instead we need to focus our limited community resources on a better robotics middleware that wasn’t built in a graduate student lab in 2007. … by davetcoleman)

  • Willow Garageを2012年に離れてから,ROS1の維持や改良のためのお金はほとんどもらっていないんだ.それにそういうお金があったとしても,チームの人員は限られているからね.

(… Since leaving Willow Garage in 2012, we’ve received approximately $0 directed at maintenance or improvement of ROS 1. And even if we had such funding, we’d still be limited by the number of people on our team. … by gerkey)

その一方で,ROS1からROS2への移行はもっと徐々に進めてほしいという意見もありました.

  • 2020年の4月だと,1年半しかない.既存のROS1パッケージにブリッジして今のROS2のリリースをするのがとても難しくなるよ.合っているよね?ROS1をUbuntu20.04でリリースすれば,もう2年ブリッジのための開発猶予期間ができるよね.

(… To me, that says that after April 2020 (only about 18 months away), it gets a lot harder to run the current ROS2 release with any ROS1 packages bridged in. Is that logic right? By releasing ROS1 on Ubuntu 20.04, you can an extra 2 years of bridge availability. by mikeferguson)

また,ROS1とROS2を共存させていくべきではないかという声もあがりました.

  • 全てのROS1のパッケージをROS2に置き換える代わりに,ROS1とROS2の違いを両側から減らしていく努力もできると思う.コミュニティの分断の衝撃と,最終的な完全移行にかかる負担を減らすために.

(… Instead of porting any package to ROS2, efforts could be spend on reducing the differences between ROS1 and ROS2 from both ends, to reduce the impact of the community split, and all costs of eventual full migration. … by tkruse)

  • ROS1を使ったロボットシステムを提供している会社としては,自分たちのコードを全て新しいミドルウェアに移行するのはとても大変なことになるだろう.僕らのロボットは倉庫で自動のピッキングを行っているのだけど,高い性能と信頼性のためには中身がよく分かるシステムが必要なんだ.このとても複雑なシステムの基盤を交換して,今までと同じ性能まで持っていくのは簡単なことではないと思う.負担の少ないROS2への移行の道筋か,両方を長期的に管理する方法を見つけられるといいのだけど.

(… As a company building solutions based on ROS 1, porting all of our code base to a new middleware would be a major effort. Our robots perform mobile picking in warehouses, where performance and reliability demands require a well-understood system. Exchanging the foundation of this very complex system and getting to a similar performance level again will not be an easy step. … I hope that we can find either a good migration path or ways for maintaining both versions for a longer time. by moritz)

やはりROS1のサポートは必要ではないか,という意見もあり,ROS1をサポートする新たな組織が必要ではないかという提案もありました.

  • Open RoboticsがROS1にかけられるリソースがもうないことは理解しているよ.でも,もし時が来たら,ROS1のメンテナンスを引き継いでくれる組織を見つけようよ.

(… I understand that OSRF cannot commit resources to ROS1 forever. But when that day comes, please let’s try to find a successor organization that takes over stewardship of ROS1…. by Martin_Guenther)

ROSのコミュニティには多様なニーズや必要性を持っている人が所属しているので,これらを可視化して,皆にとってより良い方向性を決めていくべきではないか,という意見もありました.

  • 様々な人が様々なニーズや負担や障害を持っているよね.それだけではなくて,異なる使い方,コミュニティへの貢献の仕方,色々なコードの管理の仕方があるよね.こうした関係性を可視化することはとても価値のあることだと思う.

(… Different segments have different types of needs, requirements, costs, and constraints. Not only that, but different segments use, contribute, and maintain different types code. I think seeing a breakdown and a graph of these relationships of that would be really valuable. … by jbohren)

最後に,スレッドを立てられた方は,これまでの議論を踏まえて,ROS1からROS2移行のために必要な作業をまとめられました.

  • 1. ROS1からROS2に移行したい人向けに80%くらいを自動で置き換えてくれるスクリプトの作成
  • 2. ROS1とROS2共存のためのROS1ブリッジの改良
  • 3. 2020年のUbuntu 18.04, 20.04両方のROS2サポート
  • 4. ROS1 Melodicの2023年までのサポート
  • 5. ROS2のための分かりやすいドキュメント作成

(…

  1. A migration script to do 80% of the ROS1 -> ROS2 conversion for those who want to migrate
  2. An improved ROS1 bridge for running hybrid systems?
  3. ROS2 support in 2020 on both 18.04 and 20.04
  4. Support of Melodic until 2023
  5. Better documentation of ROS2 (see @mikeferguson thread) … by mkhansen)

Open Roboticsの方は,ROS2のこれからをこのように予想しています.

  • 現在のコミュニティの貢献の状態とレベルを考えると,4年半でMelodicが寿命を迎えるもっと前に,ROS2の実装は充実して,とても使いやすくなっているだろうね.もちろん.ROS2がどうなっていようと,たくさんの人は4年半の間やその先も,ROS1を使い続けるだろう.単にROS1のコードを使い慣れているし,信頼できるからね.

(… Given the current status and level of community contributions I expect that ROS 2 will be well-featured and very usable for a wide variety of applications long before Melodic goes EOL in 4.5 years. …

Of course, irrespective of the state of ROS 2 I expect that many many people will still be using ROS 1 in 4.5 years and even after, primarily because of a combination of familiarity and reliance on existing ROS 1 code. by gerkey)

おわりに

いかがでしたでしょうか.

ROS1と比べることで,ROS2での変更点が少し探れたのではないかと考えています.また,執筆者自身は,ROS2との違いを意識することで,逆に,普段何気なくROS1を使っていることに気付かされました.ROS1の理解も少し深まった気がしています.ROS1とROS2の違いは,今回書いた点以外にもあると思いますので,皆様も是非チュートリアルを体験してみてください!

また,ROS2への移行に関する議論は,ROS1を研究で使う者として,しっかりこれからも追っていきたいです.皆様も是非ROS2を試してみてください!

著者:東風上奏絵

ROS2チュートリアル 体験記 (2/3)

チュートリアルの体験

それでは,早速チュートリアルを進めていきます.今回は,gbiggsさんが作成された,

ROS Japan ユーザグループ 講習会 ~ ROS 2 の紹介 ~ (https://gbiggs.github.io/rosjp_ros2_intro/index.html)

のチュートリアル資料を使わせていただきます.ROS2ならではのノードの書き方を理解し,ROS1との違いを探ることを目的とします.

インストール

Ubnutu 18.04にROS2 Bouncy をインストールします.ROS2 Bouncyのインストールはこちら (Desktop Install) を参照しました.ROS2のインストールがうまく行っているかはこちらで確認できました.

ROS2の基本

ROS 2の基本 に従ってチュートリアルを進めていきます.ROS1のチュートリアルでお馴染みの talker/ listener プログラム をROS2のノードの書き方で書いていくものです.

ROS2ならではのノードの書き方として,以下のポイントが挙げられると思います.

  • メインの関数の中ではなく,共有ライブラリとしてノードを実装する.(このようなノードをコンポーネントノードという.)コンポーネントノードとして実装することで,単体でも,ノードレットとして他のノードと組み合わせても使えるようになる.
  • そのために,他ソースファイルに利用するためのコンポーネントノードのクラス定義をまず行い(C++でいうところのhppファイル),その上で,コンポーネントノードの実装を行う(C++でいうところのcppファイル).

チュートリアルの詳細については,リンク先を参照していただきたいのですが,ここからは,チュートリアルを通して印象に残った点を挙げていきます.

実装時に印象に残った点

1. ROS2を利用するためにインクルードするヘッダの変更ROS2のノードの書き方を理解->コンポーネントノードのソースを読み解く->ヘッダーファイル 42行目):

#include <rclcpp/rclcpp.hpp>

ROS1におけるrospyrclpyに,roscpprclcppに変更になっています.

2. 初期化の方法の変更ROS2のノードの書き方を理解->コンポーネントノードのソースを読み解く->スタンドアローンノードラッパーのソースファイル 7, 8行目):

  rclcpp::init(argc, argv);
  auto greeter = std::make_shared();

ROS1では,

ros::init(argc, argv, "talker");

のようにROSの初期化に合わせてノードを初期化します.一方,ROS2では,ROSの初期化とノードの初期化が別々に分けられています.そのため,ノードを共有ライブラリとして実装すると,複数ノードを同一プロセスの中に入れられるようになります.

(詳しくはこちらのチュートリアルのmain関数4, 5行目

  rclcpp::init(argc, argv);
  auto node = rclcpp::Node::make_shared("greeter");

にも説明があります.)

すべてのノードはexecutorというオブジェクトの中で実行します.

こちらのチュートリアルgreet_and_displayer.cpp 10-18行目を抜粋します.

  // タイマーコールバック,トピックコールバック等を行うexecutor
  rclcpp::executors::SingleThreadedExecutor exec;

  // Greeterコンポーネントノードのインスタンスを作成しexecutorに登録する
  auto greeter = std::make_shared<greeter::Greeter>();
  exec.add_node(greeter);
  // Displayerコンポーネントノードのインスタンスを作成しexecutorに登録する
  auto displayer = std::make_shared<displayer::Displayer>();
  exec.add_node(displayer);

3. ノードなどのインスタンス作成時のスマートポインタの使用ROS2のAPIの基本を理解->ノードの実装 main関数5行目):

auto node = rclcpp::Node::make_shared("greeter");

ROS2はC++11/14を使っているため,autoを用い,変数のメッセージ型をコンパイラに判断してもらうようにします.コンパイラに型判断をお任せできるので,ソースコードが簡単になります.

4. ノードの制御の仕方の変更ROS2のノードの書き方を理解->コンポーネントノードのソースを読み解く->ソースファイル 19行目):

timer_ = create_wall_timer(1s, std::bind(&Greeter::broadcast_greeting, this));

ROS1の talker/ listener プログラム のチュートリアルでは,whileループを回し,一定時間ごとにsleepすることよってノードの周期を決めていました.ROS2では,リアルタイム制御や実行時間の管理のため,タイマーイベントで制御を行うことが推奨されています.

ビルド時に印象に残った点

1. ビルドシステムの変更ROS2のノードの書き方を理解->ビルド&実行):

ROS1ではcatkinを用いたビルドを行っていました.catkinは直接cmakeのみを扱います.一方,ROS2では,colconと呼ばれるメタビルドシステムを用います.colconは依存関係を考慮してパッケージのビルド順を決め,ビルドを実行します.ビルドの方法は各パッケージに任せるので,cmakeによらず複数のビルドタイプを選択可能です.

2. ソースコード実行のために実行ファイルのインストールが必須にROS2のAPIの基本を理解->パッケージのコンパイル方法 CMakeLists.txt 25-29行目):

# ノードの実行ファイルをインストールする(必須)
install(TARGETS
  greeter
  DESTINATION lib/${PROJECT_NAME}
  )

ROS1ではビルド時に,すべてのビルドされたファイルがソフトリンクされた,development space (devel space) が作られました.この開発環境を用いれば,インストールせずビルドのみで開発したソフトウェアを利用することができました.一方,ROS2のcolconビルドではdevel spaceが作られないため,開発パッケージのCMakeLists.txtに,実行ファイルのインストール先を指定する必要があります.(執筆者は,ROS1でdevel spaceを用いて自身が開発したソフトウェアを実行しており,正直に書くと,これまでインストールのことを意識していませんでした.)

colconについてはこちらのチュートリアルに詳しく紹介されています.

プログラム実行時に印象に残った点

1. source install/local_setup.bash を使用する端末で必ず一回実行ROS2のAPIの基本を理解->ビルド&実行):

source install/local_setup.bash

ROS1でいうところの source ~/catkin_ws/devel/setup.bash の代わりです.

2. 実行コマンドの変更 ( ros2 run greeter_ros2_style greeter )ROS2のAPIの基本を理解->ビルド&実行):

ros2 run greeter_ros2_style greeter
ros2 run displayer displayer

ROS1でいうところの rosrun greeter_ros1_style greeter の代わりです.その他のコマンドについてはこちらのチュートリアルに紹介されています.

3. roscoreが必要なくなるメッセージ受信ノードの作成->ビルド&実行):

データ通信方式が変更になりました.ROS1では,出版購読モデルの先駆けだったため,独自の出版購読モデルを構築していました.ROS2を開発する頃には,既存のライブラリが複数登場するようになりました.そのような経緯で,Data Distribution Service (DDS) を採用しました.これにより,マスタによるノード間接続が必要なくなり,DDSミドルウェアを介して直接ノード間で接続できるようになりました.ROSにおけるDDSは,こちらのサイトに詳しい説明があります.

その他,難しいなと思った点

執筆者が一番難しさを感じているのは,CMakeLists.txtの書き方です.これまでインストールのことを深く考えたことが無かったため,単にツケが回ってきただけだと思いますが,必要な情報についての理解がまだまだ足りていません.ヘッダーファイルのマクロの理解も追いついていません.ドキュメントを読んで,勉強していこうと思います.

さらに,これはROS1のチュートリアルを最初に勉強した時と同じ感想なのですが,talker/ listenerのプログラムの書き方が分かっても,自分が今使っているロボットをどのようにROS2で動かせば良いのかについてはまだよく分かりません.センサデータが取り扱えるパッケージなどの情報があると嬉しく思います.または,既存のROS1の認識系プログラム等をROS2用に置き換える方法が分かるとありがたいなと思いました.

また,ROS2のlaunchファイルは,xml形式からpython形式になったということです.まだ開発中ということで,これから情報が増えてくることを楽しみに待っています.

著者:東風上奏絵

ROS2チュートリアル 体験記 (1/3)

はじめに

皆さんはROS2を知っていますか?

ROS2は,ROSの次世代版です.ROSは元々,ロボティクス研究用ソフトウェアプラットフォームとして開発されてきました.ROSの普及に伴い,研究開発のみの用途だけでなく,製品に活用する動きが活発になってきました.その過程の中で,ROSに対する新たなニーズが生まれ,ROSのフレームワークのみで対応するのが難しくなってきました.

そこで,ROS2が新たに生まれました.2017年12月にArdent Apaloneが,そして今年2018年7月にBouncy Bolsonがリリースされ,現在も開発が続けられています.

本ブログでは,ROS2が生まれた背景について簡単に触れながら,ROS2の日本語版チュートリアル体験を通して,ROSとROS2の違いとして印象に残った点について述べていき,ROS2のこれからに関する議論を追いかけていきます.(ROSのことは,ROS2と区別して,ROS1と記述します.)

ROS2が生まれた背景

Willow Garage PR2

ROS1はPR2というロボットを用いたロボティクス研究開発環境として,その開発がスタートしました.当初は以下のような用途が想定されていました:

  • ロボット1台のみの運用
  • 計算資源豊富な環境下での運用
  • リアルタイム制御は必要としない運用
  • 強固なネットワーク接続可能な環境での運用
  • 学術研究における開発
  • 自由なプログラミング可能な開発

一方で,ROS1が普及することで,PR2だけでなく様々なロボットで用いられるようになったり,学術用途から製品化に用いられるようになったりしていき,以下のような新しい用途が生まれていくようになりました:

  • 複数ロボットでの運用
  • 小型の組込みシステム下での運用
  • リアルタイム制御を必要とする運用
  • 不安定なネットワーク接続下での運用
  • 製品化を行う産業分野での開発
  • 製品化を推し進めるサイクルや開発におけるはっきりとした枠組みが必要な開発

ROS1がこれまで満たしてきたニーズを維持しつつ,このような新たなニーズも満たしていくために,ROS1と切り分ける形でROS2が生まれました.

詳しい内容は,こちらのサイトに記述されています.

著者:Ryosuke Tajima

TORKは,お手伝いしてくれる人を募集しています!

TORKの活動に参加してみませんか?

TORKでは,活動をお手伝いしてくれる人を大募集しています.

もちろん,報酬も出ます.学生さんやお勤めの方も副業OKなら,ぜひご相談ください.アルバイト,パートタイム,フルタイムなど,いろいろな形態で関わることができます.

以下のようなことをお手伝い出来る方なら,どなたでも大歓迎です.

  • ROS, ロボットソフトウェアに関わる技術開発
  • ROSパッケージのメンテナンス,サポート作業
  • ROSワークショップの講師
  • ハッカソン等コミュニティイベントの開催
  • ソフトウェアのドキュメントの作成や翻訳
  • ロボット関連のブログ記事などの執筆
  • アシスタント(経理,総務,広報等)業務

興味ある方は,以下のメールアドレスまでお気軽にお問い合わせください.

jobs@opensource-robotics.tokyo.jp

著者:Ryosuke Tajima

TORKはB-Boostに参加します!

11月6,7日にフランスのボルドーで開かれるオープンソースソフトウェアのカンファレンス “B-Boost” に,TORKも招待されました.ロボットやROSについて講演してまいります.

また様子を報告します.Je suis parti.

著者:東風上奏絵

World MoveIt! Day 2018 in 柏の葉が開催されました!

先週の金曜日にWorld MoveIt! Day 2018 in 柏の葉が開催されました! 当日の様子を写真で紹介します.参加できなかった方にも雰囲気を伝えられればと思います.

開会前の様子

準備もラストスパートに入っています.

開会式

ついにWorld MoveIt! Day 2018 in 柏の葉が始まりました! ハッカソンでの課題の例についての説明などがありました.

TORK但馬の挨拶です

次に,会場にロボットを展示していただいた企業の方からロボットのご紹介がありました.

Sawyer

SEED Solutions様の発表

富士ソフト様の発表

ハッカソン(午前の部)開始!

皆さんもくもくと作業されています.実機でプログラムを試す方もいらっしゃいました.

ハッカソンの様子

お昼ご飯

午前中はお疲れ様でした!お昼ご飯の時間です.

 

オムロンサイニックエックス株式会社様からご提供頂いた昼食はとても美味しかったです.

本当に美味しかったです!

参加者によるプレゼンテーション

お昼ご飯を食べながらの,参加者による発表が始まりました.

OMRON SINIC X Corporation @felixvd さん

WRS2018製品組立チャレンジ参加報告とオムロンサイニックエックス株式会社のご紹介をしてくださいました.

MoveIt! Task Planningについて @youtalk さん

MoveIt!の新機能,Task Constructorについてご紹介してくださいました.これにより,今までできなかった,物を掴みながら移動するといった,並列タスクが可能になるそうです.

SEED-noid ご紹介 近藤さん

SEED-noidの実用例を,コンビニを舞台にした競技会やレストランでの実証実験のお話などを通してご紹介くださいました.

JointTrajectoryPlotのご紹介 但馬(TORK)

MoveIt!でロボットを動かす際,各関節の角度を知りたい時に便利なツールのご紹介です.

ハッカソン(午後の部)開始!

発表が終わったら,ハッカソンの再開です.

午前と同様,静かで穏やかな時間が流れます.

成果発表会

お疲れ様でした!ハッカソン終了です.今日一日何に取り組んだか,発表し合います.

SEED-Noid Moverにかめはめ波を打たせる(MoveIt!を実機で使う)

 

新しいロボットの製品をgazeboでMoveIt!を使って動かす(ROBOTIS様)

 

新しいロボットの製品の情報をMoveIt!のホームページに追加

 

MoveIt!での衝突計算を簡単にするために,ロボットのメッシュモデルを簡略化する

MoveIt!での衝突計算を簡単にするために,ロボットのメッシュモデルを簡略化する

 

Issueへの取り組み(1)

 

Issueへの取り組み(2)

 

JointTrajectoryPlotをgazebo上で使ってみる

次回参加時の参考になる取り組みがたくさんありますね!

記念写真です!

参加者の皆さま,ありがとうございました! 来年もお会いしましょう!

 

著者:Ryosuke Tajima

RTミドルウェア普及貢献賞をいただきました!

日本ロボット工業会様より,「RTミドルウェア普及貢献賞」をいただきました.カワダロボティクス様との共同受賞です.NEXTAGE Openのソフトウェアサポートが評価されました.今後ともロボット分野のオープンソース・ソフトウェアに貢献していきます.

著者:東風上奏絵

World MoveIt! Day 2018 in 柏の葉

World MoveIt! Dayが来週です!

皆さんはMoveIt!を知っていますか? MoveIt!とは,マニピュレータ用のプランニングフレームワークです. MoveIt!を使うことで,サーボの1つ1つを別々に制御するのではなく,一つのマニピュレータとして扱い,動かすことができます.

World MoveIt! DayはMoveIt!のコード,ドキュメント,コミュニティをますます発展させていくことを目的とした国際的なハッカソンです.今年の日本でのイベントは千葉県の柏の葉で,来週末に開催されます!

詳しい内容と参加登録はこちらのConnpassのページをご覧ください.

何を準備すればいいの?

ハッカソンなんて敷居が高い?いえいえ,そんなことはありません.コードやドキュメントの修正案として,以下のようなものが事前に与えられています.参加する前に,ぜひ一度目を通してみて,出来そうな課題があれば,取り組んでみてください.

公式のイベントサイトに記載されているものを簡単に和訳しました.)

  • moveit day candidate: ハッカソン参加者におすすめの課題
  • simple improvements: 参加者のバックグラウンドに応じて,数時間くらいで解決できるかもしれない課題
  • documentation: チュートリアルやウェブサイトの更新

例えば,このIssueでは,テストコード(ユニットテスト,インテグレーションテスト両方)がたくさん必要だと提案されています.このIssueでは,RVizのバージョンが上がった時に使用できないフォントを,MoveIt!で使わないようにしようとしています.このIssueでは,moveit_python (MoveIt!のPythonインターフェース)の中身を充実させていこうと提案がされています.このIssueでは,もっと初心者に分かりやすくなるように,RVizを使ったMoveIt!のチュートリアルの内容を整えていこうとしています.このIssueでは,SRDFの文法エラーがあったら,MoveIt!がエラーを出すようにしようと提案されています.

初学者がドキュメントを更新していくことも推奨されています.たとえばこのIssueは,既存のチュートリアルがちゃんと動くか,順を追って確認する,という内容になっています.MoveIt!初心者でも,当日チュートリアルをやりながら修正案を出していくのはできそうですね!

ぜひ一度目を通して,自分で取り組めそうなIssueがあれば,チャレンジしてみてはいかがでしょうか?その際には他の人と作業がかぶらなくてすむように,予めIssueにコメントしておきましょう.assignedタグは,その課題に取り組んでいる人が既にいるかどうかを判断するのに便利です.

参加しましょう!

参加の際はROSのKinetic LTS branch/releaseをインストールされたパソコンをお忘れなく.Kineticの入ったUbuntu16.04のVirtualBox イメージは公式イベントサイトからダウンロードできます.他のROS バージョンについては公式イベントサイトをご確認ください.

それでは,当日会場でお会いしましょう!

著者:Yumiko Suzuki

ROSワークショップ初級編を開催しました

今回も有楽町にてROSワークショップ初級編を開催しました.
ご参加いただいた皆様,お疲れ様でした!

初級編では環境の構築からセンシングデバイス,サーボの実機をROSで動かすところまで半日で習得できます.
時間中にはROSに関するお困りごとだけでなく,社内でOSSを運用していく際の疑問点等にも随時お答えしています.

10月のワークショップ日程を公開中です!

出張ワークショップ,プライベートワークショップ,その他OSSに関するご相談も承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp

著者:Yumiko Suzuki

プレス・リリース:慣性計測ユニットADIS16470のROS対応ドライバを公開(アナログ・デバイセズ株式会社)

先日,ブログでアナログ・デバイセズ株式会社のIMU用パッケージadi_driverについてご紹介しています.

アナログ・デバイセズのIMU用パッケージ”adi_driver”をリリースしました!

TORKがROS化をお手伝いさせていただきました ”IMU ADIS16470モジュール” について,
アナログ・デバイセズ株式会社からプレスリリースが出ました.
http://www.analog.com/jp/about-adi/news-room/press-releases/2018/9-10-2018-ROS%20Driver-ADIS16470.html

お問い合わせも多くGithubへのアクセスも活発で,好評をいただいております!
まだお試しいただいていない方は,是非IMU ADIS16470をゲットしてご利用ください!

小型で高性能なIMUのブレイクアウトボードです

著者:Ryosuke Tajima

ROS-I Asia Pacific Workshopに参加してきました!

6月27日,28日にシンガポールで開催された,ROS Industrial Asia Pacific Workshopに参加してきました.(公式ブログの更新を待っていたら,TORKのブログを更新しそびれてしまいました...)

  • ROS-Industrial AP Workshop 2018: https://rosindustrial.org/events/2018/6/27/ric-ap-workshop

新しくてきれいな施設でした

TORKからは初めての参加です.どちらかというと,技術的な内容というより各国のプロジェクトや,企業での取り組みの紹介が多く,ROSのパッケージや技術に特化したROSConとはまた違った印象でした.その代わり,ほぼ日本では知る機会のない海外の大手企業やベンチャー企業の活動内容を知ることが出来ました.また,それらの人々と歓談する機会も多く設けられていて知り合いになれるのも非常に楽しいです.

TORKからも,活動内容と開発中のjog_controlパッケージについて紹介し,開発中の ROSネイティブティーチングペンダントについても展示し,多くの人に関心をもっていただきました.

ARTCには”Future  Factroy”と銘打ったものすごく広くてカッコいい施設があり,たくさんの産業用ロボットが所狭しと並べられていました.そこで,ARTCのロボットチームのデモも見せてもらいました.ROSと最新の産業用ロボットを組み合わせで,Scan-N-Planや物体認識といったテーマをターゲットに研究を行っていました.残念ながらWS内での参加者の撮影は許されていないので様子をお見せすることができませんが,公式のブログ等で追って様子が公開されるのではないかと思います.

ワークショップ全般的に言えるのは,「全員がROSの産業応用について疑いなく一致している」ということです(ROS-Iのイベントなので当たり前ですが).ROS-Iの参加者は実際にROSを応用的な研究開発に利用しつつ,自社の製品力の強化に具体的につなげていこうとしています.また中国や台湾の会社では,ROSやROS2の製品を積極的にリリースしています.ROSの産業応用にはいくつか課題があるのは確かですが,ROSINによるパッケージ作成の支援やコード品質の管理のしくみ,Scan-N-Plan基盤技術の開発など,コンソーシアムとして大きな課題に取り組もうとしています.なにより,手を動かして作って成果を公開する,というループが回っているのがすばらしいなと感じ,TORKも負けないように頑張ろうと思いました.

そして,主催者の運営がすばらしかった! いろいろと気配りをしていただいて,大変楽しく,快適なワークショップに感謝したいと思います.

著者:Ryosuke Tajima

書評:OSSライセンスの教科書

オープンソース・ソフトウェアは怖い?

ROSはオープンソース・ソフトウェア(OSS)です.OSSは1990年代後半から2000年台前半にかけて,LinuxやApache, Java, Androidといったソフトウェアプロジェクトの隆盛とともに一般化してきました.現在では,OSS無しのソフトウェア開発など考えられない,というのが情報産業では常識です.

しかし,ロボットの分野はハードウェアが主体を占めるためか,それほどオープンソースと縁のない開発をしてきていることがあります.そのため,OSSについて必ずしも正しく理解されていないようです.よくある誤解として,

  • ROSを使うと自分たちのソフトウェアも公開しなければならないから怖い
  • ROSやOSSは「そのへんに落ちて」いて無料で使えるので安くあがるはずだ
  • ROSは学生が書いてたりするのでコードの品質が低い
  • バグや不具合があったら誰が責任をとってくれるのか

といったものがあります.どれも私たちが実際に聞いたことがある意見で,そのたびに「そんなことはないんですよー」と説明はしますが,なかなか理解してもらえないことがしばしばで,大きな悩みの種でもあります.

この本を読めば,怖くない!

OSSライセンスの教科書

最近発売されたこの「OSSライセンスの教科書」は,それらの誤解を完全に解いてくれます.非常にわかりやすく,平易な文章で綴られていて,ソフトウェアを書いたことのない方,ライセンスの条文に馴染みがない方も理解しやすいようになっています.

第一部「基本編:OSSとOSSライセンス」では,代表的なOSSライセンス(GPLv2, GPLv3, MIT, BSD, Apacheライセンスなど)を解説しています.ただ単に個別のライセンスの解説に留まるのではなく,ライセンサーの「思い」や歴史的経緯の説明があり,「なぜこんなライセンスが必要なのだろう」という疑問に答えてくれます.

第二部「実務編:ソフトウェア開発とOSS」では,実際の業務でOSSをどのように取り扱うべきかという点に焦点をおいています.知的財産(特許)とOSSの関係という,実務上で非常に大事な点についても解説されています.

第三部「戦略編:OSSイノベーション戦略」は特に注目です.OSSライセンスにとどまらず,OSSをどういう場面で使うべきか,OSSやコミュニティに関わるということはどういうことなのか,その対局にある「フリーライダー」とは何なのか,といった話題を扱っています.当然ですがどれもROSとまったく共通の話題で,私たちTORKが日々理解してもらおうと努力している部分でもあります.

読もう!

この本のおかげで,これから私たちはただ,「あなた,それは誤解ですからとりあえずこの本を読んでください」と言えば良くなりました.まさに教科書,バイブルと言えましょう.よくぞ書いてくれました!

技術に携わる全ての人が(それにマネージャや経営者も!)読むべき本であると断言できます.まずは読んでみてください.

著者:Yumiko Suzuki

2018年9-10月のROSワークショップ日程

以下日程でROSワークショップを行います.

9月12日(水)13:30~ ROSワークショップ初級編
10月2日(火)13:30~ (名古屋) ROSワークショップ初級編
10月3日(水)13:30~ ROSワークショップ初級編
場所は都内・有楽町の会議室または名古屋市内での実施を予定しています.

プライベートでのお申込みが大変増えております.
人数が揃うようでしたら,プライベートでのワークショップ,出張のワークショップも開催可能です.

中級編については公開されている日程以外はご要望があり次第,日程を調整にて開催いたします.
メイルにてお問い合わせください.
(初級者以上,初級編を受講した方を対象としております.中級マニピュレーション編のページまたは中級・自律移動編のページをご参照ください)

お申込みは以下より詳細をご確認の上,ページ内のお申込みリンクよりエントリをお願い致します.

ROSワークショップ初級編

上記以外での日程の調整,その他ご相談,開発委託,出張ワークショップ,カスタマイズワークショップも承っております.
お気軽にご相談ください.
info[at]opensource-robotics.tokyo.jp

IMG_20151112_182120

著者:Yumiko Suzuki

ROSワークショップ初級編を開催しました

今回も有楽町にてROSワークショップ初級編を開催しました.
ご参加いただいた皆様,お疲れ様でした!

初級編では環境の構築からセンシングデバイス,サーボの実機をROSで動かすところまで半日で習得できます.
時間中にはROSに関するお困りごとだけでなく,社内でOSSを運用していく際の疑問点等にも随時お答えしています.

9-10月のROSワークショップ日程を公開中です!

出張ワークショップ,プライベートワークショップ,その他OSSに関するご相談も承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp

著者:Yumiko Suzuki

設立5周年御礼のご挨拶

本日2018年8月8日,おかげさまで TORK は設立5周年を迎えました.

これまで支えていただきましたすべての皆様に,心から感謝と御礼を申し上げます.
これからもお客様のご要望に応え,産業・学術界でのオープンソースロボティクスの進展に寄与できるよう,より一層努力して参ります!

今後とも東京オープンソースロボティクス協会(TORK)をご支援ご愛顧くださいますようお願い申し上げます.

著者:Yumiko Suzuki

「ネットワークを利用したロボットサービス研究専門委員会」にて講演させていただきました

日本ロボット学会の研究専門委員会の1つ「ネットワークを利用したロボットサービス研究専門委員会」の2018年度第二回研究会にて「ROSの10年間と動向」と題して講演させていただきました.

お伝えしたいことが多すぎて質疑応答の時間を押してしまいましたが,まとまったお話をできる機会をいただき感謝しております.

ROSを導入する際の社内での周知や疑問点の解消のための出張プレゼンテーションも承っております.
出張ワークショップ,ROSコンサルティングサポート,その他OSSに関するご相談も承っております.

お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp

ROS コンサルティングサポート

著者:Ryosuke Tajima

夏季休業期間のお知らせ

日頃より弊社サービスをご愛顧賜り,誠にありがとうございます.
弊社では,下記の期間を全社一斉の夏季休業とさせていただきます.

夏季休業期間:2018年8月11日(土)~2018年8月19日(日)

休業期間中にいただきましたE-mail等のお問い合わせにつきましては,8月20日(月)より順次対応とさせていただきます.

お客様には大変ご不便をおかけいたしますが,何卒ご理解のほど,宜しくお願い申し上げます.

著者:Yumiko Suzuki

ROSワークショップ初級編を開催しました

今回も有楽町にてROSワークショップ初級編を開催しました.
ご参加いただいた皆様,お疲れ様でした!

初級編では環境の構築からセンシングデバイス,サーボの実機をROSで動かすところまで半日で習得できます.
時間中にはROSに関するお困りごとだけでなく,社内でOSSを運用していく際の疑問点等にも随時お答えしています.

8月のワークショップ日程を公開中です!

出張ワークショップ,プライベートワークショップ,その他OSSに関するご相談も承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp

著者:Yumiko Suzuki

2018年8月のROSワークショップ日程

以下日程でROSワークショップを行います.
名古屋でも開催いたします!

8月7日(火)13:30~ (名古屋) ROSワークショップ初級編
8月8日(水)13:30~ ROSワークショップ初級編
場所は都内・有楽町の会議室または名古屋市内での実施を予定しています.

プライベートでのお申込みが大変増えております.
人数が揃うようでしたら,プライベートでのワークショップ,出張のワークショップも開催可能です.

中級編については公開されている日程以外はご要望があり次第,日程を調整にて開催いたします.
メイルにてお問い合わせください.
(初級者以上,初級編を受講した方を対象としております.中級マニピュレーション編のページまたは中級・自律移動編のページをご参照ください)

お申込みは以下より詳細をご確認の上,ページ内のお申込みリンクよりエントリをお願い致します.

ROSワークショップ初級編

上記以外での日程の調整,その他ご相談,開発委託,出張ワークショップ,カスタマイズワークショップも承っております.
お気軽にご相談ください.
info[at]opensource-robotics.tokyo.jp

IMG_20151112_182120

著者:Yumiko Suzuki

2018年7月のROSワークショップ日程

以下日程でROSワークショップを行います.
名古屋でも開催いたします!

7月24日(火)13:30~ (名古屋) ROSワークショップ初級編
7月25日(水)13:30~ ROSワークショップ初級編
場所は都内・有楽町の会議室または名古屋市内での実施を予定しています.

プライベートでのお申込みが大変増えております.
人数が揃うようでしたら,プライベートでのワークショップ,出張のワークショップも開催可能です.

中級編については公開されている日程以外はご要望があり次第,日程を調整にて開催いたします.
メイルにてお問い合わせください.
(初級編を受講した方を対象としております.中級マニピュレーション編のページまたは中級・自律移動編のページをご参照ください)

お申込みは以下より詳細をご確認の上,ページ内のお申込みリンクよりエントリをお願い致します.

ROSワークショップ初級編

上記以外での日程の調整,その他ご相談,開発委託,出張ワークショップ,カスタマイズワークショップも承っております.
お気軽にご相談ください.
info[at]opensource-robotics.tokyo.jp

IMG_20151112_182120

著者:Ryosuke Tajima

ROS-I Asia Pacific Workshopに参加します

6月27日,28日にシンガポールで開催される,ROS Industrial Asia Pacific WorkshopにTORKも参加します.

SwRI, FaunhoferIPAといった北米,EUのROS-Iデベロッパーからの講演や, OpenRobotics, ADLINK,ボーイング,といった企業メンバからの発表があります.どのような話が聴けるのでしょうか.

TORKも現在開発中のパッケージなど,幅広い活動をアピールしていきたいと思います.内容についてはまたブログにて報告します.

著者:Ryosuke Tajima

ロボットアームのジョグ動作のためのパッケージ “jog_control” (1)

ROSMoveIt!は,ロボットアームのための非常に強力なツールです.ROSの基本機能とros_controlの枠組みにより,どのようなロボットアームも統一的なインターフェースで動かすことができます.その上で動くMoveIt!は,障害物の回避や拘束条件を考慮したロボットアームの動作計画を,色々なアルゴリズムを使って簡単に行うことができます.ROS-Industrialレポジトリを見ると,色々な産業用ロボットアームをROSとMoveIt!を使って動作させるためのパッケージが,すでに公開されています.これらの機能は,産業用ロボットアームをROSで使おうという大きな動機となっています.

しかし実際に使ってみると,産業用ロボットアームがあたりまえに備えている機能が,逆にROSには無いことに気づくのではないでしょうか? それは,ジョグ動作とティーチングです.

ジョグ動作というのは,ロボットの関節や手先を実際にちょっとずつ動かして,目標のロボット姿勢に到達させる機能です.ジョグ動作により,ロボットを目視しながらロボットの関節角度の微小な変位量を連続して与えて動かすことができ,ワークとの位置合わせなどでは必須の機能です.MoveIt!のrvizプラグインはGUI(Interactive Marker)でロボットの手先の目標位置姿勢をマウスで指定することができます.しかし,ロボットが仕事をする姿勢は実際にロボットを環境に置いて動かして指定するのですが,やってみるとrvizプラグインでは思い通りに動かすのは少し,いえ,かなり難しいです.

ティーチングというのは,目的のロボットの姿勢を覚えさせた上で,目的のタスクに対してその到達の順番や条件を記述するプログラミングのような機能です(非常に簡略化した説明です).

市販の産業用ロボットでは,コントローラとティーチングペンダントにこれらの機能が内蔵されているのが普通です.そのため,そちらの機能を使うことで補うことも出来ますが,たとえばROSネイティブなロボットではそのような機能が無いため,ロボットになにかタスクをやらせようとした時にいきなり困ってしまうことになります.

“jog_controll”メタパッケージは,ROS及びMoveIt!に,ジョグ動作の機能を追加します.

関節に微小な関節角度を与えて動作させる関節ジョグ(joint jog)と,手先や目標座標系に位置と姿勢の微小な変位を与えて動作させるフレームジョグ(frame jog)の2つをサポートしています.

“jog_msgs”パッケージは,ジョグ動作の指令値を与えるための新たなメッセージパッケージです.関節ジョグの変位量を与えるJogJoint.msgと,フレームジョグの変位量を与えるJogFrame.msgを含んでいます.

“jog_controller”パッケージは,これらのメッセージを受け取り,実際にロボットを動かすためのパッケージです.いまのところ,関節ジョグのためのjog_joint_nodeと,フレームジョグのためのjog_frame_nodeがあります.また,これらの指令値を与えるためのrvizパネルプラグイン”JogJointPanel”と”JogFramePanel”を含んでいます.

これらのパッケージを使えば,UR5, Denso VS060, TRA1, NEXTAGE Openや,ROS-Iのレポジトリにある種々のロボットアームをジョグ動作させることが出来るようになります.

UR5のフレームジョグ動作

ABB IRB2400のジョグ動作

これらのパッケージはまだ開発中で,機能や動作確認はまだまだ足りておらず,ドキュメントも不足しています.興味を持たれた方は,ぜひ自分のロボットで使ってみて,Issuesなどで不具合や動作の報告をしてください.フィードバックをいただくことでより優れたパッケージにしていきたいと思っています.

ティーチング機能についても新たな取り組みが行われています.これについてはまた別の記事で紹介したいと思います.

著者:Yumiko Suzuki

2018年6月のROSワークショップ日程

以下日程でROSワークショップを行います.
名古屋でも開催いたします!

6月18日(月)13:30~ (名古屋) ROSワークショップ初級編
6月20日(水)13:30~ ROSワークショップ初級編
場所は都内・有楽町の会議室または名古屋市内での実施を予定しています.

プライベートでのお申込みが大変増えております.
人数が揃うようでしたら,プライベートでのワークショップ,出張のワークショップも開催可能です.

中級編については公開されている日程以外はご要望があり次第,日程を調整にて開催いたします.
メイルにてお問い合わせください.
(初級編を受講した方を対象としております.中級マニピュレーション編のページまたは中級・自律移動編のページをご参照ください)

お申込みは以下より詳細をご確認の上,ページ内のお申込みリンクよりエントリをお願い致します.

ROSワークショップ初級編

上記以外での日程の調整,その他ご相談,開発委託,出張ワークショップ,カスタマイズワークショップも承っております.
お気軽にご相談ください.
info[at]opensource-robotics.tokyo.jp

IMG_20151112_182120

著者:Yumiko Suzuki

第7回IoT/M2M展にてROS化したIMU ADIS16470が展示されます!

先日,ブログでアナログ・デバイセズ株式会社のIMU用パッケージadi_driverについてご紹介しました.

アナログ・デバイセズのIMU用パッケージ”adi_driver”をリリースしました!

TORKがROS化をお手伝いさせていただきました ”IMU ADIS16470モジュール” が 第7回 IoT/M2M展 にて展示されます!
http://www.m2m-expo.jp/Home_Haru/

期間:5月9日(水)から11日(金)
会場:東京ビッグサイト
ブース:西7-48(西ホール1階A会場)

IMUを搭載した自動走行ロボットの静展示とADIS16470のROSのデモが予定されています.
購入相談もできる展示会となっているそうです.
是非,現地会場にて実物とデモをご体験ください!

小型で高性能なIMUのブレイクアウトボードです

著者:Yumiko Suzuki

2018年5月のROSワークショップ日程

以下日程でROSワークショップを行います.
名古屋でも開催いたします!

5月17日(木)13:30~ ROSワークショップ初級編
5月22日(火)13:30~ (名古屋) ROSワークショップ初級編
場所は都内・有楽町の会議室または名古屋市内での実施を予定しています.

プライベートでのお申込みが大変増えております.
人数が揃うようでしたら,プライベートでのワークショップ,出張のワークショップも開催可能です.

中級編については公開されている日程以外はご要望があり次第,日程を調整にて開催いたします.
メイルにてお問い合わせください.
(初級編を受講した方を対象としております.中級マニピュレーション編のページまたは中級・自律移動編のページをご参照ください)

お申込みは以下より詳細をご確認の上,ページ内のお申込みリンクよりエントリをお願い致します.

ROSワークショップ初級編

上記以外での日程の調整,その他ご相談,開発委託,出張ワークショップ,カスタマイズワークショップも承っております.
お気軽にご相談ください.
info[at]opensource-robotics.tokyo.jp

IMG_20151112_182120

著者:Ryosuke Tajima

Let’s Bloom! – ROSパッケージをリリースしよう

パッケージビルド,してますか?

ROSはオープンソースのプロジェクトですが,実はソースコードから使っている人はほとんどおらず,皆さんapt install してバイナパッケージをインストールしているのではと思います.先日のROSについてのアンケートでも,パッケージをコードからビルドしているという人の割合は12%ぐらいでした.

このバイナリパッケージ,誰でも自分で作れて配布できることを知っていましたか?

パッケージはどこから来るの?

パッケージの作成と配布のしくみについては,以下のROS Wikiに説明があります.

この公開用ビルドファーム(Jenkinsサーバ)でビルドされます.

build.ros.orgの画面

眺めていると,たくさんのパッケージが次々とビルドされていきます.ほとんどのパッケージはビルド時にテストも実行されるようになっていて,パッケージが(ある程度)正しく動くことを確認しています.新しくパッケージをリリースしたり,バージョンアップした時にはもちろん,依存しているパッケージが更新された時にもビルドしなおされます.ROSパッケージは他のパッケージに依存していることが多いので,他のパッケージが変更された時にもビルドが失敗することがあります.ビルドに失敗した場合にはパッケージメンテナにメールで通知され,解決にあたります.ROSのシステムは非常に大きいので,整合性を取るにはこのような仕組みが不可欠なのです.

ビルドされたパッケージはしばらくShadowレポジトリに置かれ,動作確認などに使われます.

1か月に1回ぐらい,Syncと呼ばれる操作でShadowレポジトリから公開用レポジトリにコピーされ,一般ユーザがaptで取得できるようになります.ROS DiscourseにSyncのお報せが定期的に投稿されるので,見たことがあるかも知れませんね.

リリースされたROSパッケージの状態は,このページを見るのが便利です.パッケージ名や状態で検索することが可能です.

bloom – リリースのためのツール

この仕組みに自分のパッケージを乗せ,バイナリパッケージをみんなに使ってもらうにはどうすれば良いのでしょうか? bloomというツールを使って,実は意外と簡単にできます.bloomの使い方は,ROS Wikiをご覧ください,

今回,bloomのROS Wikiのうち,必要最小限と思われるところを日本語訳してみました.よく読んで,ぜひパッケージのリリースやメンテナンスに挑戦してみてください.現在はとても少ないですが,日本からのROSパッケージの公開やROSメンテナーが増えて欲しいと願っています.

よく分からないことがある場合には,検索したり,ROS Answersで質問しましょう.一つ注意として,ROS Discourse本体は議論のための場なので,質問を投稿してはいけません.ただし,ROS DiscourseのJapan User Groupは例外的に何を投稿してもよいことになっており,そこで質問しても大丈夫です.日本語でOKです.

また,TORKではROSパッケージのリリースやメンテナンスの代行もお請けしています. ご興味のある方は,info [at] opensource-robotics.tokyo.jpまでご相談ください.

著者:Ryosuke Tajima

対決!低価格LIDAR(4) 屋内実験編

前回はROS対応を比較してみました.今回は実データでの比較を紹介します.

データ比較(屋内)

自宅のリビングルームにて計測を行った結果の動画を以下に示します.ロボットでの使用を考えて,センシングの高さは15㎝としました.センサのまわりを一周歩きまわっています.

RPLIDAR A2 (10Hz)

部屋の形がきれいに写っていて,周りを歩く足もちゃんと半円状に見えています.

Sweep (10Hz)

部屋の形はなんとなく分かります.足も写っていますが,形状までは分からないです.

Sweep (3Hz)

RPLIDAR A2とほぼ同じ解像度の点群になり,部屋の形が分かります.足の形状はぼんやりしていて,更新が遅いので分かりにくいです.

屋内まとめ

屋内で使うのであれば,角度分解能と距離の計測精度の点で,RPLIDAR A2が良さそうですね.これまでの使用でも,通常のリビングやオフィスのような屋内のSLAMで,RPLIDAR A2は全く問題なく機能しました.

次回は,屋外での計測結果を見てみます.

著者:Yumiko Suzuki

ROSワークショップ初級編を開催しました

今回も有楽町にてROSワークショップ初級編を開催しました.
ご参加いただいた皆様,お疲れ様でした!

初級編では環境の構築からセンシングデバイス,サーボの実機をROSで動かすところまで半日で習得できます.
時間中にはROSに関するお困りごとだけでなく,社内でOSSを運用していく際の疑問点等にも随時お答えしています.

5月のワークショップ日程を公開中です!

出張ワークショップ,プライベートワークショップ,その他OSSに関するご相談も承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp

著者:Ryosuke Tajima

対決!低価格LIDAR(3) ROS対応

ROS対応

前回は低価格LIDARの仕様を比較をしてみました.今回はROS対応を見ていきましょう.

RPLIDAR A2とSweepは,それぞれSDKが公開されているので自作のソフトウェアからデータを使うことが可能です.しかしやはりロボットに使うのであれば,ROSを使わない手はないでしょう.ここではROSの対応状況を見てみます.

RPLIDAR, Sweepともに,ROSドライバのコードがすでに作成されています.

Sweepはまだリリースはされておらず,ソースからのビルドが必要です.

RPLIDARはすでにリリースされているので,aptでインストールすることが可能です.

$ sudo apt install ros-kinetic-rplidar-ros

センサの起動

どちらも付属のlaunchファイルで簡単にデータを取得してrvizで見ることができます.

RPLIDAR A2:

$ roslaunch rplidar_ros view_rplidar.launch

Sweep:

$ roslaunch sweep_ros view_sweep_pc2.launch

メッセージの違い

rolidar_rosは,sensor_msgs/LaserScanメッセージを出力します.

一方sweep_rosは,sensor_msgs/PointCloud2を出力します.これは,前述したように,Sweepの計測が回転と同期していないためだと思われます.ただし,scan_tools/pointcloud_to_laserscanを使うことで,PointCloud2メッセージをLaserScanメッセージに変換することができます.

Rvizで表示

同じ場所でデータを可視化してみました.

RPLIDAR A2(10Hz)

RPLIDAR A2はデフォルトの設定で部屋の形がよく分かります.ロボットの地図生成や自律移動に充分使えることも確認しています.

一方のSweepですが,デフォルトの状態で同じ10Hzで回転させた時のデータがこちらです.

Sweep(10Hz, sample_rate=500Hz)

うーん,やはり同じ速度だとSweepの粗さが目立ちますが,しかし,なんだかさすがに解像度が低すぎないかな?

と思ってチェックしたら,sweep_rosノードのデフォルトのサンプルレートが500Hzで最大仕様(1kHz)の半分になっていることに気づきました.うーんこれはデフォルトで最大性能が出るようにしておいてもらいたいところですが,サンプルレートのパラメータsample_rateを1000に設定して,もう一度データをとってみました.

Sweep (10Hz, sample_rate=1kHz)

だいぶ詳細度が上がりました.しかし,RPLIDAR A2に比べると,部屋の形状がかなり分かりにくいですね.

そのまま,スキャン速度を3Hzに落としてみます.

Sweep (3Hz, sample_rate=1kHz)

このくらいなら部屋の形が分かりますね.回転速度が下がった分,RPLIDAR A2よりも更新周期が3倍程度長くなっています.
次は,動画でデータを比べてみましょう.

著者:Ryosuke Tajima

9/14 ROSCon Japan 開催決定!

ROSの開発者会議 ROSConが,今年は日本でも開催されることになりました!

スペイン・マドリッドで開かれるROSCon2018の前前週の9月14日(金)に,東京・秋葉原での開催となります.ROSの創始者のBrian Gerkey氏も来日して基調講演を行うとのことです.

一般の講演も4月中旬から申し込みが開始されます.この機会にご自身のROSプロジェクトなどを発表してみてはいかがでしょうか.

とても楽しみですね! TORKも一緒になって盛り上げて行きたいと思います.

著者:Yumiko Suzuki

2018年4月のROSワークショップ日程

以下日程でROSワークショップを行います.
名古屋でも開催いたします!

4月05日(木)13:30~ ROSワークショップ初級編
4月10日(火)13:30~ (名古屋) ROSワークショップ初級編
4月17日(火)13:30~ ROSワークショップ初級編
4月23日(月)13:30~ (名古屋) ROSワークショップ初級編
4月26日(木)13:30~ ROSワークショップ初級編
場所は都内・有楽町の会議室または名古屋市内での実施を予定しています.

中級編については公開されている日程以外はご要望があり次第,日程を調整にて開催いたします.
メイルにてお問い合わせください.
(初級編を受講した方を対象としております.中級マニピュレーション編のページまたは中級・自律移動編のページをご参照ください)

お申込みは以下より詳細をご確認の上,ページ内のお申込みリンクよりエントリをお願い致します.

ROSワークショップ初級編

上記以外での日程の調整,その他ご相談,開発委託,出張ワークショップ,カスタマイズワークショップも承っております.
お気軽にご相談ください.
info[at]opensource-robotics.tokyo.jp

IMG_20151112_182120

著者:Ryosuke Tajima

対決!低価格LIDAR(2) 仕様編

製品仕様

前回は低価格LIDARを紹介しました.
今回は,双方の仕様を見ながら比較してみましょう.

大事な注意です!

  • 実際に使う場合には,必ずご自分で仕様を確認してください!
  • この記事に誤りがあったせいであなたのプロジェクトが上手くいかなくても,TORKは責任はとれません!

原理

産業用LIDARはToF(Time of Flight)方式による距離の計測が多く使われています.これは,レーザ光が対象物に反射してセンサに返ってくるまでの時間を計測して,距離を計算する方式です.SweepはToF方式による距離計測を行っています.対して,RPLIDAR A2はToFではなく,三角測量の原理を使っています.これは,発光点,反射点,受光点が三角形を構成するようにしてあって,受光点の変位をセンサで測定することで,反射点までの距離を測る方式(分かりますよね?)です.

一般的には三角測量の方が簡単そうですが,反射点までの距離が大きくなると,たとえ反射光を計測できたとしても距離の分解能は落ちていきます.一方ToFは,反射点までの距離が大きくなっても(反射光を計測出来る限り)分解能が落ちないので,最大計測距離を大きくできます.

もうひとつ大きな違いがあります.RPLIDAR A2は,サンプリングが角度に同期して行われています.つまり,計測が行われるレーザの角度は,回転ごとに(微妙なズレはあるにしても)同じです.一方Sweepは,角度が0の位置にスキャン開始は同期しているものの,各距離計測は角度には同期していません.Sweepの仕様はセンサから得られるデータが角度と距離のセットになっています.Sweepが発光するレーザは単発のパルスではなくパターンをもたせていて,そのためにサンプルレートが一定ではない(デフォルトで500~600Hzと幅がある)ので,このようになっていると思われます.

URGやSICKといったハイエンドの2次元LIDARは,角度に同期した距離が取得できる方式ですので,Sweepの方式はちょっと使いにくい気がします.

角度分解能,計測周期,サンプルレート

LIDARで重要な性能として,角度分解能と計測周期があります.角度分解能は計測点の角度の細かさで,分解能が低いと対象物や環境の計測点が少なすぎて,計測したものの形がよく分からなってしまいます.計測周期は1スキャン(1回転)にかかる時間で,計測周期が大きいと,動くものを計測したり,ロボット自身が動いたりしたときに,正確な計測が難しくなります.

2つのセンサはどちらも,光源と計測部分が一体化した部分を回転させて,周囲の計測を行っています.RPLIDAR A2は5Hzから15Hzまで回転速度が可変なのですが,回転速度によらず計測点の数は同じ(400点)です.

Sweepは,1Hzから10Hzまで回転速度が可変ですが,サンプルレートが最大1000サンプル/秒(正確には1000~1025と幅がある)ので,回転速度が早いほど1回転あたりの計測点の点数は少なくなっていきます.

  • RPLIDAR A2 : 400サンプル/回転
  • Sweep : 1000サンプル/秒

もし両方とも,10Hzで回転している場合には,

  • RPLIDAR a2 : 400サンプル/回転
  • Sweep : 100サンプル/回転

となるので,RPLIDAR A2のほうが角度分解能が4倍高いことになります.Sweepで同じ分解能を得たい場合には,周期を1/4(2.5Hz)で回転させる必要があります.

最大計測距離と距離分解能

最大計測距離も重要な性能です.もちろん遠くまで計測できるに越したことはないですが,たとえば経験上,オフィスのナビゲーションであれば10mもあれば充分ですし,自動運転のような用途であれば100mでも足りないでしょう.

RPLIDAR A2は,ややこしいことに,機種によって計測距離が違います.購入の際には,型番に注意が必要です.今回使ったのは計測距離が最大8mのRPLIDAR A2M8です.

  • RPLIDAR A2M4 最大計測距離 6m
  • RPLIDAR A2M8 最大計測距離 8 m
  • RPLIDAR A2M6 最大計測距離16 m

一方Sweepは,最大計測距離が40mとなっています.

ちなみに,近い側の限界である最小計測距離は,両方とも同じくらいです.

  • RPLIDAR A2M8 最小計測距離 0.15 m
  • Sweep 最小計測距離 0.15 m

距離分解能はどうでしょうか.RPLIDAR A2M8の距離分解能は,

  • 1.5m以下の場合 0.5mm以下
  • それ以上の距離では距離の1%以下

とあり,近い方が分解能が高くなっています.近いと物体の形状がちゃんととれる感じです.かわりに,距離が遠くなると,分解能,精度ともに落ちていくことが予想できます(仕様書には誤差についてはデータがありませんでした).

一方,Sweepの方は,計測距離にかかわらず,

  • Sweep 距離分解能 1cm

となっています.Sweepの仕様書には距離の計測誤差のグラフも掲載されていますが,計測距離が長くなっても,誤差が増えていないことが分かります.ToF方式の特徴と言えます.

Sweepの計測誤差 (Sweepマニュアルより抜粋)

 

外形その他

どちらもかなり小型ですが,上部の部品が回転するので,触ったりしないようにする設置が必要です.

  • RPLIDARa2 : 直径 70mm
  • Sweep: 直径 65 mm

Sweepの方は,ケーブルコネクタが横と下の2つの向きになっていて,配線がしやすい感じです.RPLIDARはケーブルが直出しなのでケーブル長を短くするのがちょとやりにくそうです.

Sweepの裏側のコネクタ

どちらも,USBで接続された場合には,USBバスパワーで動作します.また,マイコンなどのUARTで通信することができますが,その場合には別途電源が必要です.

まとめ

外形が同じように見える2つのセンサですが,実は設計思想が少し違うことが分かります.RPLIDAR A2は近距離,屋内用で,Sweepは遠距離,屋外用の仕様であると言えます.ちょっとSweepの角度分解能が低いのが気になります.

次は,ROSで使う際の比較です.

著者:Ryosuke Tajima

アナログ・デバイセズのIMU用パッケージ”adi_driver”をリリースしました!

新しいROSパッケージ,adi_driverをリリースしました!

これは,ADI(Analog Devices Inc.)のセンサのためのドライバパッケージです.現在は,ADIS16470と,ADXL345(実験的)をサポートしています.

小型で高性能なIMUのブレイクアウトボードです

ADIS16470は3軸のジャイロセンサと3軸の加速度センサを組み込んだIMUの新製品です.特徴は,非常に広い計測レンジを持っている点です.角速度のレンジは±2000 [deg/sec],加速度のレンジは±40 [g] です.これは,車輪移動ロボットやドローン,マニュピレータといった様々なロボットに充分すぎるほどの性能です.
センサ単体の価格は199ドル,ブレークアウトボードの価格は299ドルです.詳しくは,製品のページをご覧ください.

センサのブレイクアウトボードと,USB-SPI変換器(USB-ISS)を用意すれば,このパッケージで簡単に3次元の姿勢情報を利用することができます.詳しいやり方は,githubのドキュメントをご覧ください.もし問題にぶつかった場合は,Issuesで報告をお願いします.

どうぞ,ご利用ください!

著者:Ryosuke Tajima

対決!低価格LIDAR(1) RPLIDAR A2 vs Sweep

ロボットのキーデバイス-LIDAR

自律移動ロボットのキーデバイスといえば,LIDAR(Light Detection and Ranging)です.これは,レーザ光線(通常,赤外線レーザ)を周囲に発光して物体に当たった反射光を検出して,対象物までの距離を測るセンサです.

よく使われるのは,一本のレーザ光を回転させて,平面上のセンサからの距離を測る2次元型の製品です.たとえば,SICK社北陽電機の製品です.

SICK社のLIDAR製品

URGシリーズ (北陽電機)

もともと移動ロボットの研究では,環境を計測して地図を作ったり,自律移動をするためにLIDARが使われてきました.また,2007年のDARPA Urban Challengeでは,Velodyne社が画期的な3次元LIDARソリューションを提供し,自動運転車の一つのブレイクスルーを引き起こしました.

LIDARの破壊的イノベーション?

これらのLIDAR製品はもともと産業用で,たとえば工場の生産装置や安全装置に使われています.そのため,頑丈さや防水などの機能を備え,反面かなり高価なものになります.研究開発の業務ならともかく,個人で簡単に買えるようなものではありません.

しかし最近,低価格なLIDARが一般販売されるようになってきています.これは,産業用には性能や信頼性は足りないけれど,ホビーや研究用には充分かつ簡易な機能を提供しています.個人的見解ですが,もしかしたら「破壊的イノベーション」的な製品で,今後,思ってもみない用途に使われていくのではないかと思っています.

今回は,そのうちの2つ,

RPLIDAR A2 (Slamtec社)

Sweep (Scanse社)

を紹介します.まずは製品仕様を比較しましょう.
 

著者:Ryosuke Tajima

信州大学 山崎研究室でHiroに会いました!

山崎研究室の皆さん

2月某日,信州大学山崎研究室を訪問させていただきました.TORKの最近の活動や,ROSの最新情報などを紹介して意見交換しました.皆さん熱心に聞きながら,質問もたくさん出ました.

なかなかレアな台車付きHiro

山崎研究室に2台あるHiroも見せていただき,最近追加されたMoveIt!の機能の確認を一緒に行ったり,使用している際に出てきた疑問についても,出来る限りお答えしました.

山崎研究室では,タオルやシャツのように布でできた柔軟物を器用に扱うための研究を行っています.どんどん器用になっていくロボットが楽しみですね.

山崎先生と研究室の学生の皆さん,ありがとうございました!

著者:Ryosuke Tajima

ROSワークショップ中級・自律移動編を2月20日(火)に東京で開催します

来たる2月20日(火)に,ROSワークショップ中級・自律移動編を東京にて開催します.ROSでの自律移動(ナビゲーション)を学びたい方は,これを機会にぜひ受講をご検討ください.

基本的にはROSワークショップ初級編を受講した方を対象としておりますが,それに準ずると思われるROSの経験がある方なら,受講いただけます.お申込みは詳細をご確認の上,ページ内のお申込みフォームよりエントリをお願い致します.なお,参加人数には限りがあり,先着順とさせていただきますのでご了承ください.

シミュレーション環境での自律移動

ワークショップでは,まずシミュレータを動かしながら自律移動の概要を学ぶハンズオンを行います.次に,掃除ロボットRoomba(ルンバ)とラズベリーパイ(Raspberry Pi),低価格なレーザセンサRPLIDARで構成された自律移動ロボット”Roomblock”を用いて,実機の操作,地図の生成,自己位置推定といった自律移動の機能とプログラミング方法を学びます.最後に,ROSの自律移動の構成とその要素について,より詳しく解説していきます.シミュレータと実機を用いた実践的なワークショップとなっています.

自律移動ロボットRoomblock

来年度のロボット開発に向けて,今年度中にROSをマスターするチャンスです.ぜひご検討ください.

著者:Ryosuke Tajima

新型aiboがやってきました!

ソニーのペットロボット”aibo”がTORKにも届きました!

名前は「TORKちゃん(♀)」としてみました.

発表時に,「ROSが搭載されている」ということが明言されていて話題になっていましたが,本当に搭載されているようです.

搭載されているオープンソースソフトウェアの一覧とライセンスは,以下のページで確認することができます.

また,そのうちソースコードの公開が必要なものに関しては,ここからダウンロードできるようになっています.

ちょっと調べた感じでは,ユーザからaiboのシステムにアクセスできそうな手段は見つからないのですが,そのうちSDKなどが公開されるのではないかと期待できます.それまではとりあえず,このかわいいペットロボットを楽しみましょう!

 

著者:Yumiko Suzuki

ROS開発におけるエディタ選択 ( Visual Studio Code + ROS 編 )(2)

前回は, Visual Studio Code にROSのプラグインをインストールした環境でパッケージ作成するお話をしました.
今回はこの環境を使ってC++プログラムを作成していきます.

 

C++でコード作成

今回はros wikiのチュートリアルで用いられているコードを元に進めます.コードの詳細についてはこちらからお願いします.

パッケージが作成されていると左側のエクスプローラーのcatkin_ws/src/sample_vs_code以下にsrc,includeディレクトリが作成されています.srcディレクトリを選択し右クリックで「新しいファイル」を選択し,talker.cpp,listener.cppを作成します.

talker.cpp

#include "ros/ros.h"
#include "std_msgs/String.h"

#include 

int main(int argc, char **argv)
{
  ros::init(argc, argv, "talker");

  ros::NodeHandle n;

  ros::Publisher chatter_pub = n.advertise("chatter", 1000);

  ros::Rate loop_rate(10);

  int count = 0;
  while (ros::ok())
  {
    std_msgs::String msg;

    std::stringstream ss;
    ss << "hello world " << count;
    msg.data = ss.str();

    ROS_INFO("%s", msg.data.c_str());

    chatter_pub.publish(msg);

    ros::spinOnce();

    loop_rate.sleep();
    ++count;
  }

  return 0;
}

listener.cpp

#include "ros/ros.h"
#include "std_msgs/String.h"

void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
  ROS_INFO("I heard: [%s]", msg->data.c_str());
}

int main(int argc, char **argv)
{
  ros::init(argc, argv, "listener");

  ros::NodeHandle n;

  ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);

  ros::spin();

  return 0;
}

 
この時のCMakeListは以下のようになります.
CMakeLists.txt

cmake_minimum_required(VERSION 2.8.3)
project(sample_vs_code)

## Find catkin and any catkin packages
find_package(catkin REQUIRED COMPONENTS roscpp std_msgs genmsg)

## Generate added messages and services
generate_messages(DEPENDENCIES std_msgs)

## Declare a catkin package
catkin_package()

## Build talker and listener
include_directories(include ${catkin_INCLUDE_DIRS})

add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})

add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})

これらはROS Wikiのチュートリアルをそのまま引用しています.上記のコードをコピーアンドペーストしたらCtrl+sで保存します.

 

catkin_make

それではコンパイルしてみます.コンパイルはcatkin_makeコマンドにより行います.VS Codeでは上記のメニューバーから「タスク」➡︎「ビルドタスクの実行」(もしくはCtrl+Shift+b)で「catkin: make」を選択します.すると下部にターミナルが生成され,catkin_makeが実行されます.

 

rosrun & roslaunch

コンパイルが完了したら実際に実行します.catkin_makeによりtalkerとlistenerというノードが作成されましたので,これらを起動します.

まずはroscoreを立ち上げます.roscoreはコマンドパレットを起動し,「ROS: Start Core」を選択して起動します.起動ができていると左下のROS Masterという項目にチェックが入ります.

roscoreが立ち上がったら試しにrosrunコマンドでtalkerノードを起動してみます.VS Codeからrosrunコマンドを使用するには,F5を押して「ROS」➡︎「rosrun」でパッケージ名,ノード名を入力し起動します.そうすると下部にデバッグコンソールが立ち上がり,hello worldと回数が表示されます.

続いて複数ノードの起動ですが,VS Codeでは元々複数の実行ファイルの起動ができないので,talker,listenerノードをlaunchファイルでまとめて起動します.sample_vs_codeディレクトリ以下にlaunchディレクトリを作成し,以下のコードをchatter.launchというファイル名で保存します.

chatter.launch

<?xml version="1.0"?>
<launch>
    <node pkg="sample_vs_code" name="talker" type="talker" />
    <node pkg="sample_vs_code" name="listener" type="listener" />
</launch>

 
roslaunchコマンドはrosrunコマンドの時と同じくF5を押して「ROS」➡︎「roslaunch」でパッケージ名,launchファイル名を入力して起動します.これらはターミナルに結果を出力するのでVS Code上で表示の確認ができないのですが,ここではきちんとノードが起動されているかどうかの確認のみを行います.一旦別途ターミナルを起動してrosnode listにより起動できているか確認します.

/listener
/rosout
/talker

と出ていればOKです.

 

終わりに

VS Codeのプラグインを使用することによってIDEを使用する感覚でROSプログラミングをすることができました.シミュレータや可視化ツールなどを同時に起動しているとPCの挙動が重くなってしまうのですが,VS Codeはそのものが高速かつ軽量なため,バックグラウンドで立ち上げっぱなしにしていても問題ないのが魅力です.

段々とLinux環境での開発に慣れてくるとコマンドラインベースでrosrunやroslaunchをした方が早く感じるかもしれませんが,それでもエディタやコンパイルツールとしてVS Codeを使うのは比較的おすすめなやり方だと思うので是非使ってみてください.

--
CIT 山本龍

著者:Yumiko Suzuki

ROS開発におけるエディタ選択 ( Visual Studio Code + ROS 編 )(1)

前回はVisual Studio Codeの環境でC++のプログラムを実行する手順をご紹介しました.
今回はROSプラグインを活用する方法について説明します.

Visual Studio Codeのプラグイン

ROSプログラミングで度々面倒になるのが,一旦エディタを閉じてワークスペーストップまで戻りコンパイル,複数のターミナルを開いてノードを実行と言った手間です.できれば一つのターミナル,欲を言えばエディタを開いたまま全て完結させたいものです.

前回VS Codeを使用しプログラミング,コンパイルを一つのエディタ上で行う方法の話をしました.今回は前回の拡張として,ROSプログラミングをVS Code上で完結するためのプラグインのお話をします.

 

ROSプラグインのインストール

ここからは

  1. Ubuntu環境にROSがインストール済み(今回はUbuntu16.04,ROS Kinetic)
  2. ROSのワークスペースが作成済み(今回はcatkin_wsという名前で作成)
  3. ワークスペースのパスが通っている(ここではsource ~/catkin_ws/devel/setup.bashがターミナル上で実行済み)

であるという前提で進めます.

左の拡張機能パネルを表示し,検索フォームに「ROS」と入れて一番上に表示されているものをインストールします.

 
インストールが完了しプラグインがアクティベートされると,ROSプラグインの機能が使えるようになります.
以下にROSプラグインを入れることによりVS Codeで使用できる機能を示します.

    • パッケージの作成
    • catkin_makeの実行
    • roscoreのスタート/ストップ
    • rosrun,roslaunchの実行
    • ROSトピックやサービスの確認

これらは全てVS Code上でバッグクラウンドで実行されます.これでターミナルを複数起動したり画面分割したりと言った手間がなく簡単に行うことができます.

 

ROSプラグインを使ってみる

それでは実際にROSプラグインを使ってみます.ターミナルから~/catkin_wsに移動し,code .で起動します.もしくはVS Codeを開き,メニューバーからcatkin_wsディレクトリを開きます.

ROSでコマンドを使用する際は基本的に全てターミナルからコマンドを打って操作しますが,VS Code内では全てコマンドパレットから操作します.

 

パッケージの作成

まずはパッケージを作成します.Ctrl+Shift+pでコマンドパレットを起動し,検索フォームにrosと入力するとVS Codeで使用できるコマンドの候補がいくつか出てきます.

「ROS: Create Catkin Package」がパッケージを作成するコマンドになりますのでこれを選択,パッケージ名を入力しEnterを押します.ここではsample_vs_codeと入力します.
続いて使用する依存パッケージの入力をします.ここではroscpp,std_msgs,genmsgを使用するので,roscpp std_msgs genmsgと入力します.ここまで行うとパッケージの作成が完了します.

試しにターミナルで

$ ls ~/catkin_ws/src

として確認するときちんとsample_vs_codeが作成されていると思います.

 
次回はVisual Studio Code + ROSの環境でのC++プログラム作成のお話をします.


CIT 山本龍

著者:Yumiko Suzuki

ROS開発におけるエディタ選択 ( Visual Studio Code編 ) (2)

前回はVisual Studio Codeについてご紹介しました.
今回はVisual Studio Codeの環境でC++のプログラムを実行する手順です.

C++プログラムのコンパイル

起動できたら,実際に簡単なC++プログラムを書いてコンパイル,実行してみます.

必要なプラグインのインストール

まず初めにC++コードをコンパイル,実行するのに必要なプラグインをインストールします.左側に拡張機能のパネルがありますのでそちらを表示し,検索フォームに「C++」と入力します.

そうしたら検索結果で一番上にでてきたものをインストールしましょう.インストールが完了したら設定を読み込ませるために再読み込みボタンを押して読み込ませます.これで必要なプラグインをインストールできました.その他にもプラグインを入れたい場合はそれぞれ検索してインストールすることで設定ファイルを書くことなくプラグインを入れることができます.非常に簡単です.

ファイル新規作成

C++プログラムをコンパイルする際は一旦事前に任意のフォルダを作成し,そこにファイルを新規作成します.ここではホームフォルダにtestというディレクトリを作成し,test.cppというファイルをコンパイルすると言った例で進めます.ターミナルを開き,

$ mkdir ~/test

としてフォルダを作成します.そうしたらVS Codeを開き上部メニューバーから「ファイル」➡︎「フォルダを開く」で先ほど作成したフォルダを開きます.ファイル新規作成はエクスプローラーから先ほど開いたフォルダを右クリックし「新規ファイル作成」で作成することができます.ここではtest.cppとしましょう.test.cppの中身は,例のごとくHello Worldを表示するプログラムにします.

#include 
#include 

int main(int argc, char *argv[])
{
    std::cout << "Hello, World!" << std::endl;
    getchar();
    return 0;
}

上記コードをコピーしたらCtrl+sで保存します.

コンパイル・実行

続いてコンパイルですが,ここは少し手間が必要になります.まずCtrl+Shift+pを押してコマンドパレットというものを表示し,検索フォームにtaskと入力します.いくつか候補が出てきますが,その中の「タスク:タスクランナーの構成」を選択します.そうするとtask.jsonというファイルが生成されます.task.jsonの中身は,以下のようにします.

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "0.1.0",
    "command": "g++",
    "isShellCommand": true,
    "args": ["-O2", "-g", "test.cpp"],
    "showOutput": "always"
}

Linuxはコンパイラにg++を使用し,コンパイル時にはターミナルを開いてg++コマンドにより行います.task.jsonはそれらをVS Codeから行うために必要になります.

task.jsonを書き換えたらCtr+Shift+bでコンパイルし,エラーが表示されなければ,カレントディレクトリにa.outという実行ファイルが生成されます.

実行ファイルが生成されたら,F5を押してデバッグを開始すると,launch.jsonファイルが生成されます.このファイルはVS Code上でデバッグするためのファイルになります.Linuxですとgdbというデバッガを使用するため,launch.jsonを以下のように書き換えます.

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceRoot}/a.out",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceRoot}",
            "environment": [],
            "externalConsole": true,
            "MIMode": "gdb"
        }
    ]
}

書き換えたら再度F5を押すとターミナルが別途表示され,「Hello, World!」と表示されていたら成功となります.

コードを変更した場合は都度保存してCtrl+Shift+bでコンパイルし実行します.

 

まとめ

VS Codeを使うことによりコマンドラインを使用することなくLinuxでプログラミングすることができました.またVS CodeではROSの開発をサポートするためのプラグインが公開されており,これらを使用することでターミナルをほぼ使わずにROSプログラミングをすることができます.

 
次回はそのROSプラグインを活用する方法について説明します.
--
CIT 山本龍

著者:Yumiko Suzuki

ROS開発におけるエディタ選択 ( Visual Studio Code編 ) (1)

はじめに

ROSプログラミングをするにあたり,対象のOSがLinuxであることから,コンソールベースでの開発に慣れていない方にとっては少々困惑することがいくつかあると思います.

プログラマが一般的に使用する一般的なエディタではVimやEmacsなどが知られているかと思われますが,これらは設定方法や操作方法など少し癖があったり,それらを行うために知らなければならないことがあったりするので少々敷居が高いかもしれません.

一方Windows OSでの開発に使用されているIDEとしてVisual Studioが多く使用されますが,対応OSがWindowsのみでありUNIX系OSで使用することができないのが惜しい点でした.

そこで2015年にMicrosoftから「Visual Studio Code(以下VS Code)」というツールがリリースされました.VS Codeは,WindowsだけでなくMacやLinuxでも動作し,インストールパッケージを用いることで簡単にインストールすることができます.LinuxをインストールしてROSで開発したいけど,Linuxのターミナルの使い方がよくわからない,どのエディタを使ってプログラミングすればいいかわからない,と言った方にVS Codeは非常にオススメできるツールだと思います.

 

Visual Studio Codeのインストール方法

今回はUbuntu16.04 ROS Kineticで実施しました.こちらのサイトにアクセスしてVisual Studio Codeをダウンロードします.Linux環境でアクセスするとdebパッケージがダウンロードできるボタンがあるのでそちらをクリックしてダウンロードします.ダウンロードが完了したらそのままdebパッケージをクリックするか,以下のコマンドをターミナルで入力するとインストールされます.

$ sudo dpkg -i <ダウンロードされたファイル名>

 

基本的な使い方

起動

インストールが完了したら,左上のドックからVisual Studio Codeと打つと候補で出てくるのでクリックすると起動します.

ちなみにターミナルからも起動することができます.ターミナルを開いている場合は以下のように

$ code

と入力すれば起動します.また,

$ code .

とするとカレントディレクトリを開いた状態でVS Codeが起動します.

次回は,Visual Studio CodeでC++プログラムのコンパイルについて解説します.


CIT 山本龍

著者:Yumiko Suzuki

THK株式会社様を訪問しました!

本日は,THK株式会社様を訪問して,ROS対応についてのお話をさせていただきました.

こちらのロボットはROSでも動くのです!
受注生産方式で購入できるそうです.
気になった方は以下のリンクをご参照ください.
お問い合わせ先:SEED Solutions

ROS導入,パッケージリリースや情報展開のご相談,その他OSSに関するご相談も承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp

著者:Ryosuke Tajima

ROSワークショップ中級・自律移動編を名古屋で開催しました

名古屋伏見でやってます

ROSワークショップ中級・自律移動編を名古屋にて開催しました.中級ともなりますと,ROSをすでにかなり使いこなしている方が参加されていて,非常にスムースにカリキュラムを進めることができました.

自律移動の体験

自律移動編では,シミュレーション上で一通りの機能を試してもらった後,ルンバベースの教材ロボットRoomblockを部屋やオフィスの廊下で動作させて地図を作っていただき,実機での運用を体験していただきます.その後,ROSでの自律移動の構成を説明していきます.カリキュラム以外のROSやロボティクスに関する質問,疑問にも出来る限りお答えします.

自律移動ロボットRoomblock

11月のワークショップ日程を公開中です!

ROSを初めて勉強する人へのブログも公開しています. ご参考になさってください.

プライベートワークショップ,その他OSSに関するご相談も承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp

著者:Yumiko Suzuki

2017年11月のROSワークショップ日程

以下日程でROSワークショップを行います.
名古屋でも開催いたします!

11月07日(火)13:30~ ROSワークショップ初級編
11月14日(火)13:30~ (名古屋) ROSワークショップ初級編
11月15日(水)13:30~ ROSワークショップ初級編
11月20日(月)13:30~ (名古屋) ROSワークショップ初級編
11月28日(火)13:30~ (名古屋) ROSワークショップ中級・自律移動編
11月30日(木)13:30~ ROSワークショップ初級編

場所は都内・有楽町の会議室または名古屋市内での実施を予定しています.

中級編については公開されている日程以外はご要望があり次第,日程を調整にて開催いたします.
メイルにてお問い合わせください.
(初級編を受講した方を対象としております.中級マニピュレーション編のページまたは中級・自律移動編のページをご参照ください)

お申込みは以下より詳細をご確認の上,ページ内のお申込みリンクよりエントリをお願い致します.

ROSワークショップ初級編

上記以外での日程の調整,その他ご相談,開発委託,出張ワークショップ,カスタマイズワークショップも承っております.
お気軽にご相談ください.
info[at]opensource-robotics.tokyo.jp

IMG_20151112_182120

著者:Ryosuke Tajima

Indigoの開発環境をDockerで構築(1)

Indigo? Kinetic?

ROSはどんどん新しくリリースされていきます.最新バージョンはLunar Loggerhead(Lunar)で,その前が,Kinetic Kame(Kinetic), その前がJade Turtle(Jade)という名前です.伝統的に,亀にちなんだ名前がつけられています.

しかし,実際にはその前のバージョンであるIndigo Igloo(Indigo)を使っている人もまだ多いかと思います.IndigoにはリリースされてるのにKinetic以降にはまだリリースされていないパッケージが数多くあり,移行したくてもできない,という場合が多いようです.同様の理由で,TORKでもワークショップ教材や受託開発には現在もIndigoを用いています.

IndigoはUbuntu14.04ベースですが,KineticとLunarはUbuntu16.04以降がベースで,14.04ではサポートされていません.しかし,Indigoを使うためだけに,いまさらUbuntu14.04をPCにインストールするのもちょっとイマイチです.

VMWareやVirtualBoxなどの仮想マシン(VM)を用いる,という解決策もあります.しかし,ハードウェアを使おうとした時に問題になります.たとえば,USBカメラのパフォーマンスが非常に悪いとか,USB3.0に対応していない,など,デバイスドライバの問題もありがちです.

そこで,最近はやりのDockerを用いると,Ubuntu16.04をインストールしたPC上で,デバイスやGUIも使えるインタラクティブなIndigoの開発環境を簡単に動かすことができます.

Dockerのインストール

まずはDockerのインストールをしておきます.Ubuntuのaptで入るものは用いないで,Dockerのページにある手順に従って最新版をインストールしましょう.Community Edition(CE)というのを使います.

IndigoのDockerイメージの準備

IndigoのDockerコンテナは,まずはOSRFがDockerHubに用意しているものを利用するのが簡単です.

以下のコマンドでIndigoのコンテナを取得します.

$ docker pull osrf/trusty-ros-indigo:desktop

ちなみにこのosrfのコンテナにNextage OpenなどのTORKワークショップに対応したパッケージを追加したものをTORKでも公開しています.必要ツールなどが豊富なので,こちらを使うのもおすすめです.

たとえば取得したDockerコンテナを立ち上げ,コマンド’lsb_release’でバージョンを確認したい場合には,

$ docker run osrf/trusty-ros-indigo:desktop lsb_release -a

No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04
LTSRelease: 14.04
Codename: trusty

のようにします.このとき実行されるコマンドのユーザ権限はデフォルトでrootになります.ユーザ権限やデバイスに対するアクセス権限を変更するには,別途docker runの際のオプションを設定する必要があります.このあたり詳しくは,Docker run referenceを参照してください.

ユーザやホームディレクトリを共有したインタラクティブな起動

ここでやりたいのは,対象のコンテナを立ち上げつつ,自分のユーザ権限でシェルを実行し,ホームディレクトリ内でインタラクティブに作業をすることです.そのために必要ないくつかの設定を行うスクリプトを作成しました.

$ ./docker_shell osrf/trusty-ros-indigo:desktop

とすると,あたかもOSだけがTrusty + ROS Indigoになったかのようなシェルが起動します.

$ . /opt/ros/indigo/setup.bash

とすれば通常のIndigo環境として用いることができます.ただし,ベースシステムでKineticを使っている場合には,ワークスペースをビルドする際にKineticなのかIndigoなのかで混乱してしまいがちなので,注意が必要です.

NVidiaのドライバを使用している場合

PCが特殊なXグラフィクスドライバを用いていない場合には,rvizなどのGUIも使用することができます.しかし例えば,PCがNVidiaのドライバを使用している場合,rvizなどのOpenGLを含むアプリが動作しません.この解決法は次回以降に紹介します.

著者:Ryosuke Tajima

World MoveIt! Day Tokyo ありがとうございました!

 

World MoveIt! Day Tokyo,無事に終了いたしました.当日は30人ほどの方にお越しいただきました.参加していただいた皆様,スポンサーの皆様,開催をサポートしていただいたすべての方々に感謝したいと思います.

Baxter

日本バイナリー様のご協力により,当日の主役はこのロボットでした.オシャレなLEAGUE有楽町のフロアでかなりの存在感を出していました.

JACO2, HEBIアーム

また,同じく日本バイナリー様はJaco2アームとHEBIアームを展示していただきました.HEBIアームをMoveIt!とGazeboで動かそうとチャレンジした上級者もいらっしゃいました.

時差の少ないシンガポールARTCとビデオチャットでつないでご挨拶してみました.

終始なごやかな雰囲気でした

皆さん,軽食を取りながらMoveIt!シミュレータやロボットを試してみていました.インストールや動作のトラブルにはスタッフが出来る限り対応しました.

報告いただいた方にはROSConグッヅをプレゼント!

ほんんどの方が,自分のPCでMoveIt!やシミュレータを動作させることができました.実際にBaxterを動かしたり,moveit_commanderを使ったプログラミングに挑戦したりしている方もおり,それぞれのレベルや関心に応じて有意義な成果が得られました.最後に今日の成果を皆で報告していただきました.

ありがとうございました!

日本でもたくさんの方がMoveIt!に関心を持っていることが分かりました.今後もMoveIt!およびROSをみんなで使って,フィードバックやコミットで改良していきましょう.

著者:Ryosuke Tajima

World MoveIt! Day 2017 Tokyoを開催します!

MoveIt!は主にロボットマニュピレータを対象としたROSの主要パッケージの一つです.MoveIt!の利用者,開発者のための世界的なイベント”World MoveIt! Day 2017″のローカルイベントを,今年は東京でも開催します.

  • 内容: World MoveIt! Day Tokyo
  • 日時: 10月19日(木) 11:00 〜 18:00 (時差で欧米の開催地から1日遅れた開催です)
  • 場所: [LEAGUE有楽町]イベントスペース
  • 参加費: 無料

詳細なプログラムと参加登録は,以下のサイトをご覧ください.なおスケジュール等は予告なく変更される場合があります.

とってもゆるい感じのイベントになると思います.MoveIt!を利用されている方はもちろん,関心はあってもまだ利用していない方,全く聞いたことのない方,どなたでも参加できます.ささやかながら飲み物,食べ物もご用意いたします.

ROSをインストールしたご自分のノートPCを持参していただければ,シミュレータもしくはロボット実機で,MoveIt!を中心としたロボットソフトウェアを体験することができます.弊社スタッフや参加者同士で教えあうことで,使い方を学ぶことができます.

また,MoveIt!自体の機能追加や不具合修正についての情報交換も行われます.みんなでMoveIt!を盛り上げていきましょう!

著者:Ryosuke Tajima

Nextage Openの日本語版チュートリアルを新たに公開しました!

Nextage Open

これまでもNextage OpenのROSパッケージについての包括的なチュートリアルは公開されていましたが,世界中のユーザの利用を前提として英語での提供でした.このたび,日本のユーザからの要望が多かったチュートリアルの日本語版を作成し,公開することができました.

Nextage Open 日本語版チュートリアル

すでにNextage Openをご活用頂いているユーザの皆様には,これまで以上に研究開発のお役に立てることができれば幸いです.また,Nextage Open の導入を検討される方にも,参考になる内容となっていると思います.

もちろん,英語版のチュートリアル(http://wiki.ros.org/rtmros_nextage/Tutorials)もこれまでどおりご利用いただけます(日本語版へのリンクも追加されています).

著者:Ryosuke Tajima

ROSワークショップ中級・自律移動編を10月31日(火)に名古屋で開催します

来る10月31日(火)に,ROSワークショップ中級・自律移動編を名古屋にて開催します.ROSでの自律移動(ナビゲーション)を学びたい方は,これを機会にぜひ受講をご検討ください.

基本的にはROSワークショップ初級編を受講した方を対象としておりますが,それに準ずると思われるROSの経験がある方なら,受講いただけます.お申込みは詳細をご確認の上,ページ内のお申込みフォームよりエントリをお願い致します.

シミュレーション環境での自律移動

ワークショップでは,まずシミュレータを動かしながら自律移動の概要を学ぶハンズオンを行います.次に,掃除ロボットRoomba(ルンバ)とラズベリーパイ(Raspberry Pi),低価格なレーザセンサRPLIDARで構成された自律移動ロボット”Roomblock”を用いて,実機の操作,地図の生成,自己位置推定といった自律移動の機能とプログラミング方法を学びます.最後に,ROSの自律移動の構成とその要素について,より詳しく解説していきます.シミュレータと実機を用いた実践的なワークショップとなっています.

自律移動ロボットRoomblock

上記以外での日程の調整,その他ご相談,開発委託,出張ワークショップ,カスタマイズワークショップも承っております.
お気軽にご相談ください.
info[at]opensource-robotics.tokyo.jp

著者:Yumiko Suzuki

2017年10月のROSワークショップ日程

以下日程でROSワークショップを行います.
名古屋でも開催いたします!

10月04日(水)13:30~ ROSワークショップ初級編
10月10日(火)13:30~ (名古屋)ROSワークショップ初級編
10月18日(水)13:30~ ROSワークショップ初級編
10月20日(金)13:30~ (名古屋)ROSワークショップ初級編 日程変更になりました
10月23日(月)13:30~ (名古屋)ROSワークショップ初級編
10月24日(火)13:30~ ROSワークショップ初級編

場所は都内・有楽町の会議室または名古屋市内での実施を予定しています.

中級編についてはご要望があり次第,日程を調整いたしますのでメイルにてお問い合わせください.
(初級編を受講した方を対象としております.中級マニピュレーション編のページまたは中級・自律移動編のページをご参照ください)

お申込みは以下より詳細をご確認の上,ページ内のお申込みリンクよりエントリをお願い致します.

ROSワークショップ初級編

上記以外での日程の調整,その他ご相談,開発委託,出張ワークショップ,カスタマイズワークショップも承っております.
お気軽にご相談ください.
info[at]opensource-robotics.tokyo.jp

IMG_20151112_182120

著者:Yumiko Suzuki

ROSワークショップ初級編を開催しました

今回も有楽町にてROSワークショップ初級編を開催しました.
初めてでLinux環境を準備できなくてもLiveUSBを使って完遂できました.お疲れ様でした!

初級編では環境の構築からセンシングデバイス,サーボの実機をROSで動かすところまで半日で習得できます.
時間中にはROSに関するお困りごとだけでなく,社内でOSSを運用していく際の疑問点等にも随時お答えしています.

10月のワークショップ日程を公開中です!

10月は中級・自律移動編も実施いたします!

ROSを初めて勉強する人へのブログも公開しています. ご参考になさってください.

プライベートワークショップ,その他OSSに関するご相談も承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp

著者:Ryosuke Tajima

バンクーバーでのROSCon 2017に参加しました!

9月21日,22日にバンクーバーで開催されたROSCon2017に参加しました!

会場のVancouver Convention Centerからの風景

ROSConは年に一回,ユーザ,開発者,企業,大学といった様々な立場でROSに関わる人が集まり,情報交換をするための会議です.

Brian Gerkey氏によるオープニング

TORKは事前に発表を申し込んでいたわけではありませんが,ライトニングトークという3分間の枠で活動内容を報告することができました.

TORKからも新しいパッケージを報告しました

今回のROSConでも,新しいロボット,新しいデバイス,ロボット研究開発の内容など,非常に多様な国と組織からの発表がありました.また,今回はROS2の話題が多く聞かれるようになってきました.

ROSの開発者やユーザにとってはとにかく楽しい会議ですので,今後の参加を検討されてはいかがでしょうか.なお,来年の開催地とスケジュールはまだ決定されていないとのことです.

著者:Ryosuke Tajima

2017年10月の名古屋 ROSワークショップ日程

10月は以下の日程でROSワークショップを行います.

場所: COffice名古屋伏見 (伏見駅,名古屋広小路伏見中駒ビル5F)

ROSの初歩をスピーディに習得したい方,ROSの疑問点を解消したい方,中部地方の方の参加をお待ちしております.

もちろんこれまでどおり東京でもワークショップを開催しておりますので,お選びいただけます.

お申込みは以下より詳細をご確認の上,ページ内のお申込みリンクよりエントリをお願い致します.

また,ROSワークショップ中級編についても名古屋にて開催できるようになりました.ご要望があり次第,日程を調整いたしますのでメイルにてお問い合わせください.ただし,初級編を受講した方を対象としております.

上記以外での日程の調整,その他ご相談,開発委託,出張ワークショップ,カスタマイズワークショップも承っております.お気軽にご相談ください.
info[at]opensource-robotics.tokyo.jp

著者:Ryosuke Tajima

ROS + Snappy Ubuntu Core (4) : Raspberry Pi 3へのUbuntu Coreのインストール

前回はSnappyなROSパッケージの中身を見てみました.今回はより具体的な活用例としてRaspberry Pi 3へのUbuntu Coreのインストール方法を見ていきましょう.

このページの内容に従い,Raspberry Pi 3にUbuntu Coreをインストールしてみます.

以下の作業は,Ubuntu 16.04の環境で行いました.まず,Ubuntu Core imageにある,’Ubuntu Core 16 image for Raspberry Pi 3’のイメージファイルをダウンロードします.320MBありました.

つぎにこれをMicroSDカードにコピーします.手元の環境ではMicroSDカードをカードリーダに挿すと/dev/sdaとして認識されたので,

$ xzcat ubuntu-core-16-pi3.img.xz | sudo dd of=/dev/sda bs=32M
$ sync

としました.

RaspberryPi3を先ほど作成したMicorSDカードで起動します.

Raspberry Pi 3 の起動画面

最初の起動の際には,コンソールからのログインが必要なので,キーボードとディスプレイを接続しておきます.

進むにはubuntu.comのアカウントが必要

いきなり詰まってしまいました.login.ubuntu.comのアカウントのメールアドレスを入力せよ,と言われます.Ubuntu Coreの使用には,ubuntu.comのアカウント登録が必要のようです.インストールにはインターネット接続が前提なので,proxy環境などでは困りそうです.

別のPCからlogin.ubuntu.comにアクセスして,アカウントを作成します.

ubuntu.comのアカウント作成画面

さらに,そのままだとssh keyが無いといわれます.login.ubuntu.comのsshのページでsshの公開鍵を設定しておく必要があるようです.この公開鍵に対応する秘密鍵による認証で,Raspberry Pi 3にsshでログインすることができます.

SSH Keysの設定

自分のマシンがUbuntuの場合,自分のマシン上で

$ ssh-keygen

とコマンドを打ち,パスワード等を設定します.~/.ssh/id_rsa.pubというファイルができるはずなので,その中身をコピーして,SSH Keysのフォームに貼り付けます.

SSH Keysのページでssh keyを設定したマシンからは,Raspberry Piにsshでログインできるようになります.usernameは,ubuntu.comで設定したユーザ名です.Raspberry Pi3のIPアドレスは,DHCPで取得され,コンソール画面に表示されています.

$ ssh username@192.168.0.10

初期状態では,コマンドやアプリはほとんど入っていません.Ubuntuでお馴染みのaptやdpkgと言ったコマンドも使えません.今後,snappyパッケージを入れることで拡張していきますが,まずパッケージ一覧をWebブラウザで見るためのsnapwebパッケージをインストールしてみましょう.

$ sudo snap login username@example_domain.com
$ sudo snap install snapweb
$ snap list
Name        Version       Rev   Developer  Notes
core        16-2          1443  canonical  -
pi2-kernel  4.4.0-1030-3  22    canonical  -
pi3         16.04-0.5     6     canonical  -
snapweb     0.26-10       305   canonical  -

Webブラウザで,”http://192.168.0.10:4200/”にアクセスしてみます.

snapwebの画面

snapwebの画面

今インストールされているパッケージ一覧が見えたりします.ストアもあるようですが,

App storeの画面

App storeの画面

うーん,よくわかりませんが,ほとんどアプリは無いように見えます.

著者:Yumiko Suzuki

ROSワークショップ初級編を開催しました

今回も有楽町にてROSワークショップ初級編を開催しました.
準備万端でご参加いただきサクサクと進みました.お疲れ様でした!

初級編では環境の構築からセンシングデバイス,サーボの実機をROSで動かすところまで半日で習得できます.
時間中にはROSに関するお困りごとだけでなく,社内でOSSを運用していく際の疑問点等にも随時お答えしています.

9-10月のワークショップ日程を公開中です!

ROSを初めて勉強する人へのブログも公開しています. ご参考になさってください.

プライベートワークショップ,その他OSSに関するご相談も承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp

著者:Ryosuke Tajima

名古屋でのROSワークショップ,始めます!

これまで東京都内を中心に開催してきた弊社のROSワークショップですが,
2017年9月から,名古屋でもROSワークショップの開催を始めます!

(受付終了しました) 9月5日(火)13:30~ (名古屋) ROSワークショップ初級編
(受付終了しました) 9月15日(金)13:30~ (名古屋) ROSワークショップ初級編

場所: COffice名古屋伏見 (伏見駅,名古屋広小路伏見中駒ビル5F)

ROSの初歩をスピーディに習得したい方,ROSの疑問点を解消したい方,中部地方の方の参加をお待ちしております.

もちろんこれまでどおり東京でもワークショップを開催しておりますので,お選びいただけます.

お申込みは以下より詳細をご確認の上,ページ内のお申込みリンクよりエントリをお願い致します.

また,ROSワークショップ中級編についても名古屋にて開催できるようになりました.ご要望があり次第,日程を調整いたしますのでメイルにてお問い合わせください.ただし,初級編を受講した方を対象としております.

上記以外での日程の調整,その他ご相談,開発委託,出張ワークショップ,カスタマイズワークショップも承っております.お気軽にご相談ください.
info[at]opensource-robotics.tokyo.jp

著者:Yumiko Suzuki

2017年9月-10月のROSワークショップ日程

以下日程でROSワークショップを行います.
9月から名古屋でも開催いたします!

 9月05日(火)13:30~ (名古屋)ROSワークショップ初級編
 9月07日(木)13:30~ ROSワークショップ初級編
 9月15日(金)13:30~ (名古屋)ROSワークショップ初級編
 9月27日(水)13:30~ ROSワークショップ初級編
10月04日(水)13:30~ ROSワークショップ初級編
10月18日(水)13:30~ ROSワークショップ初級編
10月24日(火)13:30~ ROSワークショップ初級編

場所は都内・有楽町の会議室または名古屋市内での実施を予定しています.

中級編についてはご要望があり次第,日程を調整いたしますのでメイルにてお問い合わせください.
(初級編を受講した方を対象としております.中級マニピュレーション編のページまたは中級・自律移動編のページをご参照ください)

お申込みは以下より詳細をご確認の上,ページ内のお申込みリンクよりエントリをお願い致します.

ROSワークショップ初級編

上記以外での日程の調整,その他ご相談,開発委託,出張ワークショップ,カスタマイズワークショップも承っております.
お気軽にご相談ください.
info[at]opensource-robotics.tokyo.jp

IMG_20151112_182120

著者:Ryosuke Tajima

ROS + Snappy Ubuntu Core (3) : SnappyなROSパッケージの中身

Snappy + ROS, https://www.crowdsupply.com/krtkl/snickerdoodle/updates/1890

前回作成したSnappyのパッケージはどういう仕組みで動いているのでしょうか?

$ which talker-listener.listener 
/snap/bin/talker-listener.listener
$ ls -l /snap/bin/talker-listener.listener 
lrwxrwxrwx 1 root root 13 Jul 21 16:04 /snap/bin/talker-listener.listener -> /usr/bin/snap

となっています.これは,以下を実行するのと等価になるようです.

$ snap run talker-listener.listener

snapファイルは,単に/snap/に展開されるだけです.currentというのが最新版ですが,これはx1へのシンボリックリンクになっています.容易にロールバックできるようにするためなのでしょう.

$ ls -l /snap/talker-listener/
total 0
lrwxrwxrwx  1 root root   2 Jul 21 16:04 current -> x1
drwxrwxr-x 10 root root 222 Jul 21 16:00 x1
$ ls /snap/talker-listener/current
bin                       command-roscore.wrapper  etc  meta  snap  var
command-listener.wrapper  command-talker.wrapper   lib  opt   usr

command-listener.wrapperというのが目に付きます.中身を見ると,

#!/bin/sh
export PATH="$SNAP/usr/sbin:$SNAP/usr/bin:$SNAP/sbin:$SNAP/bin:$PATH"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$SNAP/lib:$SNAP/usr/lib:$SNAP/lib/x86_64-linux-gnu:$SNAP/usr/lib/x86_64-linux-gnu"
export ROS_MASTER_URI=http://localhost:11311
export ROS_HOME=${SNAP_USER_DATA:-/tmp}/ros
export LC_ALL=C.UTF-8
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$SNAP/lib:$SNAP/usr/lib:$SNAP/lib/x86_64-linux-gnu:$SNAP/usr/lib/x86_64-linux-gnu
export PYTHONPATH=$SNAP/usr/lib/python2.7/dist-packages:$PYTHONPATH
export PATH=$PATH:$SNAP/usr/bin


# Shell quote arbitrary string by replacing every occurrence of '
# with '\'', then put ' at the beginning and end of the string.
# Prepare yourself, fun regex ahead.
quote()
{
    for i; do
        printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/"
    done
    echo " "
}

BACKUP_ARGS=$(quote "$@")
set --

if [ -f $SNAP/opt/ros/kinetic/setup.sh ]; then
    _CATKIN_SETUP_DIR=$SNAP/opt/ros/kinetic . $SNAP/opt/ros/kinetic/setup.sh
fi

eval "set -- $BACKUP_ARGS"

export LD_LIBRARY_PATH="$SNAP/opt/ros/kinetic/lib:$SNAP/usr/lib:$SNAP/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH"
export LD_LIBRARY_PATH=$SNAP_LIBRARY_PATH:$LD_LIBRARY_PATH
exec "rosrun" roscpp_tutorials listener "$@"

となっており,ROSの環境設定などはこのラッパーファイルで行われた上で,コマンドが実行されるようです.つまり,いつもROSでやっているような”source setup.bash”などは必要ないことになります.楽になりそうですね.

snapパッケージにはほかに何が含まれているのでしょうか.

$ tree -L 3 -d /snap/talker-listener/current/
/snap/talker-listener/current/
├── bin
├── etc
│   ├── ca-certificates
│   │   └── update.d
│   ├── dpkg
│   │   └── dpkg.cfg.d
│   ├── emacs
│   │   └── site-start.d
│   ├── gss
│   │   └── mech.d
│   ├── ldap
│   ├── openmpi
│   ├── perl
│   │   ├── CPAN
│   │   └── Net
│   ├── python2.7
│   ├── python3.5
│   ├── sgml
│   ├── ssl
│   │   ├── certs
│   │   └── private
│   ├── systemd
│   │   └── system
│   └── xml
├── lib
│   └── x86_64-linux-gnu
├── meta
│   └── gui
├── opt
│   └── ros
│       └── kinetic
├── snap
├── usr
│   ├── bin
│   ├── include
│   │   ├── apr-1.0
│   │   ├── arpa
│   │   ├── asm-generic
│   │   ├── boost
│   │   ├── c++
│   │   ├── console_bridge
│   │   ├── drm
│   │   ├── gtest
│   │   ├── hwloc
│   │   ├── infiniband
│   │   ├── libltdl
│   │   ├── linux
│   │   ├── log4cxx
│   │   ├── misc
│   │   ├── mtd
│   │   ├── net
│   │   ├── netash
│   │   ├── netatalk
│   │   ├── netax25
│   │   ├── neteconet
│   │   ├── netinet
│   │   ├── netipx
│   │   ├── netiucv
│   │   ├── netpacket
│   │   ├── netrom
│   │   ├── netrose
│   │   ├── nfs
│   │   ├── numpy -> ../lib/python2.7/dist-packages/numpy/core/include/numpy
│   │   ├── openmpi -> ../lib/openmpi/include
│   │   ├── protocols
│   │   ├── python2.7
│   │   ├── rdma
│   │   ├── rpc
│   │   ├── rpcsvc
│   │   ├── scsi
│   │   ├── sound
│   │   ├── uapi
│   │   ├── uuid
│   │   ├── video
│   │   ├── x86_64-linux-gnu
│   │   └── xen
│   ├── lib
│   │   ├── compat-ld
│   │   ├── dpkg
│   │   ├── emacsen-common
│   │   ├── gcc
│   │   ├── gold-ld
│   │   ├── lapack
│   │   ├── ldscripts
│   │   ├── libblas
│   │   ├── mime
│   │   ├── openmpi
│   │   ├── pkgconfig
│   │   ├── python2.7
│   │   ├── python3
│   │   ├── python3.5
│   │   ├── sasl2
│   │   ├── sbcl
│   │   ├── ssl
│   │   ├── valgrind
│   │   └── x86_64-linux-gnu
│   ├── sbin
│   ├── share
│   │   ├── aclocal
│   │   ├── applications
│   │   ├── apps
│   │   ├── apr-1.0
│   │   ├── bash-completion
│   │   ├── binfmts
│   │   ├── boostbook
│   │   ├── boost-build
│   │   ├── bug
│   │   ├── ca-certificates
│   │   ├── cmake-3.5
│   │   ├── debhelper
│   │   ├── dh-python
│   │   ├── distro-info
│   │   ├── doc
│   │   ├── doc-base
│   │   ├── docutils
│   │   ├── dpkg
│   │   ├── emacs
│   │   ├── glib-2.0
│   │   ├── icu
│   │   ├── libtool
│   │   ├── lintian
│   │   ├── man
│   │   ├── mime
│   │   ├── mpi-default-dev
│   │   ├── numpy
│   │   ├── openmpi
│   │   ├── perl
│   │   ├── perl5
│   │   ├── pixmaps
│   │   ├── pkgconfig
│   │   ├── pyshared
│   │   ├── python
│   │   ├── python3
│   │   ├── sgml
│   │   ├── sgml-base
│   │   ├── xml
│   │   └── xml-core
│   └── src
│       └── gtest
└── var
    └── lib
        ├── sgml-base
        ├── systemd
        └── xml-core

144 directories

ワオ! talker-listenerのsnapパッケージには,ROSはもちろん,必要なLinuxシステムのディレクトリ構造がまるごと含まれています.ちょっと無駄な気がしますね…しかし,これがdockerなどで最近の流行りの,アプリごとに1つのコンテナを持つ(コンテナ仮想化),というやり方なのですね.

ちなみに,生成されたsnapファイルは,

$ ls -sh talker-listener_0.1_amd64.snap 
154M talker-listener_0.1_amd64.snap

なんと154Mbyteもあります.こんなに大きくて,パッケージが増えた時には大丈夫なんでしょうか…どう見ても必要のないファイルがパッケージにたくさん含まれているので,このへんはおそらく解決する方法があるのでしょう.

次回は,より具体的なSnappyの活用例としてRaspberry Pi 3へのUbuntu Coreのインストール方法を見ていきましょう.

著者:Ryosuke Tajima

Roomblock(5): 3Dプリンタで出力可能なフレーム構造

前回までにルンバ,ラズベリーパイ,モバイルバッテリ,そしてレーザー距離センサといったRoomblockの部品を紹介しました.これらをルンバの上に載せるための,3Dプリンタで出力できる構造材を紹介します.

Battery stage

Battery stage

棚のような構造で,1番下の段にモバイルバッテリ,2番目の段にラズベリーパイ,1番上の段にRPLIDAR A2を載せます.動作中にモバイルバッテリが落ちてしまうことがあるので,1番下の段にはバッテリー固定用のベルトがつけられるようになっています.

Raspberry Pi stage

Raspberry Pi stage

部品をブロックのように交換したり追加したりして,機能を拡張することを狙っているので,”Roomblock”と名付けました.安直ですね.ラズベリーパイ用のボードカメラを固定するための部品も追加しました.

Roomblock's frame

Roomblock’s frame

ルンバとフレーム部分はベルクロテープで固定されているので,取り外しも簡単です.

この構造材は,比較的安価な3Dプリンタでも出力できるサイズで設計されています.確認には UP! plus2を使いましたが,ワークエリアが15cm x 15cm程度の3Dプリンタであれば,大抵の機種で出力できると思います.3Dデータ(STLファイル)は,Thingiverseからダウンロードすることができます.

Roomblockの詳細な作り方については,Instructablesで公開しています.ただし当社は,これらの内容によって生じるいかなる損害についても責任を負いません.興味がわいた方はあくまで自己責任で,チャレンジしてくださいね.

著者:Yumiko Suzuki

ROSワークショップ初級編を開催しました

本日2017年8月8日,おかげさまで TORK は設立4周年を迎えました.
皆様,いつもありがとうございます!
これからも,お客様のご要望に応え,産業・学術界でのオープンソースロボティクスの進展に寄与できるよう,より一層努力して参ります.

今回も有楽町にてROSワークショップ初級編を開催しました.
小さな疑問点にも都度お答えしながらの密度の高いワークショップとなりました.お疲れ様でした!

初級編では環境の構築からセンシングデバイス,サーボの実機をROSで動かすところまで半日で習得できます.
時間中にはROSに関するお困りごとだけでなく,社内でOSSを運用していく際の疑問点等にも随時お答えしています.

9-10月のワークショップ日程を公開中です!

ROSを初めて勉強する人へのブログも公開しています. ご参考になさってください.

プライベートワークショップ,その他OSSに関するご相談も承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp

著者:Yumiko Suzuki

ROSワークショップ初級編を開催しました

今回も有楽町の会議室にてROSワークショップ初級編を開催しました.
参加者の方が検討中のシステムについてのご相談もお受けしました.お疲れ様でした!

初級編では環境の構築からセンシングデバイス,サーボの実機をROSで動かすところまで半日で習得できます.
時間中にはROSに関するお困りごとだけでなく,社内で運用していく際の疑問点等にも随時お答えしています.

8月のワークショップ,いまなら間に合う!

9-10月のワークショップ日程を公開中です!

ROSを初めて勉強する人へのブログも公開しています. ご参考になさってください.

プライベートワークショップ,その他OSSに関するご相談も承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp

著者:Ryosuke Tajima

ROS + Snappy Ubuntu Core (2) : SnappyなROSパッケージを作ってみよう

前回はUbuntu Coreについて紹介しましたが,いわゆる”Snappyな”パッケージシステムは,Ubuntu Coreをインストールしなくても試すことができます.Ubuntu CoreはあくまでSnappyをパッケージシステムとして使っているにすぎません.今回は,通常のUbuntuの上で,”Snappyな”ROSパッケージを作ってみようと思います.

Snappy + ROS, https://www.crowdsupply.com/krtkl/snickerdoodle/updates/1890

SnappyなROSパッケージの作り方のチュートリアルは,ここにあります.とりあえずこの通りに従ってみましょう.

ただし,これをやる前に,Snapcraft Tourのチュートリアルを一通り読むことをお勧めします.

以下の手順は,Ubuntu 16.04 + ROS Kineticで試したものです.
まず,SnappyのパッケージングツールであるSnapcraftをインストールします.

$ sudo apt install snapcraft

SnappyパッケージにするためのROSパッケージが必要ですが,自分でコードを打ち込むのはめんどくさいので,githubからros_tutorialのソースコードをcloneします.

$ mkdir -p catkin_ws/src
$ cd ~/catkin_ws/src
$ git clone https://github.com/ros/ros_tutorials.git

snapcraftで初期化します.

$ cd ~/catkin_ws
$ snapcraft init

snapというディレクトリができて,その下にsnapcraft.yamlというファイルができます.このファイルを,roscpp_tutorialsの中のバイナリが含まれるように,書き換えます.書き換え方はチュートリアルに解説があるので参照してみてください.雰囲気でわかると思います.

さて,いよいよパッケージを作成します.

$ cd ~/catkin_ws
$ snapcraft

なにやらネットワークからいろいろとダウンロードし始めました…snapcraftはcatkinワークスペースを理解できるので,package.xmlを見て,rosdepで必要なパッケージをダウンロードしているのです. 「必要なROSのパッケージは全部システム入ってるはずだけど?」と思われるかもしれませんが,Snappyパッケージは,アプリに必要なものを仮想コンテナにすべて含んだ形で持つので,作成の際にいちいちパッケージをダウンロードし,ソースコードならコンパイルして,仮想コンテナ内にインストールします. しばらくすると,処理が終わり,

Snapped talker-listener_0.1_amd64.snap

と,snapファイルが生成されます. これをインストールするには,

$ sudo snap install --dangerous publisher-subscriber_0.1_amd64.snap

とします.インストールされたか確かめて見ましょう.

$ snap list
Name Version Rev Developer Notes
core 16-2.26.9 2381 canonical -
talker-listener 0.1 x1 -

では,ノードを順番に起動してみましょう.

$ talker-listener.roscore
$ talker-listener.talker
$ talker-listener.listener

お馴染みの,talker-listenerのノードが動き始めたと思います.

次回はSnappyなROSパッケージの中身を見ていきましょう

著者:Ryosuke Tajima

ROS + Snappy Ubuntu Core (1) : いったい何なの?

iPhoneのAppStoreやAndroidのGooglePlayのようなアプリのマーケットインフラを,ロボットの世界にも導入するためにはどのような課題があるでしょうか?ROSはその開発当初から「Robot App Store」を視野に入れてきていますが,まだ実現していません.

その中で,最近のUbuntu Snappy Coreと呼ばれる仕組みの登場は,Robot App Storeの開設に大きく貢献するのではないかと思われます.

Snappy + ROS, https://www.crowdsupply.com/krtkl/snickerdoodle/updates/1890

今後,数回に分けて,Ubuntu Snappy CoreとROSについて書いていきたいと思います.

Ubuntuの事情

ROSがメインのベース・オペレーティング・システムとしているUbuntuは,年に2回のRegularリリースがあり,そのサポート期間は9ヶ月です.また,2年おきにLTS(Long Term Support)と呼ばれるリリースがあり,サポート期間は5年です.実用を求める人は安定なLTSを使いつつ,最新技術の取り入れや新規開発はRegularリリースを使う,というサイクルが続いています.

しかし,Ubuntuが対象とするデバイスは,デスクトップPCやサーバだけでなく,IoTやルータなどのエッジデバイスにも広がりつつあります.残念ながらUbuntu Phoneはついに陽の目を見ないことになるようですが…

これらのデバイスでは,セキュリティの観点から,Ubuntuのような同期的なものではなく,もっと不定期かつ細かい間隔の継続的なアップデートが欠かせません.また,耐障害性,たとえば不具合を含むソフトウェアが配信された際にロールバックする,などの機能が必要になります.

Snappy Ubuntu Core

これらの要求に対して,Ubuntuでは,IoTやエッジデバイス向けに,(Snappy) Ubuntu Coreと呼ばれる仕組みが開発されています.

これは,OSとデバイスドライバの分離,またカーネルとアプリケーションを分離して,それぞれを独立に,細かい周期でアップデートできるような仕組みにしよう,というものです.

ROSの事情

ロボットもまたIoTやエッジデバイスの一種と見ることができるため,今後ROSでも,このSnappyなパッケージシステムが主流になる可能性があります.また,ROSのリリースシステムも,ほころびが目立つようになってきています.

これまでROSはUbuntuと同様に,同期的なリリースを行ってきました.しかし,1年に1回のリリースでは,日進月歩の技術を取り入れるのに遅れが大きすぎる気もします.一方で,ROSを業務に使用する場合には,動作させることが優先され,頻繁にアップデートしない(できない)ようになってしまいがちです.

また,ROSのパッケージは,たくさんの外部ライブラリに依存しています.外部ライブラリのAPIが変更になるたびに,ROSのパッケージもそれに対応させる必要があります.仕様が変わる場合には,パッケージを対応させた上に動作確認も必要です.

そのため,リリースされるたびに,リリースから外れていくパッケージが多くなってきました.必要だしよく使われるパッケージであるにもかかわらず,リリースのために修正が必要だけど修正作業を行うメンテナがいない,という理由でリリースされなかったり,リリースが遅れたりするケースもあります.

もしROSを搭載したロボット製品を販売しようと考えた場合,UbuntuやROSが更新されたタイミングで,どのような仕様変更や不具合が混入するかわからず,それに対応するには膨大なリソースが必要であることが予想されます.

以上のようなことから,今後はSnappyなROSシステムが主流になるのではないかと,勝手ながら予想しています.

Canonicalにお勤めのロボットエンジニアの方(Kyle Fazzari氏)が精力的に情報発信をしているのも頼もしいです.4月に公開された以下の一連のブログと動画も必見です.

次回はSnappyなROSパッケージを作ってみます.

著者:Ryosuke Tajima

Roomblock(4): 低価格なレーザ距離計 RPLIDAR A2

前回はルンバと通信するための計算機として用いているラズベリーパイについて紹介しました.今回は,自律移動のためのキーパーツである,レーザ距離センサについて紹介します.レーザースキャナ,LIDAR(Laser Imaging Detection And Ranging)とも呼ばれます.

弱いレーザービームを発光し,物体への反射光を計測して,その時間差により物体までの距離を測ります.計測部分を回転させながら計測(スキャン)すれば,平面内の物体までの距離が計測できます.レーザービームを複数並べたり,細かく向きを変える機構を使うことで,平面内だけでなく3次元的な計測点が得られる3次元レーザ距離センサもあります.

一般的にレーザー距離センサは,2次元のものでも数十万円していたので,そう手軽に使えるものではありませんでした.しかしRoomblockで使っている SlamTech社のRPLIDAR A2 は,なんと5万円程度と破格なのです.

自律移動のキーパーツ,LIDAR

自律移動のキーパーツ,LIDAR

RPLIDAR用のROSドライバが公開されています.

$ sudo apt install ros-kinetic-rplidar-ros

として,

$ roslaunch rplidar_ros view_rplidar.launch

とするだけで,rvizで計測した点が表示されるお手軽さです.

rvizで表示した距離データ

rvizで表示した距離データ

計測可能距離は16m, 更新周期は10Hzと,高価なレーザスキャナと比べて性能では劣るものの,通常の屋内であれば地図生成や自己位置推定に問題はありません.スキャンは1度刻みで360度なので死角がありませんが,センサ上部がむき出しのままぐるぐると回転するので,動作中に触ってしまわないように注意が必要です.インターフェースはUSB2.0で,バスパワー駆動なのもうれしいところです.

laser_scan_matcherパッケージで少し遊んでみましょう.

$ roslaunch rplidar_ros view_rplidar.launch

としてセンサを起動した後,

$ rosrun laser_scan_matcher laser_scan_matcher_node _base_frame:=laser

として,センサの水平を保ちながら,ゆっくりと動かしてみます.

スキャンマッチング

スキャンマッチングの様子

初期状態ではworld座標系と一致していたlaser座標系が,センサの動きに応じて位置と姿勢がレーザのスキャンマッチングにより更新されていきます.センサを元の位置,姿勢に戻すと,だいたいworld座標系に一致しています.ただ,レーザのスキャンマッチングでは,フレーム間の移動量を推定してこれを積算するので,長く移動させるとエラーも積算されていきます.これを避けるためには,より高度な自己位置推定のアルゴリズムが必要になります.

次回はこれらの部品をルンバにのせるフレームを3Dプリンタで出力します.

Roomblockの詳細な作り方については,Instructablesで公開しています.ただし当社は,これらの内容によって生じるいかなる損害についても責任を負いません.興味がわいた方はあくまで自己責任で,チャレンジしてくださいね.

著者:Ryosuke Tajima

ルンバとラズベリーパイとレーザ距離センサによる自律移動ロボット Roomblock(3)

前回はルンバと通信するためのROIコネクタについて紹介しました.今回はルンバと通信するための計算機として用いている,ラズベリーパイ(Raspberry Pi)について書きます.

ラズベリーパイについては改めて言うまでもないかもしれませんが,低価格なARM搭載のボードコンピュータです.Roomblockで用いているのはラズベリーパイ2です.通常のPCと同じように,Ubuntuをインストールしたあと,ROSをインストールすることができます.

IMG_2457

Raspberry Pi 2

ルンバのROIコネクタとラズベリーパイは,USB-シリアル変換器を使って接続します.変換器を内蔵したケーブル秋月電子で購入できます)を使うと,ミニDINコネクタとはんだ付けするだけで写真のようなケーブルが出来上がります.Roomblockで唯一のはんだ付けが必要な部品ですが,3,4箇所をはんだ付けするだけなのでそれほど難しくないと思います.


IMG_2328IMG_1720 (1)
USB-シリアル変換ケーブル
「ラズベリーパイ自身がシリアルポートを持っているのではなかった?」と思った方,その通りです.工作の手間ができるだけ少なくなるようにUSB-シリアル変換器を使っていますが,おそらくラズパイの内蔵シリアルポートを配線しても動作すると思います.興味のある方は試してみてください.

ラズベリーパイの電源はどうしましょうか?ルンバのROIポートにも電源が出ているのですが,これはルンバのバッテリの電圧がそのまま出ているので,使う場合には電圧の変換が必要になってしまいます.Roomblockでは市販のUSBモバイルバッテリーを別電源として使用することにしました.10000mAのものが3000円程度で購入できる,良い時代になりました…これでラズベリーパイを数時間は動作させることができます.

IMG_1618

USBモバイルバッテリー

今回はここまでです.次はレーザースキャナについて紹介します.

Roomblockの詳細な作り方については,Instructablesで公開しています.ただし当社は,これらの内容によって生じるいかなる損害についても責任を負いません.興味がわいた方はあくまで自己責任で,チャレンジしてくださいね.

著者:Ryosuke Tajima

ルンバとラズベリーパイとレーザ距離センサによる自律移動ロボット Roomblock(2)

前回紹介したRoomblockに使えるルンバは,500, 600, 700, 800 シリーズと呼ばれるものです.これらの機種は,外部と通信するためのシリアルポートを備えています.ただし,現在の最上位機種のルンバ900シリーズは,画像による地図生成までできるすごいものですが,シリアルポートを備えていないのでRoomblockのベースとしては使用できないので注意してください.

ところでそのシリアルポートはルンバのどこにあるのでしょう?シリーズにより位置が異なります.500シリーズ,600シリーズは,上面のカバーを外さなければなりません.このカバーは4か所のツメで固定されていて,最初は少し硬いので外すのに力が必要です.ケガや破損に十分注意してください.


IMG_2455IMG_2453
Roomba 500シリーズのROIコネクタ
カバーを外すと,ミニDIN7ピンのコネクタが現われます.これがROI(Roomba Open Interface)コネクタと呼ばれるものです.

700シリーズ,800シリーズは,ルンバ上面の取っ手の下にROIコネクタがあります.カバーを外す必要はなく,取っ手を持ち上げるだけでアクセスできます.


IMG_2450IMG_2451
Roomba 700シリーズのROIコネクタ
以前は,このROIコネクタをPCと繋げるためのケーブルや,BluetoothWiFiで無線化するモジュールが販売されていましたが,,今は手に入らなくなっています.Roomblockでは,ルンバの上に搭載した計算機(ラズベリーパイ)をROIコネクタに接続しますが,これについては次回紹介します

Roomblockの詳細な作り方については,Instructablesで公開しています.ただし当社は,これらの内容によって生じるいかなる損害についても責任を負いません.興味がわいた方はあくまで自己責任で,チャレンジしてくださいね.

著者:Ryosuke Tajima

Roomblock: ループを含む大きな建物での地図生成

名城大学構内で実験させていただいたデータから,ROSの地図生成パッケージで地図を生成してみました.データはROSのbagファイルとして取得したので,同じデータに対して異なる地図生成パッケージを適用することが可能です.

ROSの地図生成のパッケージとして,

  •  gmapping
  •  slam_karto
  • hector_slam
  • Google cartographer

の4つのパッケージを用います.

これまで家屋や廊下など,比較的狭い環境で地図を作ってきました.それらの環境ではどの地図生成パッケージも,(誤差はともかくとして),自律移動に使えないような大きく矛盾する地図を作成することはありませんでした.狭い部屋では,基本的にレーザセンサのデータをずっとつなぎ合わせ続けることで,部屋の地図を作ることが可能です.

しかし,今回のデータは非常に大きな建物の長方形の廊下を一周したものです.廊下を一周回って元の場所に戻ってきた時,それが元の場所であることを認識せず,そのままレーザセンサのデータをつなぎ合わせていくと,最初に作った地図と矛盾したものを上書きし続けてしまいます.これを避けるためには,現在居る場所が以前来たことのある場所であると認識した上で,地図全体を辻褄があうように生成しなければなりません.これは”loop closure”と呼ばれ,地図生成では非常に難しい問題です.

以下の動画は,4つのパッケージで地図を生成した結果をまとめたものです.地図のグリッドサイズは5cmとし,各パッケージのパラメータのほとんどはパッケージの規定値のままで,一部のパラメータのみ少し調整しました.

gmappingは非常に健闘しました.途中の廊下は真っ直ぐになっておらず,地図の形は後半にかけて不正確になっています.これはルンバのあまり正確でないオドメトリを少し信頼しすぎているようです.しかし,一周回ってきた最後に注目してください.以前来たことのある場所だと認識し,辻褄があうように地図全体を変形させました.矛盾のない,ほぼ正しい地図が出来上がりました.

slam_kartoは,今回はloop closureの検出に失敗してしまいました.一周回ってきた後,最初に作った地図を破壊しながら,新しい地図を上書きしていきます.矛盾した地図となってしまいました.

hector_mappingには,じつはloop closureの機能がありません.また,車輪の回転速度(オドメトリ)を使っていません.そのため,この環境ではうまく地図を作ることはできませんでした.

Google cartographerは最後発で,しかもこのような大規模環境の地図を作るために開発されたアルゴリズムです.やはりループを正しく閉じることに成功しました.


gmapping_mapkarto_maphector_mapcartographer_map

最終的に生成された地図(左から,gmapping, slam_karto, hector_slam, cartographer)

 

以上の結果は,どのパッケージやアルゴリズムが優れているか,どのパッケージを選ぶべきかということを示すものではないことに注意してください.今回,パラメータはほとんどチューニングしなかったので,それぞれのパッケージの最高の性能が出ているわけではありません.また,それぞれのアルゴリズムには得意不得意があるので,課題に対してどれが良いかは,実際に試してみないと分からないことが多いはずです.

現在のところROSはこのような様々な地図生成パッケージを比較検討できる唯一のプラットフォームです.オープンソースの利点を活かし,ぜひご自分の手で確かめてみることをお勧めします.

TORKでは,自律移動編を含むROS初級,中級のワークショップ,企業や大学でのプライベートワークショップのご依頼も承っております.お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp

著者:Ryosuke Tajima

ルンバとラズベリーパイとレーザ距離センサによる自律移動ロボット Roomblock(1)

弊社のROS中級ワークショップ・自律移動編では,ルンバをベースとした自律移動ロボット”Roomblock”を教材として使用しています.不定期なエントリとして,このRoomblockの内容を紹介していきます.

まず,Roomblockは車輪移動台車として,iRobot社のお掃除ロボット,ルンバ(Roomba)を使用しています.驚かれる方もいるかもしれませんが,ルンバは実は通信用のシリアルポートを持っていて,パソコン等から操作したりセンサ情報を取得することが可能なのです.ルンバのこの機能は,発売当初から一部のエンジニアやホビイストの間で話題になり,ルンバを操作して楽しむ”Roomba Hacking”がブームとなったほどです.ROSが登場するよりもずっと前の話です.

IMG_1704

もう壊れてしまいましたが,2007年に私が初めて購入したRoombaです

iRobot社からは,”iRobot Create”という,掃除機能を省いた教育向けのルンバが発売されていたこともありました.ROSでも初期のTurtlebotプラットフォームは,このCreateをベースにしていました.現在はiRobot Createの販売は終了しており,TurtlebotもKobukiを用いたTurtlebot2, そしてRobotis社による独自プラットフォームTurtlebot3へと進化しています.

そんな中,なぜ今お掃除ロボット,ルンバを教材のベースとしたのでしょうか?3つ理由があります.

1つめは,ロボットの全体の価格をできるだけ抑えるためです.発売当初は割高に感じたルンバも,普及が進み今では3万円台から手に入るようになっています.屋内での自律移動に適したサイズ,車輪,センサなどを備えたロボットとしては破格です.

2つめは,ROSのパッケージがすでに存在していることです.それらを利用して,自律移動技術の本来的な目的である,地図生成や経路計画のソフトウェアの学習をすぐに始めることができます.

3つめは,ルンバが掃除をしてくれるからです…当たり前ですね.しかし,余暇にロボティクスを勉強したいエンジニアが,家族に「自律移動ができる10万円のロボットを買いたい」と言って納得してもらえるでしょうか?「ルンバなら掃除もしてくれるよ!」というとみんな喜んでくれます.

IMG_2278

最近では「ルンバ対応」のリビングチェアなるものまであります

おっと,つい話が長くなってしまいました.私ルンバが大好きなもので….今回はここまでです.

次回はルンバのシリアルポートについて紹介します.

Roomblockの詳細な作り方については,Instructablesで公開しています.ただし当社は,これらの内容によって生じるいかなる損害についても責任を負いません.興味がわいた方はあくまで自己責任で,チャレンジしてくださいね.

著者:Kei Okada

Kinetic 用 ROS USB カメラドライバのリリース

長らく懸案だったKinetic用のROS USBカメラドライバが一斉リリースされました.

これらのパッケージ,Indigoまでは数多く利用されていましたが,最近はメンテナが不在になっており,ながらくKineticでは利用できませんでした.
このたび,Orphaned Package Maintainersという有志グループが立ち上がり,Kinetic移行でもリリースされる体制が確立されました.

これに従来からリリースされていた以下の加えて6つのドライバから自由に選ぶことが出来るようになりました.ROSを使った画像処理プログラミングをお楽しみ下さい.

kinetic-usb-camera

著者:Ryosuke Tajima

名城大学にて自律移動ロボットのデモ&実験をさせていただきました

 
ROS初級と中級・自律移動編を受講頂いた名城大学メカトロニクス工学科様のご好意で,自律移動ロボット”Roomblock”のデモンストレーションをさせていただきました.

ものの数分で部屋の地図を作った後,障害物を避けながら自律的に移動するロボットに,学生さんたちも興味津々でした.

2017-06-28 12.32.23 navigation_stage_3
その後,名城大学の真新しくてモダンな構内で,ロボットを動かしてデータを取る機会をいただきました.大きな長方形の通路を一周し,これまでにない大きなループの経路のデータを取ることができました.果たして,RoomblockとROSの地図生成パッケージはちゃんと地図を作ることができたのか,後ほど報告したいと思います.

IMG_2401 IMG_2414
名城大学の目黒先生,学生の皆様方,ご協力どうもありがとうございました.

TORKでは,自律移動編を含むROS初級,中級のワークショップ,企業や大学でのプライベートワークショップのご依頼も承っております.お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp

著者:Isaac Saito

NEXTAGE OPEN も登場:MoveIt! 5周年記念モンタージュビデオ

ROS の動作計画ライブラリ MoveIt! が,5周年を記念してアプリケーション例のビデオを公開しました.

MoveIt! チームがこのようなビデオを公開するのは4年前・2013年に次いで2度目ですが,ソフトウェア公開間もなかった当時と比べ,だいぶ Pick&Place,物を掴んで目的地に設置するというタスクが多く,技術の進展が窺えます.個人的には MoveIt! の課題領域としても挙げられている台車,水中ローバ等の移動体に取り付けられたアームの制御例が数件含まれ,既に実現されてるのかも気になります (このページの “Mobile base integration”).

また弊社がその opensource 版ソフトウェアのメンテナンスに積極的に関わり,サポートサービスも提供させて頂いているカワダロボティクス社製 NEXTAGE OPEN も登場します.弊社ブログ上でもお馴染み?の Spain のシステムインテグレータ・Tecnalia 社が手がける Airbus 向けアプリと思われます.

Hironx in motion from MoveIt! 5-year montage. Image courtesy of Tecnalia

Hironx in motion from MoveIt! 5-year montage by courtesy of Tecnalia

TORK では2013年の創業以来,ROS,MoveIt! のソフトウェア改良,普及に貢献し続けています.貴社ロボットへの MoveIt! の導入御検討であれば,弊社ワークショップで体験もできますので,参加を是非御検討下さい.

P.S. 今回のビデオの開発者一覧も公開されました.

(0:06) Delft Robotics and TU Delft Robotics Institute
(0:09) Techman Robot Inc.
(0:13) Correll Lab, CU Boulder
(0:37) Nuclear & Applied Robotics Group, Unv Texas
(0:50) Beta Robots
(0:55) GIRONA UNDERWATER VISION AND ROBOTICS
(1:03) Team VIGIR
(1:34) Honeybee Robotics
(1:49) ROBOTIS
(1:58) TECNALIA
(2:05) Correll Lab, CU Boulder
(2:26) TODO Driving under green blocks
(2:38) ROBOTIS
(2:54) Fetch Robotics
(3:05) Hochschule Ravensburg-Weingarten
(3:12) TU Darmstadt and Taurob GmbH – Team ARGONAUTS
(3:20) isys vision
(3:27) Technical Aspects of Multimodal System Group / Hamburg University
(3:33) Clearpath Robotics
(3:43) Shadow Robot

著者:Yumiko Suzuki

ROS Workshop Schedule from July to August 20172017年7月-8月のROSワークショップ日程


Here are the schedule of our ROS workshop series in Summer 2017!

July 05 Wed. 13:30- Introductory
July 12 Wed. 13:30- Introductory
July 19 Wed. 13:30- Introductory
Aug. 02 Wed. 13:30- Introductory
Aug. 08 Tue. 13:30- Introductory
Aug. 30 Wed. 13:30- Introductory
Venue: Yurakucho, Tokyo

Inquiries: info[at]opensource-robotics.tokyo.jp



以下日程でROSワークショップを行います.

7月05日(水)13:30~ ROSワークショップ初級編
7月12日(水)13:30~ ROSワークショップ初級編
7月19日(水)13:30~ ROSワークショップ初級編
8月02日(水)13:30~ ROSワークショップ初級編
8月08日(火)13:30~ ROSワークショップ初級編
8月30日(水)13:30~ ROSワークショップ初級編

場所は都内・有楽町の会議室での実施を予定しています.

中級編についてはご要望があり次第,日程を調整いたしますのでメイルにてお問い合わせください.
(初級編を受講した方を対象としております.中級マニピュレーション編のページをご参照ください)

お申込みは以下より詳細をご確認の上,ページ内のお申込みリンクよりエントリをお願い致します.

ROSワークショップ初級編

上記以外での日程の調整,その他ご相談,開発委託,出張ワークショップ,カスタマイズワークショップも承っております.お気軽にご相談ください.
info[at]opensource-robotics.tokyo.jp

IMG_20151112_182120

著者:Isaac Saito

MoveIt! 計画された軌道のビジュアライゼーション

2017年6月初のパッケージ更新により MoveIt! が更新され,これまで要望のあった軌道の目視確認機能が追加されました.
これまでは,生成させた経路を確認するには,RViz 上で “Loop Animation” をオンにして経路を反復再生させる手があったかと思います.この方法だと経路の途中の任意の経由点で止めることはできませんでした.
今回追加された機能を使うと,RViz 上でスライダを移動することにより,軌道の経由点を静止した状態で目視確認できます.

Introspect waypoints in a planned trajectory on MoveIt! on NEXTAGE Open.

As you see on the slider on the left side, you can now introspect each waypoint in a planned trajectory on MoveIt! on NEXTAGE Open.

本機能を有効にする方法はチュートリアルを参照下さい.

著者:Ryosuke Tajima

ROS Intermidiate (Navigation) Workshop in Nagoya 名古屋にてROSワークショップ中級・自律移動編を開催しました

We had the intermidiate ROS workshop on navigation at Meijo University, Nagoya, Aichi. They learned the navigation features of ROS using simulation and a real robot named “Roomblock”, Roomba based robot. Mapping, localization, control are

Thanks everyone, and well done!!


前回の初級編に続き,名古屋市の名城大学メカトロニクス工学科で,プライベートROSワークショップ中級・自律移動編を開催しました.この自律移動編は今年度から新しく始まったもので,初めての開催となります.

中級・自律移動編では,まずシミュレータを用いた自律移動技術のハンズオンを行います.つぎに,iRobot社の掃除ロボット,ルンバをベースにした自律移動ロボット”Roomblock”を用いて実際に地図生成と自律移動を行います.”Roomblock”はラズベリーパイとLIDAR(レーザ距離スキャナ)を備えた立派な自律移動ロボットで,部屋の地図を作り,目的地を設定してそこに移動することができます.最後に,ROSの自律移動機能の解説(全体の構成,関連するtopic, move_baseの仕組みなど)を受け,ハンズオンで出てくる疑問点を解消していきます.

車輪移動ロボットの操作方法,地図の生成,自律移動を実際にやってみることで,自律移動技術の理解がより深まるものと思います.参加者の皆様方,お疲れ様でした.今後の研究開発の一助となれば幸いです.

このように,TORKでは企業や大学でのプライベートワークショップのご依頼も承っております.また,本年からは中部地区での開催を増やしていこうと考えています.お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp

IMG_2340

IMG_2346

IMG_2347