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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

Unity

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

Q&A

解決済

1回答

1705閲覧

Windows-Unity間のUDP通信による顔認識データの送信

Izayoi-san

総合スコア12

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

Unity

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

0グッド

0クリップ

投稿2020/09/01 23:59

編集2020/09/02 02:04

現在、VisualStudio2019で作成したexeファイルをWindowsで起動させて、
その際に得たデータをpicojson化しUDP通信を用いてUnityのMonoBehaviourを継承したクラスで受信することを考えています。
これにより、Unity内のゲームオブジェクトを
顔の動きに合わせて動かしたいと考えています。
その際に、受信側に関して、ゲームオブジェクトに貼り付けて、データを受信するプログラムの作成がうまくいかずに難航しています。

データは下記のように、WEBカメラを用いて顔認証をした際の顔座標、顔位置を数値化したものを使います。

C++

1//Unity側への送信用データを作成する(picojsonへ読み込み) 2 picojson::object obj; 3 //顔位置X座標 4 obj.emplace(std::make_pair("horizontal_pos", actor.horizontal_pos)); 5 //顔位置Y座標 6 obj.emplace(std::make_pair("vertical_pos", actor.vertical_pos)); 7 //顔姿勢 Y軸 8 obj.emplace(std::make_pair("yow", actor.yaw)); 9 //顔姿勢 X軸 10 obj.emplace(std::make_pair("pitch", actor.pitch)); 11 //顔姿勢 Z軸 12 obj.emplace(std::make_pair("roll", actor.roll)); 13 //全部の顔器官点を格納 14 picojson::array mouse; 15 for (unsigned int i = 0; i < FACIAL_POINTS; ++i) 16 { 17 picojson::array coord; 18 coord.push_back(picojson::value((double)shape.part(i).x())); 19 coord.push_back(picojson::value((double)shape.part(i).y())); 20 mouse.push_back(picojson::value(coord)); 21 } 22 obj.emplace(std::make_pair("obj", picojson::value(mouse))); 23 //文字列に変換 24 picojson::value val(obj); 25 26 //シリアライズ 27 std::string msg = val.serialize(); 28 //送信 sendto(ソケット, 送信するデータ, データのバイト数, フラグ, アドレス情報, アドレス情報のサイズ); 29 sendto(sock, msg.c_str(), msg.size(), 0, (struct sockaddr*) & addr, sizeof(addr));

データ送信に関してはサンプルコードがあり、それを参考にすることで作成しました。
しかし、受信側に関してはwindowsを用いた場合のサンプルコードが見つけられておらず、テスト用のプログラムも作成できておりません。

私自身がUDP通信やプログラムを触り始めということもありますので、
参考となる文献や、実現するために必要なコマンドに関してご教授いただけると幸いです。

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

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

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

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

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

dodox86

2020/09/02 00:31

UDPの受信側はUnityのMonoBehaviourを継承したクラスで、と言うことでしょうか。C#での記述になると思いますが、Unity必須かどうかで回答も少し変わってくるかと思いますので、その辺りを質問文中に追記した方が良いと思います。Unityはいったん置いておいて、C#、.NET Frameworkを利用したUDP通信なら、サンプルは豊富にあるはずです。
Izayoi-san

2020/09/02 00:40

ご指摘頂きありがとうございます。 指摘頂いたことから、私の実現したい内容が不明瞭であったと認識したため、それらについて質問文中に追記しました。 今回は顔認証に基づく、顔の座標などの数値をUnity内のゲームオブジェクトに反映させたいと考えているため、Unityは必須になります。 UDP通信について調べたところ、Windowsではなく、Linuxを使っているものならありました。 しかし、Linux用のプログラムに用いられているヘッダーファイルが、Windowsでは用意されていないなど、参考にすることが困難であったため、御教授頂けると幸いです。
dodox86

2020/09/02 02:03

> データを受信するプログラムの作成がうまくいかずに難航しています。 うまくいかず難航、と言うことはコード自体は試されて書かれているように文面からは思えます。そのコードでどう難航しているのか示した方が良いのではないかと。
dodox86

2020/09/02 02:07

> windowsを用いた場合のサンプルコードが見つけられておらず、テスト用のプログラムも作成できておりません。 この点を見落としていました。要は、Unity側のプログラムでUDPでの受信は今現在は一切できていないということですね。
Izayoi-san

2020/09/02 03:08

恥ずかしながらおっしゃる通りです。 サンプルコードを探して、それを改良する。という手順を考えていましたが、見つけられたサンプルコードがLINUX用であり、ヘッダーファイルがWindowsでは使えないないものであったため、受信用のプログラムが何一つできていない、という状態です。 そのため、参考文献やサンプルコードに関して、ご教授いただければと思い質問をさせていただきました。
guest

回答1

0

ベストアンサー

Linux(UN*X)やWindowsのネイティブでのUDP通信のプログラミングは基本、C言語でのものとなるので、ソケットプログラミングの勉強として構えない限り、質問者さんがやりたいことには直接結びつきません。(ただし、内容を理解する限り、決して無駄ではありません)

