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

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

ただいまの
回答率

89.21%

Unity,MATLAB Simulink間でのシリアル通信について

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,986

kousei

score 14

前提・実現したいこと
Unityのオブジェクトの座標データなどを,シリアル通信を用いてSimulinkに送りたいと考えています.(最初は,落下するcubeのZ座標をSimulinkでモニタリングすることを考えています)
しかし,Unityで,もしくはSimukinkでのシリアル通信をそれぞれ調べてもよくわかりませんでした.(Simulinkでの受信は,Instrument Control ToolboxのSerial Receiveというブロックを使えばいいという事だけわかっています.)

どの様なスクリプトを書けばUnityから数値を取り出せるのでしょうか.
また,参考になりそうなWebページなどがあれば紹介していただきたいです.

一応,いろいろなサイトを参考に一応作ってみた,COMポートからの送受信をおこなえる?はずのソースコードを添付します.

どんな些細なことでも構いません,ご指導よろしくお願いします.

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

エラーメッセージ

該当のソースコード

using UnityEngine;                             //unityのデフォルトの機能を使うためのクラス
using System.Collections;                      //C#のデフォルト機能を使うためのクラス
using System.IO.Ports;                         //シリアル通信を使用するためのクラス
using System.Threading;                        //スレッド機能を利用可能にするためのクラス


public class SerialHandler : MonoBehaviour {

    public delegate void SerialDataReceivedEventHandler(string message);            //???
    public event SerialDataReceivedEventHandler OnDataReceived;                     //???


    public string portName = "COM2";
    public int baudRate = 9600;                          //要変更

    private SerialPort serialPort_;                      //serial portクラスのインスタンス生成
    private Thread thread_;                              //スレッドクラスのインスタンス生成
    private bool isRunning_ = false;                     //シリアルポートが開いているかどうか

    private string message_;
    private bool isNewMessageReceived_ = false;            //シリアルポートから値が送られてきているかどうか





    // Use this for initialization
    void Start () {
        Debug.LogWarning("Start");
        Open();
    }





    // Update is called once per frame
    void Update () {
        Debug.LogWarning("Serial-Update");
        if (isNewMessageReceived_)
        {
            OnDataReceived(message_);
        }
    }





    void OnDestroy(){
        Debug.LogWarning("OnDestroy");
        Close();
    }





    private void Open(){                               //シリアルポートを開いて、新しいスレッドを開く

        serialPort_ = new SerialPort(portName, baudRate, Parity.None, 8, StopBits.One);     //シリアルポートインスタンス生成
        serialPort_.Open();                             //シリアルポートを開く

        isRunning_ = true;                         //開いた証としてtrueに変更

        thread_ = new Thread(Read);              //新しいスレッドを作成してread関数を実行させる
        thread_.Start();                          //thread開始
    }





    private void Read(){
        Debug.LogWarning("Read1");
        while (isRunning_ && serialPort_ != null && serialPort_.IsOpen)        //シリアルポートが開いているかつシリアルポートインスタンスが存在する
        {
            Debug.LogWarning("Read2");
            try
            {
                message_ = serialPort_.ReadLine();
                isNewMessageReceived_ = true;                     //メッセージを受け取った証として変更
                Debug.LogWarning(message_);
            }
            catch (System.Exception e)
            {
                Debug.LogWarning(e.Message);
            }
        }
    }





    private void Close(){
        isRunning_ = false;                                      //シリアルポートを閉じた証としてfalseに変更

        if (thread_ != null && thread_.IsAlive)                   //threadが存在しているなら
        {
            thread_.Join();                                      //元のスレッドの統合
        }

        if (serialPort_ != null && serialPort_.IsOpen)             //シリアルポートにインスタンスが格納されていて、シリアルポートが開いていれば
        {
            serialPort_.Close();                                //シリアルポートを閉じる
            serialPort_.Dispose();                                //バッファの解放とか?
        }
    }


    public void Write(string message){
        try
        {
            serialPort_.Write(message);
        }
        catch (System.Exception e)
        {
            Debug.LogWarning(e.Message);
        }
    }








}

試したこと

Unity上でも現在のCubeのY座標がわかるように,以下のscriptを追加しました.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;


public class CubePosition : MonoBehaviour {


    // Use this for initialization
    void Start () {
    }

    // Update is called once per frame
    void Update () {

        Vector3 Cubeposi = GameObject.Find("Cube").transform.position;   //Cubeの座標取り出し

        float CubeY = Cubeposi.y;                                  //CubeのY座標を定義

        string strCubeY = CubeY.ToString();

        this.GetComponent<Text>().text = strCubeY;

    }
}

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

(使用しているもの)
Windows10,Unity 2017.2.0f3(64bit),C# script,Simulink(MATLAB R2015b)

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ozwk

    2017/12/13 15:23

    Unityで計算結果をファイルに書き出してMatlabで読むのではダメなんですか?

    キャンセル

  • kousei

    2017/12/15 20:39

    最終的には別のシミュレーションソフトAと連携して,Aで計算→Simulink経由でUnityへオブジェクトの座標情報を送る→Unityで表示→Unityでのオブジェクトの接地点情報を送り返す,という動作をリアルタイムで行いたいので,計算結果をファイルに書き出して後で読む,というのではだめなのです.すみません

    キャンセル

回答 2

0

まず、Unityを動かすPCとSimulinkを動かすPCは同じPCでしょうか?
別々のPCでしょうか?

もし、同じPCでの通信であればシリアル通信をする必要はないのではないでしょうか?

同じPCの場合は「通信」ではなく「連携」というキーワードで調べてみてはどうでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

ベイブレードの回転をMATLABで計算して、Unityで動かす場合の例です。
(情報の流れが逆ですが、参考にはなるかと思います。)
https://qiita.com/io_alt/items/a1776eb1c8a44a76bbfa

英語ですが、MATLABとUnityの連携についての例題が書かれています。
https://jp.mathworks.com/matlabcentral/answers/196774-connection-between-matlab-and-unity3d

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる