■ロボットアームと6次元楕円体(その3)

 
 視点の位置を変えながら,物体を様々な方向から眺める3Dグラフィックスには遠くおよびませんが,今回のコラムでは,3次元楕円を3方向(正面・水平面・側面)から見た3面図を同時にディスプレーに表示する方法を考えてみましょう.
 
===================================
 
【1】3面図表示
 
 xとyの取り扱いは今まで通りなのですが,ディスプレーの奥側をz軸の正の方向とします(左手系).すると,z軸の負の方向から見た図が正面図になります.y軸の正の方向から見た図が平面図(上面図),x軸の正の方向から見た図が側面図(左側面図)ですが,これで各軸方向から見た図が同一面上に表示され,第3角法による3面図ができあがります.
 
 すなわち,平面図(上面図)と側面図(左側面図)を画面の奥の方に向かって折り曲げることによって,3次元楕円が立体的に理解できるような工夫が3面図なのです.
 
 また,ここでは左手系を採用しましたが,そうすると3面とも描画領域の左下が原点,右が横軸の正,上が縦軸の正の向きになりますから,左手系と第3角法による3面図の相性は実によいのです.
 
 3次元楕円ですから極は3組あるわけですが,実際に描かれた図を見ると,極や経線・緯線が対応しているのがおわかり頂けると思います.そのための隠線処理の工夫が7120行と7190行になされています.正面図は負の方向から描かれているのに対して,平面図と側面図は正の方向から描かれていますから,法線ベクトルを反転させる必要があるのです.
 
===================================
 
【2】3次元切り口を2次元平面に正射影するプロシージャ
 
 6次元楕円の2次元平面および3次元空間への正射影を考えると,3次元空間への正射影(3次元楕円)を2次元平面に投影した楕円と,最初から2次元平面に正射影した楕円は一致します.
 
 それに対して,6次元楕円の2次元平面での切り口と3次元空間での切り口(3次元楕円)を2次元平面に投影したものでは,楕円の大きさが一致しません.
 
 とても不思議に感じられたのですが,よくよく考えると大きさが整合しないのは当たり前です.2次元切り口は3次元切り口の2次元平面での切り口であって,3次元切り口の2次元平面への正射影ではないからです.歯切れの悪い説明で申し訳ありませんが,正射影の正射影は正射影ですが,切り口の切り口は切り口であって正射影ではないために,楕円の大きさが一致しないのです.
 
 求めたいものはロボットアームに関する速度楕円・角速度楕円ですから,2次元平面での切り口(3次元切り口の切り口)は,速度楕円・角速度楕円の一部しか反映していないので,これを描いてもあまり意味がないことになります.
 
 つまり,3次元空間での切り口を3面図に表示するときは,3次元切り口の2次元平面上への正射影を表示しなければならないのですが,これまでのステップでは,3次元切り口の正射影のワイヤーフレームは既に描けているものの,3次元切り口の2次元平面への正射影の輪郭を描くことはできません.(3次元正射影を2次元に正射影して輪郭を描くことは既にできている.)
 
 3次元切り口を2次元平面に正射影する際の計算手順は以下のようになります.それはこれまで解決してきた投影問題の応用として得られるのですが,
 
  (1)ヤコビアン(J)の入力
  (2)ヘシアン(H=(JJ’)~)の計算
  (3)ヘシアンの小行列(Hijk)を求める
  (4)ヘシアンの小行列の逆行列(Vijk=Hijk~)を求める
  (5)逆行列の小行列(Vij)の固有値・固有ベクトルを求める
  (6)軸の長さを√λとする
 
で計算できます.なお,プログラム中の作図パラメータIJKを0とすると,ワイヤーフレームモードが解除され,3次元楕円の正射影となる2次元楕円の輪郭だけが描かれます.
 
===================================
 
