エンジニア

なんくるないさ

「このブログはアフィリエイト広告を利用しています」

pythonとunity間でのデータ受け渡し方法

結構需要ありそうなのと、ネットにあまり情報を見つけられなかったので、記事にしときます。

pythonでAI処理(機械学習、深層学習)によって判別したラベル情報をunity側におくって可視化する。
という流れは避けて通れない道というか,
unityで機械学習のデータを使いたいなら必須な気がします。

これには
UDP通信というものを使います。

送信側(python)はデータをずっと流し続ける。
受信側は(unity)はデータが来たら処理をする。
というプロトコルです。

さっそくプログラムを載せます。


送信側は

#python送信側

import socket
import random

    HOST = '127.0.0.1'
    PORT = 50007

    client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    while True:
  a = random.randrange(3)
  result = str(a)
  print(a)
  client.sendto(result.encode('utf-8'),(HOST,PORT))
  time.sleep(2.0)


この送信側は0,1,2かを2秒おきに一回送るプログラムです。
PORTはマンションのどこの部屋か指定するためのもの。
各アプリケーションを区別するために使用されるのが「UDPポート番号」

HOST 127.0.0.1は自分自身を指す特別なIPアドレスです。
自分自身の上で動作しているサービスへ接続する場合は、このIPアドレスを利用できる。

この上のプログラムでPORTにランダムに数字を送ることができます。


#C#(unity)受信側

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

public class UDP : MonoBehaviour {

 static UdpClient udp;
 IPEndPoint remoteEP = null;
 int i = 0;
 // Use this for initialization
 void Start () {
  int LOCA_LPORT = 50007;

  udp = new UdpClient(LOCA_LPORT);
  udp.Client.ReceiveTimeout = 2000;
 }

// Update is called once per frame
 void Update ()
 {
 IPEndPoint remoteEP = null;
 byte[] data = udp.Receive(ref remoteEP);
 string text = Encoding.UTF8.GetString(data);
 Debug.Log(text);
 }
}

pythonで送らてくるデータは0,1,2を'utf-8'(byte型)にしたもの(エンコードしたもの)
それをC#側ではとりあえずバイト型のdataという配列でうけとります。
その後string型にして、unityで見ることができます。

あとはこれをカスタマイズして自分の好みに合うように作りましょう。

python機械学習するのに参考にした本↓

Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎

Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎


こういうサイトで一気に力をつけることがお勧めだと思います。



jump1268.hatenablog.com