著者アーカイブ yamamoto.yosuke

著者: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 にお問い合わせいただくと販売可能とのことです.

著者: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