【3】プログラム
 
 
7970 '
7980 ' *** 楕円体三面図 ***
7990 '
8000 *ELLIPSOID3:
8010 CLS 3
8020 IJK=2
8030 IB=1:JB=2:KB=3:BIAS=0
8040 IF IJK<>0 THEN GOSUB *EIGEN.WF
8050 IF IJK=0 AND STAGE$="2" THEN GOSUB *SECTION3
8060 IF IJK=0 THEN GOSUB *COMMON3:GOTO 8170
8070 '
8080 SX1=59:SY1=360*(1-RY/2):SX2=580*RX/2+59:SY2=360
8090 VHP=1:I=IB:J=JB:GOSUB *ELLIPSOID3.SUB
8100 '
8110 SX1=59:SY1=360*(1-RY):SX2=580*RX/2+59:SY2=360*(1-RY/2)
8120 VHP=2:I=IB:J=KB:GOSUB *ELLIPSOID3.SUB
8130 '
8140 SX1=580*RX/2+59:SY1=360*(1-RY/2):SX2=580*RX+59:SY2=360
8150 VHP=3:I=KB:J=JB:GOSUB *ELLIPSOID3.SUB
8160 'DRAW.COLOR=1:VHP=0:IJK=0:GOSUB *COMMON3:DRAW.COLOR=4
8170 '
8180 GOSUB *TITLE.BACK3
8190 GOSUB *TEMP
8200 '
8210 CLS 3
8220 IB=4:JB=5:KB=6:BIAS=3
8230 IF IJK<>0 THEN GOSUB *EIGEN.WF
8240 IF IJK=0 AND STAGE$="2" THEN GOSUB *SECTION3
8250 IF IJK=0 THEN GOSUB *COMMON3:GOTO 8360
8260 '
8270 SX1=59:SY1=360*(1-RY/2):SX2=580*RX/2+59:SY2=360
8280 VHP=1:I=IB:J=JB:GOSUB *ELLIPSOID3.SUB
8290 '
8300 SX1=59:SY1=360*(1-RY):SX2=580*RX/2+59:SY2=360*(1-RY/2)
8310 VHP=2:I=IB:J=KB:GOSUB *ELLIPSOID3.SUB
8320 '
8330 SX1=580*RX/2+59:SY1=360*(1-RY/2):SX2=580*RX+59:SY2=360
8340 VHP=3:I=KB:J=JB:GOSUB *ELLIPSOID3.SUB
8350 'DRAW.COLOR=1:VHP=0:IJK=0:GOSUB *COMMON3:DRAW.COLOR=4
8360 '
8370 GOSUB *TITLE.BACK3
8380 GOSUB *TEMP
8390 RETURN
8400 '
8410 *COMMON3:
8420 SX1=59:SY1=360*(1-RY/2):SX2=580*RX/2+59:SY2=360
8430 I=IB:J=JB:GOSUB *ELLIPSOID3.SUB
8440 '
8450 SX1=59:SY1=360*(1-RY):SX2=580*RX/2+59:SY2=360*(1-RY/2)
8460 I=IB:J=KB:GOSUB *ELLIPSOID3.SUB
8470 '
8480 SX1=580*RX/2+59:SY1=360*(1-RY/2):SX2=580*RX+59:SY2=360
8490 I=KB:J=JB:GOSUB *ELLIPSOID3.SUB
8500 'SX1=580*RX/2+59:SY1=360*(1-RY):SX2=580*RX+59:SY2=360*(1-RY/2)
8510 RETURN
8520 '
8530 *ELLIPSOID3.SUB:
8540 UO=VO(IB):UL=VL(IB)
8550 VO=VO(JB):VL=VL(JB)
8560 DU=VD(IB):SU=VS(IB)
8570 DV=VD(JB):SV=VS(JB)
8580 '
8590 LINE(SX1,SY1)-(SX2,SY2),GRP.COLOR,B
8600 RR=2:GOSUB *X.SCALE2
8610 RR=2:GOSUB *Y.SCALE2
8620 'RR=2:GOSUB *DOT.PLOT
8630 GOSUB *DRAW.ELLIPSE3
8640 RETURN
8650 '
8660 ' *** 三面鏡 ***
8670 '
8680 *DRAW.ELLIPSE3:
8690 'DRAW.COLOR=4
8700 WUO=UO-UL:WUL=UO+UL
8710 WVO=VO-VL:WVL=VO+VL
8720 WINDOW(WUO,-WVL)-(WUL,-WVO)
8730 VIEW(SX1,SY1)-(SX2,SY2)
8740 '
8750 IF IJK<>0 THEN GOSUB *COMMON.WF
8760 IF IJK=0 AND STAGE$="1" THEN GOSUB *CONTOUR
8770 IF IJK=0 AND STAGE$="2" THEN GOSUB *CONTOUR
8780 'IF IJK=0 AND STAGE$="2" THEN GOSUB *SECTION
8790 'GOSUB *COMMON.WF
8800 'GOSUB *CONTOUR
8810 'GOSUB *SECTION
8820 '
8830 WINDOW(0,0)-(639,399)
8840 VIEW(0,0)-(639,399)
8850 RETURN
8860 '
8870 ' *** 3次元切断面の輪郭 ***
8880 '
8890 *SECTION3:
8900 AZ(1,1)=HESSE(IB,IB)
8910 AZ(1,2)=HESSE(IB,JB)
8920 AZ(1,3)=HESSE(IB,KB)
8930 AZ(2,1)=AZ(1,2)
8940 AZ(2,2)=HESSE(JB,JB)
8950 AZ(2,3)=HESSE(JB,KB)
8960 AZ(3,1)=AZ(1,3)
8970 AZ(3,2)=AZ(2,3)
8980 AZ(3,3)=HESSE(KB,KB)
8990 NZ=3:GOSUB *INVERSE
9000 '
9010 FOR I=1 TO 3
9020  FOR J=1 TO 3:COV(I+BIAS,J+BIAS)=BZ(I,J):NEXT J
9030 NEXT I
9040 RETURN
9050 '
9060 ' *** タイトル ***
9070 '
9080 *TITLE.BACK3:
9090 LX=INT((580*RX+59)/8)
9100 LY=INT(360*(1-RY)/16)
9110 LZ=INT((290*RX+59)/8)
9120 L1$="ellipsoid projection of "
9130 L2$="v"+MID$(STR$(IB),2)+"-"
9140 L3$="v"+MID$(STR$(JB),2)+"-"
9150 L4$="v"+MID$(STR$(KB),2)+" space"
9160 L$=L1$+L2$+L3$+L4$
9170 LOCATE LZ-LEN(L$)\2,LY-3:PRINT L$
9180 '
9190 LOCATE LX+3,LY:PRINT "v components: "
9200 FOR K=1 TO M
9210  V$="v"+MID$(STR$(K),2)+"="
9220  LOCATE LX+3,LY+K+1:PRINT V$;:PRINT V(K)
9230 NEXT K
9240 '
9250 LOCATE LX+3,19:PRINT "horizontal|"
9260 LOCATE LX+3,20:PRINT "-------------------"
9270 LOCATE LX+3,21:PRINT " vertical | profile"
9280 RETURN
 
 2次元楕円のプログラムは,固有値・固有ベクトルを求めるのに,回転行列を用いて楕円半径と楕円の配向を定めていますから,整合性に問題はありません.
 
 したがって,3次元楕円に2次元楕円を重ねて描かせることによって,整合性の不具合をチェックすることが可能になります.8760行と8770行にそのための対策を施していますが,正しく描かれている場合,3次元空間への正射影と2次元平面への正射影はぴったり重なり,3次元切り口のなかに2次元切り口が含まれることになります.
 
