Indoor-Navigation-ARCore
κ΅¬κΈ ARcore SDKλ₯Ό μ΄μ©νμ¬ μλλ‘μ΄λ λ΄λΉκ²μ΄μ μ΄ν리μΌμ΄μ μ ꡬννμλ€.(Unity3D Project)
Project Info β :
- Engineγγγγ : Unity - 2018.3.4f
- IDE γγγγγ : Eclipse - 2020-03
- Languageγγγ: C#, Java13, Python
- SDK, Libraryγ γ: ARcore v1.15.0, Tensorflow 1.15 for GPU
Features β :
- BLE Beaconμ μ΄μ©ν μ€λ΄ μμΉ μΈ‘μ μμ€ν
- ARcore Slam μκ³ λ¦¬μ¦μ μ΄μ©ν μλμ μμΉ μ λ°μ΄νΈ
- Server(PC)μμ Machine Learning modelμ outputμ λ¨λ§κΈ°λ‘ μ μ‘
- Unityμμ λΈλ£¨ν¬μ€ μ νΈλ₯Ό μμ νκΈ° μνμ¬ Native μλλ‘μ΄λ κΈ°λ₯μ μ¬μ©νκΈ°μνμ¬ JARνμΌλ‘ νλ¬κ·ΈμΈ μμ±
discussion β :
μ΄ν리μΌμ΄μ μ μ μνλ©΄μ μ 체μ μΈ UIλ Logicλ±μ ꡬμ±νλ κ²μ΄ ν₯λ―Έλ‘μ λ νλ‘μ νΈμλ€. μ»΄ν¨ν° κ·Έλν½μ€ κ³Όλͺ©μ μκ°νμ¬μ κ·Έλ°μ§ Unityμμ Script μμ±μ ν λ ν¬κ² μ΄λ €μμ μμλ€. OpenGL λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ κ²μ μ μμ ν κ²½νμ΄ μλλ° κ·Έ λλ νλμ½λ©μ νμ¬ μμ²λ μκ° ν¬μλ₯Ό νμλλ° Unity ν΄μμ μ§μνλ κΈ°λ₯ (μΉ΄λ©λΌ,μ€λΈμ νΈ μμ±) λ± λ§€μ° κ°νΈνκ² λμ΄ μλ€λ³΄λ μ΄ν΄νλλ° μ΄λ ΅μ§ μμλ€. λ€λ§ Unity μ체μ LifeCycleκ³Ό κ΅¬μ± λμμ λν μ΄ν΄κ° μλ‘λ€λ³΄λ κ°λ°μλ ΈνΈλ₯Ό μμ²λκ² μ°Έκ³ ν κ²½νμ΄λ€. μ΄ νλ‘μ νΈλ₯Ό μ§ννλ©΄μ μ΄λ €μμ κ²ͺμλ κ²μ Unityλ₯Ό μ¬μ©ν΄ κ²μμ λ§λ€λ€ 보면 Android μλ¦Ό(λ‘컬 νΈμ)μ μ¬μ©νκ±°λ Unity PluginμΌλ‘ μ§μνμ§ μλ SNS κΈ°λ₯μ μ¬μ©ν΄μΌ νλ κ²½μ° λ€μ΄ν°λΈλ‘ κΈ°λ₯μ ꡬνν΄μΌ νλ μν©μ΄ μ’ μ’ λ°μνκ² λ©λλ€. JAR νλ¬κ·ΈμΈ μ ν΅ν΄μ C#μμ Java λ©μλλ₯Ό νΈμΆνκ³ Javaμμ C# λ©μλλ₯Ό νΈμΆνλ λ°©λ²μ μ°Ύμ μ΄ λ°©λ²μ ν΄κ²°νμμ΅λλ€.
Contribute π :
λ³Έ μ°κ΅¬μμλ κΈ°μ‘΄μ Beaconμ μ΄μ©ν μ€λ΄ μμΉ μΈ‘μμ μ±λ₯μ κ°μ νκ³ μ¦κ°νμ€ μμ© μννΈμ¨μ΄λ₯Ό ꡬννμλ€. λ¨Έμ λ¬λμ μν€κΈ° μν΄μλ λ§μ μμ λ°μ΄ν°κ° νμνλ€. λ°λΌμ, μ€νν νκ²½μ κ°μΆκ³ μ½ 3λ§κ°μ λ°μ΄ν°λ₯Ό μμ§νμλ€. Beaconμ νΉμ±μ μ νΈκ° λΆμμ νκΈ° λλ¬Έμ, λ μ νν κ²°κ³Ό κ°μ μν΄μ κ°κ°μ μ νΈλ₯Ό λ°μ΄ν° μ²λ¦¬κ³Όμ μ ν΅νμ¬ μμ ν μν¨ ν μ€λ³΅ λ°μ΄ν°λ₯Ό μ κ±°ν νμ κ°μλ μ½ 1λ§κ° μ λλ‘ κ°μνμλ€. γλ μ νν μ€λ΄ μμΉλ₯Ό μΈ‘μ νκΈ° μν΄μλ λͺ κ°μ§ κ°μ μ μ΄ νμνλ€κ³ μκ°λλ€. λ¨Όμ , λ°μ΄ν°μ μμ λ§μμλ‘ μ νλκ° μμΉνλ€. λ°λΌμ λ°μ΄ν°λ₯Ό μ²λ¦¬νμμ λ, κ° μ’νλ§λ€ μ½ 500κ°μ©μ λ°μ΄ν°κ° μλλ‘ λ°μ΄ν°λ₯Ό μμ§νμ΄μΌ νλ€. κ·Έλ λ€λ©΄ μ§κΈμ λ°μ΄ν°μ λΉν΄ μ½ 5λ°°μ λ°μ΄ν°λ₯Ό νμ΅μν¬ μ μμΌλ―λ‘ λ μ νν κ²°κ³Ό κ°μ΄ λμ¬ κ²μ΄λ€. λν λ μ ν©ν κΈ°κ³ νμ΅ κ΅¬μ‘°μ νν°λ₯Ό μ¬μ©νλ€λ©΄ μ€μνμ μ μ©νλ κ²μλ ν° λ¬Έμ κ° μμ κ²μΌλ‘ 보μ΄λ©°, μ΄λ¬ν λΆλΆλ€μ κ°μ νλ€λ©΄ λΉμ©μ΄ μ λ ΄νκ³ μ€μΉκ° μ©μ΄ν Beaconμ μ΄μ©νμ¬, λ€μν μ€λ΄ μμΉ μλΉμ€λ₯Ό AR νμμΌλ‘ μ 곡νκΈ° λλ¬Έμ μ¬μ©μλ€μ νΈμμ±μ κ·Ήλνν μ μμ κ²μ΄λ€.
RSSI κ°μ μ΄μ©ν μμΉ μ΄κΈ°ν code μΌλΆλΆ
if (rf.isOnClick == true) // Refresh λ²νΌ onClick μ
{
Debug.Log("Button is Onclick");
rf.isOnClick = false;
sX = rf.scanX;
sY = rf.scanY;
// Native Androidμμ μΈ‘μ ν RSSI InputμΌλ‘ λμ¨ μ’ν Output
cameraTarget.transform.position = new Vector3(sX, 0.0f, sY);
myCam.transform.position = new Vector3(sX,0.0f,sY);
Debug.Log("Hwang : After Send" + sX.ToString() + " " + sY.ToString());
}
ARcore SDKλ₯Ό μ΄μ©ν SLAM μμ© (μλμ μμΉ μΆμ )
if (Session.Status != SessionStatus.Tracking)
{
trackingStarted = false;
camPoseText2.gameObject.SetActive(true);
const int LOST_TRACKING_SLEEP_TIMEOUT = 15;
Screen.sleepTimeout = LOST_TRACKING_SLEEP_TIMEOUT;
return;
}
else
{
camPoseText.text = "" + cameraTarget.transform.position;
camPoseText2.gameObject.SetActive(false);
}
Screen.sleepTimeout = SleepTimeout.NeverSleep;
Vector3 currentARPosition = Frame.Pose.position;
if (!trackingStarted)
{
trackingStarted = true;
m_prevARPosePosition = Frame.Pose.position;
}
Vector3 deltaPosition = currentARPosition - m_prevARPosePosition; // μλ μμΉ
m_prevARPosePosition = currentARPosition;
if (cameraTarget != null)
{
cameraTarget.transform.Translate(deltaPosition.x, 0.0f, deltaPosition.z,Space.World);
//myCam.GetComponent<FollowTarget>().targetRot = Frame.Pose.rotation;
//cameraTarget.GetComponent<FollowTarget>().targetRot = Frame.Pose.rotation;
}
γγ
γγ
