/// <summary> /// 現在のAnimatorについているサーボの値を参照しながら全て送る /// </summary> void ApplyMecanimPoseAll() { var servos = _controller.Servos; List <PreMaidServo> orders = new List <PreMaidServo>(); foreach (var VARIABLE in _joints) { var mecanimServoValue = VARIABLE.CurrentServoValue(); var servo = servos.Find(x => x.ServoPositionEnum == VARIABLE.TargetServo); int premaidServoValue = servo.GetServoValue(); servo.SetServoValueSafeClamp((int)mecanimServoValue); PreMaidServo tmp = new PreMaidServo(VARIABLE.TargetServo); tmp.SetServoValueSafeClamp((int)mecanimServoValue); orders.Add(tmp); } //ここでordersに差分だけ送れます coolTime = 0.09f; //25個あると0.08くらい、1個だと0.01くらいのクールタイムが良い keyFrameTimer = 1f; //Debug.Log("全フレーム転送 :" + orders.Count+" FPS:"+currentFPS); _controller.ApplyPoseFromServos(orders, 40); currentFPS = 0; if (_initialized == false) { _initialized = true; } }
/// <summary> /// 現在のAnimatorについているサーボの値を参照しながら差分だけ送る /// </summary> void ApplyMecanimPoseWithDiff() { var servos = _controller.Servos; List <PreMaidServo> orders = new List <PreMaidServo>(); foreach (var VARIABLE in _joints) { var mecanimServoValue = VARIABLE.currentServoValue; ServoPosition targetServoID = (ServoPosition)VARIABLE.servoNo; var servo = servos.Find(x => x.ServoPositionEnum == targetServoID); int premaidServoValue = servo.GetServoValue(); // mecanimServoValueがゼロなのは異常 if (mecanimServoValue <= 0) { Debug.Log(string.Format("Servo:{0} Val:{1}", servo.GetServoName(), mecanimServoValue - premaidServoValue)); continue; } //閾値よりサーボの値が変わってたら命令とする //50とかでもいいかも if (Mathf.Abs(mecanimServoValue - premaidServoValue) > 10) { servo.SetServoValueSafeClamp((int)mecanimServoValue); PreMaidServo tmp = new PreMaidServo(targetServoID); tmp.SetServoValueSafeClamp((int)mecanimServoValue); orders.Add(tmp); } } //ここでordersに差分だけ送れます coolTime = orders.Count * 0.005f; //25個あると0.08くらい、1個だと0.01くらいのクールタイムが良い if (orders.Count > 0) { currentFPS++; //Debug.Log("Servo Num:" + orders.Count); _controller.ApplyPoseFromServos(orders, Mathf.Clamp(orders.Count * 2, 10, 40)); } if (_initialized == false) { _initialized = true; } }
/// <summary> /// 現在のAnimatorについているサーボの値を参照しながら全て送る /// </summary> void ApplyMecanimPoseAll() { var servos = _controller.Servos; List <PreMaidServo> orders = new List <PreMaidServo>(); foreach (var VARIABLE in _joints) { var mecanimServoValue = VARIABLE.currentServoValue; ServoPosition targetServoID = (ServoPosition)VARIABLE.servoNo; var servo = servos.Find(x => x.ServoPositionEnum == targetServoID); int premaidServoValue = servo.GetServoValue(); // mecanimServoValueがゼロなのは異常 if (mecanimServoValue <= 0) { Debug.Log(string.Format("Servo:{0} Val:{1}", servo.GetServoName(), mecanimServoValue - premaidServoValue)); continue; } servo.SetServoValueSafeClamp((int)mecanimServoValue); PreMaidServo tmp = new PreMaidServo(targetServoID); tmp.SetServoValueSafeClamp((int)mecanimServoValue); orders.Add(tmp); } //ここでordersに差分だけ送れます。speed=40でcooltime=0.05fでいけた!?!? //つまり20FPSだとたまに送信失敗するけど意外と通る。 //BT環境が悪かったらもっと速度を落とすとか? //cooltime=0.08f だと12FPS送信になって結構失敗しないです coolTime = 0.05f; keyFrameTimer = 1f; //Debug.Log("全フレーム転送 :" + orders.Count+" FPS:"+currentFPS); _controller.ApplyPoseFromServos(orders, 40); currentFPS = 0; if (_initialized == false) { _initialized = true; } }