===================================
 
【4】まとめ
 
 昔から「百聞は一見にしかず」といわれていますが,これで,ロボットアームの動作を評価するための6次元楕円の視覚化プログラムはほぼ完成,所期の目的は達成されたことになります.n次元楕円は直接には見ることのできない高次元図形ですから,ここで述べた可視化によってイメージの理解が助けられるものと信じています.
 
 あとはロボットアームの機能を解析するために必要な指標を設定し,それらの意味付けを行うことです.可視化が完了したというだけで,この方法のもつ意義,工学における位置づけ,応用等についてはほとんど手がついていないのです.
 
 しかし,私はロボットアームに関してはズブの素人であり,こうした問題に詳しい人を相手に語るほどの知識はありません.ただ,門外漢ながら,3面図表示はロボットアームの機能評価に最も有用な方法であると考えています.なぜなら,6次元楕円は15面鏡(v1-v2,v1-v3,v2-v3などそれぞれのv1〜v6の各組み合わせの2次元平面への正射影)を用いなければ全体像を映し出すことはできないわけですが,ロボットアームの場合,3次元速度空間(v1,v2,v3)あるいは角速度空間(v4,v5,v6)へ投影した2組の3面図だけで,全体像をほぼ網羅し,必要な情報を掌握できるからです.
 
 6次元楕円体がロボットアーム以外にも応用可能と思われる分野をあげておきましょう.地震では東西・南北・天地方向の揺ればかりではなく,建物全体が捻れるように動くのですが,揺れるといっても左右に揺らぐばかりではなく,捻れながら揺れるのですから,これも6次元振動の例と考えられます.また,関節が関係する医学,歯学分野への応用も容易に考えられるところです.
 
 6次元楕円をn次元楕円に拡張することは容易ですから,将来的には,アームの設計,マニピュレータの制御問題,障害物回避問題などに対して,n次元楕円に制約条件の入った問題,確率論的な条件を設けなければならない問題も考えなければならなくなるでしょう.この可視化評価法の応用範囲が広がることを願っています.
 
