- Home /
How to calibrate the mobile gyroscope ?
Hi,
I want to use my mobile phone to view 360 pictures. Here is my problem :
When I make complex movements the camera is disturbed...
When the scene starts, the camera does not initialize in the right direction...
I make tests with this script that I attach to the camera :
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class gyro01 : MonoBehaviour
{
void Start()
{
Input.gyro.enabled = true;
}
void Update()
{
this.transform.Rotate (-Input.gyro.rotationRateUnbiased.x, -Input.gyro.rotationRateUnbiased.y, 0);
}
}
The script "work pretty well" when I use my mobile facing a vertical plane in irl and on the x and y axis
Initialization vertical plane | only x and y axis
Problem number one : If I rotate on the x-axis when my mobile is not perfectly aligned with the y-axis (and conversely), then the camera position is disturbed...
Initialization vertical plane | x, y and z axis
Problem number two : In this case, when the scene starts the mobile is lying on a horizontal plane, and yet the camera is looking straight ahead. It should be looking down...
Initialization horizontal plane | x axis
Thank you for your help ! :)
Answer by Llama_w_2Ls · Aug 01, 2020 at 09:53 AM
Yh, I had many problems when beginning to implement gyroscope in my project. Heres my entire gyro script, which should solve your problems! (Script was attached to the main camera, that's it, no setup required)
public class Gyroscope : MonoBehaviour
{
private bool gyroEnabled;
private UnityEngine.Gyroscope gyro;
private GameObject GyroControl;
private Quaternion rot;
private void Start()
{
Screen.sleepTimeout = SleepTimeout.NeverSleep;
GyroControl = new GameObject("Gyro Control");
GyroControl.transform.position = transform.position;
transform.SetParent(GyroControl.transform); //parents the object to an empty control object
gyroEnabled = EnableGyro();
}
private bool EnableGyro()
{
if (SystemInfo.supportsGyroscope)
{
gyro = Input.gyro;
gyro.enabled = true;
GyroControl.transform.rotation = Quaternion.Euler(90f, -90f, 0f); //These offset values are essential for the gyroscope to orientate itself correctly
rot = new Quaternion(0, 0, 1, 0);
return true;
}
return false;
}
private void Update()
{
Quaternion rotMin = Quaternion.Euler(new Vector3(0, 0, 0));
Quaternion rotation = transform.rotation; //Values for locking the rotation of the gyro
if (gyroEnabled)
{
transform.localRotation = gyro.attitude * rot;
}
if (rotation.y < rotMin.y)
{
transform.eulerAngles = Vector3.zero; //Doesnt allow rotation values to be in the negative
}
}
}
That does exactly what I needed thank you. However it is very jittery. Is there a way to smooth this?
Unfortunately, when implementing clamping, which was necessary for the gyroscope to work with a player, the gyroscope became very jittery when looking at exactly 0 degrees on the y and looking directly up etc. If you remove the last if in the update() if (rotation.y < rot$$anonymous$$in.y) there should be no issues and the gyro should be smooth, i believe.