UDPの受信側のプラットフォームがUnityであるということは、用いるプログラミング言語としてはC#になろうかと思います。この場合、.NET Framework、.NET CoreでのUDP送信、受信のサンプルとその使い方にまずあたるべきでしょう。

UDPによりデータの送受信を行う - dobon.net

受信側はいつそのUDPのデータ受信がなされるかは分からないので、Unityでプログラミングするのであれば、スレッドや非同期での受信を行うかたちになるはずです。

UdpClient.BeginReceive - Microsoft Docs

このマイクロソフトのUdpClient.BeginReceiveのリファレンス中に示してあるサンプルコードをUnity用にあてはめて書くと、およそ以下のようになります。UDPポート番号として2002番で受信し、UnityEngine.Debug.Log()で出力します。

C#

1using System; 2using UnityEngine; 3 4public class UdpReceiver : MonoBehaviour 5{ 6 // バインドするUDPポート番号 7 private static readonly int PortNo = 2002; 8 9 // 受信回数 10 private int receiveNum = 0; 11 12 private System.Net.Sockets.UdpClient udpClient = null; 13 private System.Net.IPEndPoint endPoint = null; 14 15 // Start is called before the first frame update 16 void Start() 17 { 18 Debug.Log("UdpReceiver.Start(): at " + System.DateTime.Now.ToLongTimeString()); 19 20 endPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Any, PortNo); 21 udpClient = new System.Net.Sockets.UdpClient(endPoint); 22 23 UdpState state = new UdpState() 24 { 25 client = udpClient, 26 ep = endPoint, 27 }; 28 29 udpClient.BeginReceive(new AsyncCallback(ReceiveCallback), state); 30 } 31 32 // Update is called once per frame 33 void Update() 34 { 35 36 } 37 38 void OnApplicationQuit() 39 { 40 Debug.Log("UdpReceiver.OnApplicationQuit(): at " + System.DateTime.Now.ToLongTimeString()); 41 if (udpClient != null) 42 { 43 udpClient.Close(); 44 } 45 } 46 47 public void ReceiveCallback(IAsyncResult ar) 48 { 49 ++receiveNum; 50 51 UdpState state = (UdpState)ar.AsyncState; 52 System.Net.Sockets.UdpClient client = state.client; 53 System.Net.IPEndPoint ep = state.ep; 54 55 byte[] receiveBytes = client.EndReceive(ar, ref ep); 56 string receiveString = System.Text.Encoding.UTF8.GetString(receiveBytes); 57 58 string message = string.Format("num={0}, len={1}, message=[{2}]", 59 receiveNum, receiveBytes.Length, receiveString); 60 System.Diagnostics.Debug.WriteLine(message); 61 Debug.Log(message); 62 63 // 再度、受信開始 64 udpClient.BeginReceive(new AsyncCallback(ReceiveCallback), state); 65 } 66 67 public struct UdpState 68 { 69 public System.Net.Sockets.UdpClient client; 70 public System.Net.IPEndPoint ep; 71 } 72} 73

私自身がUDP通信やプログラムを触り始めということもあります

C言語での直接的なソケットプログラミングと比べて、C#や.NET、その他Unityならではの使い方を意識しなければならない部分はどうしても出てきます。それらの組み合わせで気を付けないといけませんが、それぞれ単独で見ると決して難しいプログラミングではありません。(UDPの)ソケットプログラミング、C#、.NET、Unity、それぞれを理解してから組み合わせていくと良いと思います。と言いますかプログラミングもソケット通信も初心であれば、最初から全て一緒にやると効率も悪く、理解もプログラムの完成もままならないと思います。

尚、UDPの送受信に関しては、Linux(UN*X)であればncコマンドと言うものが便利に使えます。上記のUnityプログラムを実行させるとUDPポート番号2002番で受信待ちしている訳ですが、ncコマンドでデータを送信できるので、これをテスト用に使うこともできます。自作の送信プログラムを使うのも良いですが、適時、使い分けると良いです。

イメージ説明

投稿2020/09/03 07:43

編集2020/09/04 00:52
dodox86

総合スコア9256

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

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

Izayoi-san

2020/09/04 05:03

サンプルコードやURLを添えて返答いただきありがとうございます。 現在、添付していただいたURLなどを参考に勉強させていただいております。 まだ受信側や、検討しているシステムが完成したわけではありませんが、先にお礼だけ言わせていただきたく思い、コメントさせていただきました。 進捗があり次第、再度コメントする予定です。
Izayoi-san

2020/09/08 00:52

記載していただいたURL先のサイトとプログラムを参考に、通信のテストに成功しました。 次は.cppをもとに作成予定のexeファイルで顔認識を実施し、その結果をUNITYに通信について検討する段階に移れました。
dodox86

2020/09/08 01:17

進展があって良かったです。プログラムの完成に向けて、頑張ってください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問