===================================
 
【5】6次元楕円の応用(佐々木先生の研究)
 
 最後に,秋田大の佐々木誠先生(makoto@control.mech.akita-u.ac.jp)によるメカトロニクス研究を紹介しておきたいと思います.
 
 佐々木先生は,ここに掲げたソースを加工して,視点の位置を変えながら6次元楕円を様々な方向から眺める3Dグラフィックスに発展させたアドバンスト・プログラムを作成し,それを用いて車イスの動作解析に応用しています.
 
 その成果は,本年11月8,9日の「第2回福祉工学シンポジウム」愛知県産業貿易会館において
  「車いす座位での操作空間における上肢運動特性の評価」
の演題名で発表されます.
 
 予稿集を読んでみて初めて知ったのですが,いまある車イスは最小の人力で最大の操作性を発揮できるような理論的な設計がなされておらず,機能的には最適とはいいがたいのです.
 
 そこで,たとえば,筋力の衰えた高齢者に対して,個人個人特有の動きやすさを活かせる福祉機器を与えることができれば,その人の生活基盤を支えるのにかなり有効に働いてくれると思われます.佐々木先生の車イスへの応用によって,これまで多分に経験則的なアイディアのもとに構成されていて,ロジカル設計でなかった車イスの改良などが期待できるというわけです.
 
 6次元楕円を描くことはできても,応用分野をもたないわが身にとっては,これは私の予想を超えた結果でした.その他の感想も列挙すると,
  (1)6次元楕円体は技術というよりは新しい方法論であって,今は福祉工学への応用を目指して専ら車イスに応用している段階にある.
  (2)佐々木先生の研究はメカトロニクスへの応用にとってはほんの一里塚であって,将来的には,ロボットアームの設計や制御への応用を指向できるものと思われるが,マニピュレータの制御や地震波の解析などに用いられるようになるには,もう少し時間がかかるであろう.
  (3)しかし,6次元楕円体の応用はたったいま始まったばかりである.いまだ若く未完成の部分も多いのだが,その適用範囲の広さには計り知れないものがある.
 
 佐々木先生の研究が理解され,浸透し定着するまでにはまだまだ時間がかかりそうですが,立派な研究と考えられるので,折々このコラムで研究の進捗状況をフォローアップしていきたいと考えています.更なる成果を期待をしています.
 
===================================