🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

1回答

1251閲覧

Arduinoにおいて検出したデータの特定の箇所をunityにおいて閾値とする

mitatoshi

総合スコア12

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2020/01/02 04:38

編集2020/01/03 03:54

行いたい事

温度センサーを用いて温度を測定しており、Arduinoとunityをシリアル通信させています。そこで、Arduinoで処理したデータを閾値とする時どのようにすればいいか分からないです。

現在行えている事

unity側にて閾値の値を事前に決めておき閾値超えた時と超えてない時の処理についてはできています。Arduino側にて温度センサーで取得したデータの平滑化も行っています。

お聞きしたい事

unity側にてArduinoから得たデータを閾値として用いる方法を教えて頂きたいです。

コードの説明

閾値を0としておきstartを通過したときのArduinoからの出力を閾値としたいです。startのすぐ後にもう1つstartを用意して(ユーザの視点からはみえないようにする)startを通った時の値を閾値としたいです。実際に実行してみたところ、start1とstart2を入力の値が400ぐらいで通り抜けたので値を470ぐらいまであげたのにも関わらず閾値を超えた時の処理が行われなかったので悩んでおります。

###unity側でのコード

コード public class SerialCube : MonoBehaviour { public SerialHandler serialHandler; public float threshold = 0f; //閾値 public Vector3 velocity = new Vector3(0f, 0f, 1.0f); public Text sensorText; public Text startText; private bool levelDown = false; private int start; public static float starT { get; internal set; } void Start() { serialHandler.OnDataReceived += OnDataReceived; start = 0; setcountText(); } void OnDataReceived(string message) { var data = message.Split( new string[] { "\t" }, System.StringSplitOptions.None); if (data.Length < 2) return; sensorText.text = "ondo:" + message; try { var temperature = float.Parse(data[0]); if(start == 1)         //入力した値を閾値としたい { temperature = threshold; peak += 20; } if ((temperature > threshold)&&(start == 2))  //閾値を超えた時の処理 { transform.localPosition += (levelDown) ? new Vector3(0.0f, 10.0f, 0.0f) * Time.deltaTime : velocity * Time.deltaTime; levelDown = false; } else { transform.localPosition += velocity * Time.deltaTime; levelDown = true; } } catch (System.Exception e) { Debug.LogWarning(e.Message); } } private void OnTriggerEnter(Collider other) { if (other.gameObject.CompareTag("start")) { start += 1; setcountText(); } } void setcountText() { startText.text = "start : " + start.ToString(); } }

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

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

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

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

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

thkana

2020/01/02 05:18

閾値ってのは、その値を境にそれより大きい/小さいを判断する値のことだと理解していますが、 ピーク値を閾値にすると、それより小さな値しか存在しないことになります。 あなたが知りたいのは、本当に「閾値」なのでしょうか?
mitatoshi

2020/01/02 05:23

ピーク値の取り方を教えて頂くことで、あとで、ピーク値*0.8(この辺りの値は例です)などを閾値にしてピークに向かう途中で閾値を超えるようにしたいなと考えておりました。説明不足ですいません。
thkana

2020/01/02 06:21

「あとで」というのはピークを超えてから過去のデータを見直して、という意味でしょうか? 「ピークに向かう途中で」というのは直近の(過去の)ピークによって設定された閾値で最新のデータを処理したい、という話のようにも思えます。どうなんでしょう。 質問にある波形だと、5番目のピークは4番めのピークを大きく下回っています。4番めのピークを検出してから、5番目のピークに至るまでに何が起こることを期待していますか? また、画像では切れていますが、6番のピークが現れたらどういうことになるのでしょう。
mitatoshi

2020/01/02 14:47

ご返信ありがとうございます。私自身がどうしたいのかよくわからず質問していたため、自分で行いたいことを考え実装したうえで新たに分からないことがありますのでご教授頂けたら幸いです。質問内容に関しましては更新いたしました。
thkana

2020/01/03 01:50 編集

> 私自身がどうしたいのかよくわからず質問していた それって、厳しく言えば「質問として成立していない」ということですよね。あなた自身がわかっていない「もやもや」を投げつけられた回答者は一体何を言えばいいのですか? > 自分で行いたいことを考え実装したうえで 「考え」がちゃんと煮詰まらないうちにコードを書き始めていませんか。よくいう「設計がすっ飛ばされている」状態のような気がします。 > 質問内容に関しましては更新いたしました 「startを通過」「startのすぐ後」「もう1つstartを用意」 startとは具体的に「何」ですか。それはコードのどこにありますか。 少なくともstartという変数の内容は提示された範囲では操作されていません。 また、「閾値」とコメントのついている変数thresholdも何ら操作されていません(というか宣言以外登場しません)。その「コードの説明」は提示されているコードと本当に対応しているのですか?
mitatoshi

2020/01/03 03:59

コードの下記部分が張り付いていなかったたのと、閾値の変数名に誤りがあったため訂正しました。実際に動かした時に、 if ((temperature > threshold)&&(start == 2))この条件を満たしている時の動きをしてくれなかったためコードのおかしい点などの原因を知りたいです。
ozwk

2020/01/03 05:07 編集

何か目的があって、それを実現するためにstart云々という方針をとったのかと思いますが、コードや質問文の説明からはそもそもの目的が全くわからないので、そもそもの目的を教えてください
mitatoshi

2020/01/03 05:40 編集

ozwkさんご返事ありがとうございます。そもそも行いたいことは温度の変化によって操作するゲームを作りたいと思っております。startを設けたのは、ゲーム開始時は数秒間温度の値が安定するための時間が必要だったため、温度が安定した時ぐらいにstartを通り抜けてその時に入力した値を閾値としたいた考えました。また、環境によって初期の安定した時の値も変わるためあらかじめ閾値の値を決めると毎回手作業で閾値を調整しないといけないので、それを解決するために自動で閾値を決めたいと思いコードを書いてみました
thkana

2020/01/03 13:06

> 閾値を超えた時の処理が行われなかった それはどのような方法で確認出来るのですか?
mitatoshi

2020/01/03 16:01

実際に実行してみて動きを見た時にstart1を通過した時の値(ここでは閾値としたもの)を+100-100ぐらいさせたのにも関わらず、 transform.localPosition += (levelDown) ? new Vector3(0.0f, 10.0f, 0.0f) * Time.deltaTime : velocity * Time.deltaTime; この動きをしなかったため処理が行われなかったと判断いたしました。私が考えた原因はstart==1の時に閾値は設定できているが、start==2になった時にうまく処理ができていないためだと考えております、、、 私としては、start==1となった時に入力した値を閾値としてその後の処理をおこないたいです。startを設けたのは、 temperature = threshold;をずっと行うと入力された値が常に閾値となるためそれをふせぐためにやりました。
guest

回答1

0

自己解決

変更点

閾値としていたthresholdはpeakとなっております。また、もともとのコードより追加された点が多数ありますので、一回だけ入力されたデータを処理して終えたい場合はprivate bool locked = false;などを参照してください

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class SerialCube : MonoBehaviour { public SerialHandler serialHandler; public float peak = 0f; public Vector3 velocity = new Vector3(0f, 0f,2.0f); public Text sensorText; public Text scoreText; public Text startText; public Text finishText; private bool levelDown = false; private int score; private int start; public static float Score { get; internal set; } public static float starT { get; internal set; } private bool locked = false; // private bool levelUp = false; void Start() { serialHandler.OnDataReceived += OnDataReceived; score = 0; SetCountText(); start = 0; setcountText(); } private void Update() { if (Goal.goal == true) { finishText.text = "Goal"; } } void OnDataReceived(string message) { var data = message.Split( new string[] { "\t" }, System.StringSplitOptions.None); if (data.Length < 2) return; sensorText.text = "ondo:" + message; try { var temperature = float.Parse(data[0]); if (start == 1 && !locked) { locked = true; // 二度とif文に入らないようにする peak = temperature; // 閾値を現在の温度にする peak += 30; } if (temperature > peak) { transform.localPosition += (levelDown) ? new Vector3(0.0f, 240.0f, 2.0f) * Time.deltaTime : velocity * Time.deltaTime; levelDown = false; } else { transform.localPosition += velocity * Time.deltaTime; levelDown = true; } } catch (System.Exception e) { Debug.LogWarning(e.Message); } } private void OnTriggerEnter(Collider other) { if (other.gameObject.CompareTag("Area")) { score += 1; SetCountText(); } if (other.gameObject.CompareTag("start")) { start += 1; setcountText(); } } void SetCountText() { scoreText.text = "Score : " + score.ToString(); } void setcountText() { startText.text = "start : " + start.ToString(); } }

投稿2020/01/05 14:22

編集2020/01/06 16:07
mitatoshi

総合スコア12

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問