HAPTION Virtuose メモ

ロボットポータル
https://qiita.com/carpenders/items/1a653b1ca831547c92d3

## Virtuoseアプリ開発環境 VS2019で作成

### デモプログラムビルド
回答 2023/01/10 12:26
以下のデモプログラムをビルドする。
ビルド対象は Win32/{Debug,Release} x64は非対応
```
HAPTION\virtuoseDemo_v4.60_EN_src\Packaging\Windows VC2019-virtuoseDemo.sln
```
### 警告対応
回答 2023/01/06 20:10
文字コードの警告が出るので以下を設定する。
プロジェクト - プロパティ - 構成プロパティ - C/C++ - コマンドライン
```
追加のオプション = /source-charset:iso-8859-1 /execution-charset:iso-8859-1
```
### ライブラリビルド
回答 2023/01/06 20:10
デモプログラムWin32/Releaseでリンクエラーが出るので以下でライブラリをビルドする。
ビルド対象は Win32/{Debug,Release}
```
HAPTION\virtuoseDemo_v4.60_EN_src\Dependencies\glui\make\win VC2019-glui.sln
```
### エラー対応
回答 2023/01/10 12:26
SDKバージョン違いのエラーが出るので以下を設定する。
プロジェクト - プロパティ - 構成プロパティ - 全般
```
WindowsSDKバージョン = 10.0 (latest installed)
```
### 再度デモプログラムビルド
再度以下をビルドすると成功する。
```
HAPTION\virtuoseDemo_v4.60_EN_src\Packaging\Windows VC2019-virtuoseDemo.sln
```
参考
Win32/DebugのLIBDIRは以下に設定されている。
プロジェクト - プロパティ - 構成プロパティ - リンカー - 全般
```
追加のライブラリディレクトリ =
..\..\..\Dependencies\glui\lib\windows\win32;
..\..\..\Dependencies\glui\make\win\VC2019\win32\Debug;
..\..\..\Dependencies\ode\make\win\VC2019\Output\lib\win32\Debug\;
..\..\..\Dependencies\virtuoseAPI\win\lib\VC2019\Win32\Debug;
%(AdditionalLibraryDirectories)
```
Win32/ReleaseのLIBDIRは以下に設定されている。
プロジェクト - プロパティ - 構成プロパティ - リンカー - 全般
```
追加のライブラリディレクトリ =
..\..\..\Dependencies\glui\lib\windows\win32;
..\..\..\Dependencies\glui\make\win\VC2019\win32\Release;
..\..\..\Dependencies\ode\make\win\VC2019\Output\lib\win32\Release\;
..\..\..\Dependencies\virtuoseAPI\win\lib\VC2019\Win32\Release;
%(AdditionalLibraryDirectories)
```

## 質問その１
回答 2023/01/10 13:46
Q1 Virtuoseの初期姿勢（ゼロ姿勢）について

ややこしいので、初期姿勢はスタート時点での任意の姿勢、
ゼロ姿勢が、クォータニオン(x, y, z, w)が(0, 0, 0, 1)
のときの姿勢(回転軸なし、回転角度ゼロ)とさせて頂きます。

Virtuoseの座標軸は、マニュアル（DT1076-001_Documentation_API_4-03_rev2_EN.pdf）
の6～7ページに記載されています。

それに対してVirtuoseのハンドルのゼロ姿勢は、次の写真の様になります。

※この姿勢はVirtuoseのモデルにより異なる可能性がありますので、
Virtuose 3Dのゼロ姿勢についてHAPTION社に確認致します。

回転状態をロボットの操作へ利用する場合は、
Virtuoseの初期姿勢から現在の姿勢までの回転の差分を
ロボットの初期姿勢に対して適用する方法が宜しいかと思います。

それにより、操作中のオフセット変更なども可能となります。
オフセットは、例えば下記Youtube動画の、1:47秒のところで
行っている操作で、ロボットを停止した状態で、
Virtuoseハンドルの位置や向きを変更する操作です。
https://www.youtube.com/watch?v=R1IucWuDb5M

Virtuose APIのVIRTMECHという制御モードを使用すると、
このような動作を簡単に実装することができます。
Tutorial_VirtuoseAPI_2019.pdf の11ページに記載があります。
このモードでは、Virtuoseを位置／位置制御（位置取得／位置指令）
できるようになります。

Q2 ゼロフォースについて

インピーダンス制御モードで
virtSetForce(すべてゼロフォース) にすれば、
Virtuoseは無気力なダラリとした状態になり、
操作者が反力等の負荷を感じる事なく操作可能です。

Q3 距離に比例した力について

１回目に実行したvirtGetPosition()のXYZ位置を覚えておき
その位置とvirtGetPosition()で取得したXYZ位置との
XYZ各軸の距離に比例してvirtSetForce()のパラメータを指示することで
アプリケーション起動時の位置からXYZ各軸の距離に比例した力を発生
させることができます。

Q4 Windowsで 1msec周期のコールバック設定の場合のジッタについて

Windowsですので、どうしてもリアルタイム性は保証されませんが、
UDP受信による割込を利用して周期管理しているはずですので、
コールバック関数はそこそこ正確な周期で呼び出され、
平均1msec周期での駆動が可能です。
ジッタは実際のPC環境やプログラムに依存しますので、
一概には言えませんので、ご使用の環境で実測して頂いた方が
宜しいかと思います。

## 質問その２
回答 2023/01/13 11:16
Q1 使用するライブラリについて

VirtuoseAPI_v4_04 フォルダ内のヘッダー、lib、dll をご使用下さい。

Q2 MDとは

これは、使用するランタイムライブラリの違いです。
実際に作成されたプロジェクトで使用するランタイムライブラリに合わせて、
MTxを使用する場合は無印を、MDxを使用する場合はMDを選択して下さい。

## 質問その３
回答 2023/03/08 9:39
Q1 Win32/DebugでVirtuoseAPIを使うとメモリリークが発生します
未回答

Q2 int virtGetPosition(VirtContext VC, float *pos_p_env);
The pos_p_env parameter is set by the virtGetPosition function. It is expressed in the form of a displacement vector with 7 components, in the coordinates of the environment reference frame.
・７要素の順番はXYZ,Quotanionでしょうか？ 
→ はい
・Quotanion内の順番はXYZWでしょうか？ 
→ はい
・Quotanionは正規化されて大きさ１でしょうか？
→ はい
・位置情報XYZの数値の単位をお知らせ下さい。
→ メートルです。

Q3 int virtGetButton(VirtContext VC, int button, int *state); 
The button parameter corresponds of the button index. 
ボタンは３つなので、buttonに指定する数値は0,1,2でしょうか？又は1,2,3でしょうか？

Virtuose 3D S/N 238 のvirtGetButton() に指定するボタンのIDは、以下の通りです。
左（黒）：2
中（白）：取れない
右（黒）：1
FORCE FEEDBACK：3,4,5,6
グラブセンサ：15
ESTOP: 16
真ん中の白いボタンは、オフセットボタンで、ボタンの状態はこの関数では取得できません。必要な場合は、以下の様にvirtGetDigitalInputs()を使用して取得することができます。
Int d = 0;
virtGetDigitalInputs(virtContext, &d);
white_button = 1 & (d >> 2));