質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1613閲覧

Unity(C#)とVisualStudio(C++)の連帯が行いたいです

totototwist

総合スコア10

DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2022/01/08 06:13

前提・実現したいこと

現在、Unityにて3軸ロボットの機械学習を行っています。そのUnity上の各軸の回転角度を、実空間にある3軸ロボットの回転角度として渡すことでリアルタイムでの動作の獲得を目指しています。
そこで、UnityでのデータををC++による制御プログラムに与えたいです。

Unity上の軸にはHIngeJointを与えており、TargetPositionを変化させて回転させています。
また、実機の制御はVisualStudio、C++でプログラムを書いており、作成済の状態です。

発生している問題・エラーメッセージ

ここで、Unity(C#)の回転角度情報をC++内のプログラミングに送りたいのですが、うまくいきません。
DllExport.bat をダウンロードし、C#(DLL)側で関数をエクスポートする方法など試しましたが、Unity側でエラーが発生してしまいます。

error CS0246: The type or namespace name 'DllExport' could not be found (are you missing a using directive or an assembly reference?) error CS0246: The type or namespace name 'DllExportAttribute' could not be found (are you missing a using directive or an assembly reference?)

該当のソースコード

関連する箇所の一部抜粋です。C++に送りたい情報は、以下のA1,2,3です。VisualStudioではエラーなくビルドできるのですが、上記のようにUnityでエラーが出ます。

C#

1using System.Runtime.InteropServices; 2 3public class ArmAgentVRNoEnemy : Agent 4{ 5  (中略) 6//A2,3 も同様 7private HingeJoint hinge1; 8private float A1 = 0; 9 10 11 [DllExport] 12 public static void ChangePos() 13 { 14     //それぞれの軸をA1,A2,A3として、A2,3も下記のように定義しています。 15 JointSpring hingeSpring = hinge1.spring; 16 hingeSpring.targetPosition = A1; 17 hinge1.spring = hingeSpring; 18      19     20 } 21 22

C++の制御プログラムの一部です。
この関数内に、UnityのA1,2,3の情報を与えたいです。
UseMaxChannel: 使用チャンネル数(= DOF)
Angle : 関節角度ベクトル [rad] (= q[DOF])
Velocity : 関節角速度ベクトル [rad] (= dq[DOF])
SamplingTime : 取得間隔時間 [s] (= 0.001)

C++

1 2 3 4void GetAngle(int UseMaxChannel, double* Angle, double* Velocity, double SamplingTime) 5{ 6 int i; 7 static const int BoardMaxChannel = 8; // 【要設定】CNTボードの最大チャンネル数を設定する 8 static long InPulse[BoardMaxChannel]; 9 static double InAngle[BoardMaxChannel]; 10 static double PreAngle[BoardMaxChannel] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; 11 12 13 // conv. of Pulse to Angle 14 //InAngle[i] = //本来は、エンコーダパルス数や角度の関係から設定します 15 Angle[i] = //この部分を直接Unityからの各角度データにしたいです。 16 Velocity[i] = //(InAngle[i] - PreAngle[i]) / SamplingTime;  17 PreAngle[i] = //InAngle[i]; 18 } 19}

試したこと

C++での制御プログラムは本来Unityではなく実機での制御で用いていたもので、それ自体にはエラーはありません。
DllExport.bat をダウンロードする以外の方法を現在模索しているところですが、他にUnityとVisualStudio、C++を同期させる方法があればご教授いただけると幸いです。

まだ学習を始めてまもなく、今回の質問においても不足している情報や知識があると思いますがどうぞよろしくお願いします。

補足情報(FW/ツールのバージョンなど)

VisualStudio2019
Unity 2020.3.24f1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2022/01/08 12:26

C++/CLI を使わないのであれば、C++ ではなく C を使う方が簡単だと思います。
totototwist

2022/01/09 04:06

ご指摘ありがとうございます。 このC++で作ったプログラムはロボットを制御するために、他にも複数のヘッダーファイルやソースファイルと絡んでいるので、出来ればC++での大きな変更は避けたいですが場合によっては修正したいと思います。C++/CLIに関しては現在検討中です。
退会済みユーザー

退会済みユーザー

2022/01/11 08:24 編集

どういうプログラム構成やシナリオか良く分からないのですが、名前付きパイプとかで通信すればいいんじゃないでしょうか。
guest

回答1

0

自己解決

今回の問題の実質的な解決策ではありませんが、C# 内の関数を呼び角度データを得る方法から、シンプルにソケット通信を用いて値のみを送る方法に切り替えたいと思います。

投稿2022/01/13 09:14

totototwist

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問