行いたい事
温度センサーを用いて温度を測定しており、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(); } }
閾値ってのは、その値を境にそれより大きい/小さいを判断する値のことだと理解していますが、
ピーク値を閾値にすると、それより小さな値しか存在しないことになります。
あなたが知りたいのは、本当に「閾値」なのでしょうか?
ピーク値の取り方を教えて頂くことで、あとで、ピーク値*0.8(この辺りの値は例です)などを閾値にしてピークに向かう途中で閾値を超えるようにしたいなと考えておりました。説明不足ですいません。
「あとで」というのはピークを超えてから過去のデータを見直して、という意味でしょうか?
「ピークに向かう途中で」というのは直近の(過去の)ピークによって設定された閾値で最新のデータを処理したい、という話のようにも思えます。どうなんでしょう。
質問にある波形だと、5番目のピークは4番めのピークを大きく下回っています。4番めのピークを検出してから、5番目のピークに至るまでに何が起こることを期待していますか? また、画像では切れていますが、6番のピークが現れたらどういうことになるのでしょう。
ご返信ありがとうございます。私自身がどうしたいのかよくわからず質問していたため、自分で行いたいことを考え実装したうえで新たに分からないことがありますのでご教授頂けたら幸いです。質問内容に関しましては更新いたしました。
> 私自身がどうしたいのかよくわからず質問していた
それって、厳しく言えば「質問として成立していない」ということですよね。あなた自身がわかっていない「もやもや」を投げつけられた回答者は一体何を言えばいいのですか?
> 自分で行いたいことを考え実装したうえで
「考え」がちゃんと煮詰まらないうちにコードを書き始めていませんか。よくいう「設計がすっ飛ばされている」状態のような気がします。
> 質問内容に関しましては更新いたしました
「startを通過」「startのすぐ後」「もう1つstartを用意」 startとは具体的に「何」ですか。それはコードのどこにありますか。
少なくともstartという変数の内容は提示された範囲では操作されていません。
また、「閾値」とコメントのついている変数thresholdも何ら操作されていません(というか宣言以外登場しません)。その「コードの説明」は提示されているコードと本当に対応しているのですか?
コードの下記部分が張り付いていなかったたのと、閾値の変数名に誤りがあったため訂正しました。実際に動かした時に、 if ((temperature > threshold)&&(start == 2))この条件を満たしている時の動きをしてくれなかったためコードのおかしい点などの原因を知りたいです。
何か目的があって、それを実現するためにstart云々という方針をとったのかと思いますが、コードや質問文の説明からはそもそもの目的が全くわからないので、そもそもの目的を教えてください
ozwkさんご返事ありがとうございます。そもそも行いたいことは温度の変化によって操作するゲームを作りたいと思っております。startを設けたのは、ゲーム開始時は数秒間温度の値が安定するための時間が必要だったため、温度が安定した時ぐらいにstartを通り抜けてその時に入力した値を閾値としたいた考えました。また、環境によって初期の安定した時の値も変わるためあらかじめ閾値の値を決めると毎回手作業で閾値を調整しないといけないので、それを解決するために自動で閾値を決めたいと思いコードを書いてみました
> 閾値を超えた時の処理が行われなかった
それはどのような方法で確認出来るのですか?
実際に実行してみて動きを見た時に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;をずっと行うと入力された値が常に閾値となるためそれをふせぐためにやりました。
回答1件
あなたの回答
tips
プレビュー