前提・実現したいこと
darknetというオープンソースの中のcのプログラムで計算した値2つを通信でc#のプログラムに送って
unityで扱えるようにしたいです。できるだけリアルタイムでの処理で実現させたいです。
この質問を参考にさせてもらいました。
発生している問題・エラーメッセージ
エラーは特に出ていませんがちゃんと動いてくれません。
そもそも通信がうまくいってない気がします うまくいきました。
コマンドプロンプトでdarknetを実行しても
(以上省略)
99 conv 128 1 x 1 / 1 52 x 52 x 384 -> 52 x 52 x 128 0.266 BF
100 conv 256 3 x 3 / 1 52 x 52 x 128 -> 52 x 52 x 256 1.595 BF
101 conv 128 1 x 1 / 1 52 x 52 x 256 -> 52 x 52 x 128 0.177 BF
102 conv 256 3 x 3 / 1 52 x 52 x 128 -> 52 x 52 x 256 1.595 BF
103 conv 128 1 x 1 / 1 52 x 52 x 256 -> 52 x 52 x 128 0.177 BF
104 conv 256 3 x 3 / 1 52 x 52 x 128 -> 52 x 52 x 256 1.595 BF
105 conv 255 1 x 1 / 1 52 x 52 x 256 -> 52 x 52 x 255 0.353 BF
106 yolo
Total BFLOPS 65.864
Loading weights from yolov3.weights...
seen 64
Done!
Webcam index: 0
Video stream: 640 x 480 ←
矢印のところで止まってしまいます。新たに実装した関数をコメントアウトすると正常に動きます。
該当のソースコード
c
1//送信 2// darknet/src/image.cに以下の関数を追加 3 4char addr[16] = "127.0.0.1"; 5int port = 20001; 6#define INTERVAL_TIME 1 7 8void get_point(double u, double v, char* address, int port) { 9 double data[] = {u,v}; 10 WSADATA dat; 11 WSAStartup(MAKEWORD(2, 0), &dat); 12 int udp = socket(AF_INET, SOCK_DGRAM, 0); 13 struct sockaddr_in addr; 14 15 memset(&addr, 0, sizeof(addr)); 16 addr.sin_family = AF_INET; 17 addr.sin_port = htons(port); 18 19 inet_pton(AF_INET, address, &addr.sin_addr.S_un.S_addr); 20 21 while (1) 22 { 23 sendto(udp, (char*)data, sizeof data, 0, (struct sockaddr *)&addr, sizeof(addr)); 24 Sleep(INTERVAL_TIME); 25 } 26 27 closesocket(udp); 28 29 WSACleanup(); 30}
c#
1//受信 2//unityのスクリプト 3using System.Collections; 4using System.Collections.Generic; 5using UnityEngine; 6using System; 7using System.Net.Sockets; 8using System.Threading; 9using System.Net; 10 11public class PointReceive : MonoBehaviour 12{ 13 public GameObject player; 14 private const int DATA_LENGTH = 2; 15 private const int DOUBLE_LENGTH = 8; 16 private UdpClient udp; 17 private Thread thread; 18 private byte[] data; 19 private double[] result = new double[DATA_LENGTH]; 20 21 void Start() 22 { 23 udp = new UdpClient(20001); 24 thread = new Thread(new ThreadStart(threadWork)); 25 thread.Start(); 26 } 27 28 void Update() 29 { 30 if (data != null) 31 { 32 Debug.LogFormat("{0}, {1}", result[0], result[1]); 33 //訂正箇所(追加) 34 Vector3 pos = player.transform.position; 35 player.transform.position = new Vector3((float)result[0], pos.y, (float)result[1]); 36 } 37 } 38 39 void OnApplicationQuit() 40 { 41 udp.Close(); 42 thread.Abort(); 43 } 44 45 void threadWork() 46 { 47 while (true) 48 { 49 IPEndPoint remoteEP = null; 50 data = udp.Receive(ref remoteEP); 51 52 for (int i = 0; i < DATA_LENGTH; i++) 53 { 54 result[i] = BitConverter.ToDouble(data, i * DOUBLE_LENGTH); 55 //訂正箇所(消去) 56 //Vector3 pos = player.transform.position; 57 //player.transform.position = new Vector3((float)result[0], (float)result[1], pos.z); 58 } 59 } 60 } 61} 62
補足情報(FW/ツールのバージョンなど)
visual studio 2017
unity5.6.6
OpenCV3.4.0
cuda v9.1
###追記
t_obaraさんとedo_m18さんがご指摘してくださったところを訂正したところ
オブジェクトの位置が変わったので通信には成功しました。
しかし依然としてdarknetのほうのアプリケーションは起動しないままです。
自己解決しました。ありがとうございました。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。