├── .gitignore ├── COPYING.md ├── README.md ├── User_Guide-Best_Practices_for_Navigation.md ├── app ├── .gitignore ├── build.gradle └── src │ └── main │ ├── AndroidManifest.xml │ ├── assets │ └── robot │ │ └── robotsdk.xml │ ├── ic_launcher-web.png │ ├── java │ └── com │ │ └── softbankrobotics │ │ └── maplocalizeandmove │ │ ├── Fragments │ │ ├── GoToFrameFragment.java │ │ ├── LoadingFragment.java │ │ ├── LocalizeAndMapFragment.java │ │ ├── LocalizeRobotFragment.java │ │ ├── MainFragment.java │ │ ├── ProductionFragment.java │ │ ├── SaveLocationsFragment.java │ │ ├── SetupFragment.java │ │ └── SplashFragment.java │ │ ├── MainActivity.java │ │ └── Utils │ │ ├── GoToHelper.java │ │ ├── LocalizeAndMapHelper.java │ │ ├── NavUtils.java │ │ ├── PointsOfInterestView.kt │ │ ├── Popup.java │ │ ├── RobotHelper.java │ │ ├── SaveFileHelper.java │ │ └── Vector2theta.java │ └── res │ ├── anim │ ├── enter_fade_in_left.xml │ ├── enter_fade_in_right.xml │ ├── exit_fade_out_left.xml │ ├── exit_fade_out_right.xml │ └── pulse.xml │ ├── drawable-v24 │ └── ic_launcher_foreground.xml │ ├── drawable │ ├── charging_sation.png │ ├── dropdown_icon.png │ ├── ic_360map_bg.xml │ ├── ic_btn_add_full.xml │ ├── ic_btn_back.xml │ ├── ic_btn_close.xml │ ├── ic_btn_del.xml │ ├── ic_btn_del_round.xml │ ├── ic_btn_goto.xml │ ├── ic_btn_ok.xml │ ├── ic_btn_save_down.xml │ ├── ic_btn_save_up.xml │ ├── ic_del_btn.xml │ ├── ic_dot_followone.xml │ ├── ic_dot_followthree.xml │ ├── ic_dot_followtwo.xml │ ├── ic_dot_full.xml │ ├── ic_dot_outline.xml │ ├── ic_icn_goto_frame.xml │ ├── ic_icn_goto_frame_error.xml │ ├── ic_icn_goto_frame_error_update.xml │ ├── ic_icn_goto_frame_notavailable.xml │ ├── ic_icn_goto_frame_ok.xml │ ├── ic_icn_goto_frame_ok_update.xml │ ├── ic_icn_localize_and_map.xml │ ├── ic_icn_localize_done.xml │ ├── ic_icn_localize_error.xml │ ├── ic_icn_localize_robot_burgermenu.xml │ ├── ic_icn_localize_robot_burgermenu_notavailable.xml │ ├── ic_icn_localize_robot_burgermenu_oklocation.xml │ ├── ic_icn_map_positions.xml │ ├── ic_icn_mapping.xml │ ├── ic_icn_nolocation.xml │ ├── ic_icn_productionmode.xml │ ├── ic_icn_save_frames.xml │ ├── ic_icn_save_frames_ok.xml │ ├── ic_icn_setupmode.xml │ ├── ic_icn_warning.xml │ ├── ic_ils_pushpepper.xml │ ├── ic_ils_trap_ac_pepper.xml │ ├── ic_ils_trap_close_ac_pepper.xml │ ├── ic_launcher_background.xml │ ├── ic_location.xml │ ├── ic_separation_list.xml │ ├── ic_separation_menu.xml │ ├── spinner.xml │ ├── spinner_boarder.xml │ └── ui_pepper.png │ ├── font │ ├── verdana.ttf │ ├── verdanab.ttf │ ├── verdanai.ttf │ └── verdanaz.ttf │ ├── layout │ ├── activity_main.xml │ ├── fragment_goto_frame.xml │ ├── fragment_loading.xml │ ├── fragment_localize_and_map.xml │ ├── fragment_localize_robot.xml │ ├── fragment_main.xml │ ├── fragment_production.xml │ ├── fragment_save_locations.xml │ ├── fragment_setup.xml │ ├── fragment_splash.xml │ ├── item_location_list.xml │ ├── item_location_list_goto.xml │ ├── popup_backup_locations_confirmation.xml │ ├── popup_existing_or_new_map.xml │ ├── popup_goto.xml │ ├── popup_localized.xml │ ├── popup_map_saved.xml │ ├── popup_no_locations_to_load.xml │ ├── popup_no_map_to_load.xml │ └── popup_tutorial_save_attached_frame.xml │ ├── mipmap-anydpi-v26 │ ├── ic_launcher.xml │ ├── ic_launcher_round.xml │ └── ic_logo_framework_round.xml │ ├── mipmap-hdpi │ ├── ic_launcher.png │ ├── ic_launcher_round.png │ ├── ic_logo_framework_round.png │ └── ic_logo_placeholder_foreground.png │ ├── mipmap-mdpi │ ├── ic_launcher.png │ ├── ic_launcher_round.png │ ├── ic_logo_framework_round.png │ └── ic_logo_placeholder_foreground.png │ ├── mipmap-xhdpi │ ├── ic_launcher.png │ ├── ic_launcher_round.png │ ├── ic_logo_framework_round.png │ └── ic_logo_placeholder_foreground.png │ ├── mipmap-xxhdpi │ ├── ic_launcher.png │ ├── ic_launcher_round.png │ ├── ic_logo_framework_round.png │ └── ic_logo_placeholder_foreground.png │ ├── mipmap-xxxhdpi │ ├── ic_launcher.png │ ├── ic_launcher_round.png │ ├── ic_logo_framework_round.png │ └── ic_logo_placeholder_foreground.png │ ├── raw │ ├── full_turn_with_stop.pmt │ ├── goto_loader.json │ ├── idle.qianim │ └── loader.json │ └── values │ ├── colors.xml │ ├── ic_launcher_background.xml │ ├── ic_logo_placeholder_background.xml │ ├── strings.xml │ └── styles.xml ├── autonomousrecharge ├── build.gradle └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── com │ └── aldebaran │ └── qi │ └── sdk │ └── autonomousrecharge │ ├── AutonomousRecharge.kt │ ├── AutonomousRechargeListeners.kt │ └── RechargeRequestReceiver.kt ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── screen_shots ├── Anchor_points_Showroom.png ├── Path1.png ├── Path2.png ├── Path3.png ├── PathWithChargingStation.png ├── exploMap.png ├── screen1.png ├── screen3.png └── screen5.png └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle/* 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | .externalNativeBuild 10 | ### JetBrains template 11 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm 12 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 13 | 14 | # User-specific stuff: 15 | .idea 16 | 17 | # Sensitive or high-churn files: 18 | .idea/dataSources/ 19 | .idea/dataSources.ids 20 | .idea/dataSources.xml 21 | .idea/dataSources.local.xml 22 | .idea/sqlDataSources.xml 23 | .idea/dynamic.xml 24 | .idea/uiDesigner.xml 25 | 26 | # Gradle: 27 | .idea/gradle.xml 28 | .idea/libraries 29 | 30 | # Mongo Explorer plugin: 31 | .idea/mongoSettings.xml 32 | 33 | ## File-based project format: 34 | *.iws 35 | 36 | ## Plugin-specific files: 37 | 38 | # IntelliJ 39 | /out/ 40 | 41 | # mpeltonen/sbt-idea plugin 42 | .idea_modules/ 43 | 44 | # JIRA plugin 45 | atlassian-ide-plugin.xml 46 | 47 | # Crashlytics plugin (for Android Studio and IntelliJ) 48 | com_crashlytics_export_strings.xml 49 | crashlytics.properties 50 | crashlytics-build.properties 51 | fabric.properties 52 | ### Java template 53 | *.class 54 | 55 | # BlueJ files 56 | *.ctxt 57 | 58 | # Mobile Tools for Java (J2ME) 59 | .mtj.tmp/ 60 | 61 | # Package Files # 62 | *.jar 63 | *.war 64 | *.ear 65 | 66 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 67 | hs_err_pid* 68 | ### Android template 69 | # Built application files 70 | *.apk 71 | *.ap_ 72 | 73 | # Files for the ART/Dalvik VM 74 | *.dex 75 | 76 | # Java class files 77 | *.class 78 | 79 | # Generated files 80 | bin/ 81 | gen/ 82 | out/ 83 | 84 | # Gradle files 85 | .gradle/ 86 | build/ 87 | gradle.properties 88 | # Local configuration file (sdk path, etc) 89 | local.properties 90 | 91 | # Proguard folder generated by Eclipse 92 | proguard/ 93 | 94 | # Log Files 95 | *.log 96 | 97 | # Android Studio Navigation editor temp files 98 | .navigation/ 99 | 100 | # Android Studio captures folder 101 | captures/ 102 | 103 | # Intellij 104 | *.iml 105 | .idea/workspace.xml 106 | .idea/tasks.xml 107 | .idea/libraries 108 | 109 | # Keystore files 110 | *.jks 111 | 112 | # External native build folder generated in Android Studio 2.2 and later 113 | .externalNativeBuild 114 | ### Gradle template 115 | .gradle 116 | /build/ 117 | 118 | # Ignore Gradle GUI config 119 | gradle-app.setting 120 | 121 | # Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) 122 | !gradle-wrapper.jar 123 | 124 | # Cache of project 125 | .gradletasknamecache 126 | 127 | # # Work around https://youtrack.jetbrains.com/issue/IDEA-116898 128 | # gradle/wrapper/gradle-wrapper.properties 129 | 130 | # idea misc 131 | .idea/misc.xml 132 | -------------------------------------------------------------------------------- /COPYING.md: -------------------------------------------------------------------------------- 1 | Copyright (c) 2011-2020, SoftBank Robotics Europe 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are met: 6 | 7 | * Redistributions of source code must retain the above copyright 8 | notice, this list of conditions and the following disclaimer. 9 | * Redistributions in binary form must reproduce the above copyright 10 | notice, this list of conditions and the following disclaimer in the 11 | documentation and/or other materials provided with the distribution. 12 | * Neither the name of the SoftBank Robotics Europe nor the 13 | names of its contributors may be used to endorse or promote products 14 | derived from this software without specific prior written permission. 15 | 16 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 17 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 | DISCLAIMED. IN NO EVENT SHALL SoftBank Robotics Europe BE LIABLE FOR ANY 20 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 21 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 22 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 23 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 25 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | /debug 3 | /release -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'kotlin-android' 3 | 4 | android { 5 | compileSdkVersion 30 6 | defaultConfig { 7 | applicationId "com.softbankrobotics.maplocalizeandmove" 8 | minSdkVersion 23 9 | targetSdkVersion 30 10 | versionCode 147 11 | versionName "1.4.7" 12 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 13 | setProperty("archivesBaseName", "maplocalizeandmove-$versionName") 14 | } 15 | buildTypes { 16 | release { 17 | minifyEnabled false 18 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 19 | } 20 | } 21 | compileOptions { 22 | sourceCompatibility = '1.8' 23 | targetCompatibility = '1.8' 24 | } 25 | splits { 26 | abi { 27 | enable true 28 | reset() 29 | include "x86", "armeabi-v7a" 30 | universalApk false 31 | } 32 | } 33 | } 34 | 35 | dependencies { 36 | implementation fileTree(dir: 'libs', include: ['*.jar']) 37 | implementation 'androidx.appcompat:appcompat:1.2.0' 38 | implementation 'androidx.cardview:cardview:1.0.0' 39 | implementation 'androidx.constraintlayout:constraintlayout:2.0.4' 40 | implementation('com.airbnb.android:lottie:2.7.0') { 41 | exclude group: 'com.android.support', module: 'support-v7' 42 | exclude group: 'com.android.support', module: 'support-v4' 43 | exclude group: 'com.android.support', module: 'design' 44 | exclude group: 'com.android.support', module: 'recyclerview' 45 | exclude group: 'com.android.support', module: 'transition' 46 | } 47 | // Gson 48 | implementation 'com.google.code.gson:gson:2.8.6' 49 | 50 | // Kotlin 51 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 52 | 53 | // QiSDK 54 | implementation 'com.aldebaran:qisdk:1.7.5' 55 | implementation 'com.aldebaran:qisdk-design:1.7.5' 56 | implementation project(path: ':autonomousrecharge') 57 | 58 | implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.0' 59 | implementation 'org.apache.commons:commons-math3:3.6.1' 60 | implementation 'com.github.softbankrobotics-labs:pepper-extras:1.1.1' 61 | } 62 | repositories { 63 | mavenCentral() 64 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/assets/robot/robotsdk.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/softbankrobotics-labs/maplocalizeandmove/845ece3dd73ac767e014a1916e865f9762b94944/app/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /app/src/main/java/com/softbankrobotics/maplocalizeandmove/Fragments/LoadingFragment.java: -------------------------------------------------------------------------------- 1 | package com.softbankrobotics.maplocalizeandmove.Fragments; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | 6 | import androidx.annotation.Nullable; 7 | 8 | import android.util.Log; 9 | import android.view.ContextThemeWrapper; 10 | import android.view.LayoutInflater; 11 | import android.view.View; 12 | import android.view.ViewGroup; 13 | import android.view.animation.Animation; 14 | import android.view.animation.AnimationUtils; 15 | import android.widget.TextView; 16 | 17 | import androidx.fragment.app.Fragment; 18 | 19 | import com.softbankrobotics.maplocalizeandmove.MainActivity; 20 | import com.softbankrobotics.maplocalizeandmove.R; 21 | 22 | public class LoadingFragment extends Fragment { 23 | 24 | private static final String TAG = "MSI_LoadingFragment"; 25 | private MainActivity ma; 26 | 27 | /** 28 | * Inflates the layout associated with this fragment. 29 | * If an application theme is set, it will be applied to this fragment. 30 | */ 31 | 32 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, 33 | Bundle savedInstanceState) { 34 | int fragmentId = R.layout.fragment_loading; 35 | this.ma = (MainActivity) getActivity(); 36 | if (ma != null) { 37 | Integer themeId = ma.getThemeId(); 38 | if (themeId != null) { 39 | final Context contextThemeWrapper = new ContextThemeWrapper(ma, themeId); 40 | LayoutInflater localInflater = inflater.cloneInContext(contextThemeWrapper); 41 | return localInflater.inflate(fragmentId, container, false); 42 | } else { 43 | return inflater.inflate(fragmentId, container, false); 44 | } 45 | } else { 46 | Log.d(TAG, "could not get mainActivity, can't create fragment"); 47 | return null; 48 | } 49 | } 50 | 51 | @Override 52 | public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 53 | TextView textLoading = view.findViewById(R.id.loading_text); 54 | Animation animPulse = AnimationUtils.loadAnimation(ma, R.anim.pulse); 55 | textLoading.startAnimation(animPulse); 56 | } 57 | 58 | } 59 | -------------------------------------------------------------------------------- /app/src/main/java/com/softbankrobotics/maplocalizeandmove/Fragments/LocalizeRobotFragment.java: -------------------------------------------------------------------------------- 1 | package com.softbankrobotics.maplocalizeandmove.Fragments; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | import android.util.Log; 6 | import android.view.ContextThemeWrapper; 7 | import android.view.LayoutInflater; 8 | import android.view.View; 9 | import android.view.ViewGroup; 10 | import android.widget.Button; 11 | import android.widget.ImageView; 12 | 13 | import androidx.annotation.Nullable; 14 | import androidx.fragment.app.Fragment; 15 | 16 | import com.airbnb.lottie.LottieAnimationView; 17 | import com.aldebaran.qi.sdk.util.FutureUtils; 18 | import com.softbankrobotics.maplocalizeandmove.MainActivity; 19 | import com.softbankrobotics.maplocalizeandmove.R; 20 | import com.softbankrobotics.maplocalizeandmove.Utils.LocalizeAndMapHelper; 21 | import com.softbankrobotics.maplocalizeandmove.Utils.Popup; 22 | 23 | import java.util.concurrent.TimeUnit; 24 | 25 | public class LocalizeRobotFragment extends Fragment { 26 | 27 | private static final String TAG = "MSI_LocalizeRobot"; 28 | private MainActivity ma; 29 | private Popup localizedPopup; 30 | 31 | /** 32 | * Inflates the layout associated with this fragment 33 | * If an application theme is set, it will be applied to this fragment. 34 | */ 35 | 36 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, 37 | Bundle savedInstanceState) { 38 | int fragmentId = R.layout.fragment_localize_robot; 39 | this.ma = (MainActivity) getActivity(); 40 | if (ma != null) { 41 | Integer themeId = ma.getThemeId(); 42 | if (themeId != null) { 43 | final Context contextThemeWrapper = new ContextThemeWrapper(ma, themeId); 44 | LayoutInflater localInflater = inflater.cloneInContext(contextThemeWrapper); 45 | return localInflater.inflate(fragmentId, container, false); 46 | } else { 47 | return inflater.inflate(fragmentId, container, false); 48 | } 49 | } else { 50 | Log.d(TAG, "could not get mainActivity, can't create fragment"); 51 | return null; 52 | } 53 | } 54 | 55 | @Override 56 | public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 57 | LocalizeRobotFragment currentFragment = (LocalizeRobotFragment) ma.getFragment(); 58 | Button back_button = view.findViewById(R.id.back_button); 59 | back_button.setOnClickListener((v) -> { 60 | ma.stopLocalizing(); 61 | ma.setFragment(new ProductionFragment(), true); 62 | ma.robotHelper.localizeAndMapHelper.removeOnFinishedLocalizingListeners(); 63 | 64 | }); 65 | Button stopLocalize = view.findViewById(R.id.button_stop_save); 66 | stopLocalize.setOnClickListener((v) -> ma.stopLocalizing()); 67 | 68 | Button retry_Button = view.findViewById(R.id.button_retry); 69 | LottieAnimationView localizing_at_home = view.findViewById(R.id.localizing_at_home); 70 | ImageView localizing_error = view.findViewById(R.id.localizing_error); 71 | 72 | localizedPopup = new Popup(R.layout.popup_localized, this, ma); 73 | Button close_button = localizedPopup.inflator.findViewById(R.id.close_button); 74 | close_button.setOnClickListener((v) -> { 75 | localizedPopup.dialog.hide(); 76 | ma.setFragment(new GoToFrameFragment(), false); 77 | }); 78 | 79 | ma.robotHelper.localizeAndMapHelper.addOnFinishedLocalizingListener(result -> { 80 | ma.robotIsLocalized.set(result == LocalizeAndMapHelper.LocalizationStatus.LOCALIZED); 81 | ma.robotHelper.releaseAbilities(); 82 | ma.runOnUiThread(() -> { 83 | if (result == LocalizeAndMapHelper.LocalizationStatus.LOCALIZED) { 84 | ma.robotLocalizedOnce = true; 85 | localizedPopup.dialog.show(); 86 | localizedPopup.dialog.getWindow().setAttributes(localizedPopup.lp); 87 | FutureUtils.wait(4, TimeUnit.SECONDS) 88 | .thenConsume(aUselessFutureB -> ma.runOnUiThread(() -> { 89 | if (currentFragment.isVisible()) { 90 | ma.setFragment(new GoToFrameFragment(), false); 91 | localizedPopup.dialog.hide(); 92 | } 93 | })); 94 | ma.robotHelper.localizeAndMapHelper.removeOnFinishedLocalizingListeners(); 95 | } else if (result == LocalizeAndMapHelper.LocalizationStatus.MAP_MISSING) { 96 | noMapToLoad(); 97 | ma.robotHelper.localizeAndMapHelper.removeOnFinishedLocalizingListeners(); 98 | } else if (result == LocalizeAndMapHelper.LocalizationStatus.FAILED) { 99 | stopLocalize.setVisibility(View.GONE); 100 | localizing_at_home.setVisibility(View.GONE); 101 | localizing_error.setVisibility(View.VISIBLE); 102 | retry_Button.setVisibility(View.VISIBLE); 103 | retry_Button.setOnClickListener((v) -> { 104 | ma.startLocalizing(); 105 | retry_Button.setVisibility(View.GONE); 106 | localizing_error.setVisibility(View.GONE); 107 | stopLocalize.setVisibility(View.VISIBLE); 108 | localizing_at_home.setVisibility(View.VISIBLE); 109 | }); 110 | } else { 111 | Log.d(TAG, "onViewCreated: Unable to localize in Map"); 112 | } 113 | }); 114 | }); 115 | ma.startLocalizing(); 116 | } 117 | 118 | 119 | /** 120 | * If there is no map to load from memory, display a popup to inform the user. 121 | */ 122 | private void noMapToLoad() { 123 | Popup noMapToLoad = new Popup(R.layout.popup_no_map_to_load, this, ma); 124 | Button close = noMapToLoad.inflator.findViewById(R.id.close_button); 125 | close.setOnClickListener((v) -> { 126 | noMapToLoad.dialog.hide(); 127 | ma.setFragment(new SetupFragment(), true); 128 | }); 129 | noMapToLoad.dialog.show(); 130 | } 131 | 132 | } 133 | -------------------------------------------------------------------------------- /app/src/main/java/com/softbankrobotics/maplocalizeandmove/Fragments/MainFragment.java: -------------------------------------------------------------------------------- 1 | package com.softbankrobotics.maplocalizeandmove.Fragments; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | import android.util.Log; 6 | import android.view.ContextThemeWrapper; 7 | import android.view.LayoutInflater; 8 | import android.view.View; 9 | import android.view.ViewGroup; 10 | 11 | import androidx.annotation.Nullable; 12 | import androidx.fragment.app.Fragment; 13 | 14 | import com.softbankrobotics.maplocalizeandmove.MainActivity; 15 | import com.softbankrobotics.maplocalizeandmove.R; 16 | 17 | public class MainFragment extends Fragment { 18 | 19 | private static final String TAG = "MSI_MainFragment"; 20 | private MainActivity ma; 21 | 22 | /** 23 | * Inflates the layout associated with this fragment 24 | * If an application theme is set, it will be applied to this fragment. 25 | */ 26 | 27 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, 28 | Bundle savedInstanceState) { 29 | int fragmentId = R.layout.fragment_main; 30 | this.ma = (MainActivity) getActivity(); 31 | if (ma != null) { 32 | Integer themeId = ma.getThemeId(); 33 | if (themeId != null) { 34 | final Context contextThemeWrapper = new ContextThemeWrapper(ma, themeId); 35 | LayoutInflater localInflater = inflater.cloneInContext(contextThemeWrapper); 36 | return localInflater.inflate(fragmentId, container, false); 37 | } else { 38 | return inflater.inflate(fragmentId, container, false); 39 | } 40 | } else { 41 | Log.d(TAG, "could not get mainActivity, can't create fragment"); 42 | return null; 43 | } 44 | } 45 | 46 | @Override 47 | public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 48 | view.findViewById(R.id.button_setup_mode).setOnClickListener( 49 | (v) -> ma.setFragment(new SetupFragment(), false)); 50 | view.findViewById(R.id.button_production_mode).setOnClickListener( 51 | (v) -> ma.setFragment(new ProductionFragment(), false)); 52 | } 53 | 54 | } 55 | -------------------------------------------------------------------------------- /app/src/main/java/com/softbankrobotics/maplocalizeandmove/Fragments/ProductionFragment.java: -------------------------------------------------------------------------------- 1 | package com.softbankrobotics.maplocalizeandmove.Fragments; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | 6 | import androidx.annotation.Nullable; 7 | 8 | import android.util.Log; 9 | import android.view.ContextThemeWrapper; 10 | import android.view.LayoutInflater; 11 | import android.view.View; 12 | import android.view.ViewGroup; 13 | import android.widget.Button; 14 | 15 | import androidx.fragment.app.Fragment; 16 | 17 | import com.softbankrobotics.maplocalizeandmove.MainActivity; 18 | import com.softbankrobotics.maplocalizeandmove.R; 19 | 20 | import java.util.concurrent.ExecutionException; 21 | 22 | public class ProductionFragment extends Fragment { 23 | 24 | private static final String TAG = "MSI_ProductionFragment"; 25 | private MainActivity ma; 26 | 27 | /** 28 | * Inflates the layout associated with this fragment 29 | * If an application theme is set, it will be applied to this fragment. 30 | */ 31 | 32 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, 33 | Bundle savedInstanceState) { 34 | int fragmentId = R.layout.fragment_production; 35 | this.ma = (MainActivity) getActivity(); 36 | if (ma != null) { 37 | Integer themeId = ma.getThemeId(); 38 | if (themeId != null) { 39 | final Context contextThemeWrapper = new ContextThemeWrapper(ma, themeId); 40 | LayoutInflater localInflater = inflater.cloneInContext(contextThemeWrapper); 41 | return localInflater.inflate(fragmentId, container, false); 42 | } else { 43 | return inflater.inflate(fragmentId, container, false); 44 | } 45 | } else { 46 | Log.d(TAG, "could not get mainActivity, can't create fragment"); 47 | return null; 48 | } 49 | } 50 | 51 | @Override 52 | public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 53 | view.findViewById(R.id.back_button).setOnClickListener((v) -> 54 | ma.setFragment(new MainFragment(), true)); 55 | Button startLocalizeButton = view.findViewById(R.id.button_start_localize); 56 | 57 | startLocalizeButton.setOnClickListener((v) -> { 58 | if (!ma.robotHelper.askToCloseIfFlapIsOpened()) { 59 | ma.setFragment(new LocalizeRobotFragment(), false); 60 | } 61 | }); 62 | Button goToFrameButton = view.findViewById(R.id.goToFrame); 63 | goToFrameButton.setOnClickListener((v) -> ma.setFragment(new GoToFrameFragment(), false)); 64 | 65 | if (ma.savedLocations.isEmpty()) { 66 | try { 67 | ma.loadLocations().get(); 68 | } catch (ExecutionException e) { 69 | e.printStackTrace(); 70 | } 71 | } 72 | 73 | Button undock = view.findViewById(R.id.goto_undock); 74 | undock.setOnClickListener(v -> { 75 | if (ma.robotLocalizedOnce && ma.savedLocations.containsKey("ChargingStation")) { 76 | if (ma.robotHelper.goToHelper.isDocked(ma.savedLocations.get("ChargingStation")).getValue()) { 77 | ma.undockFromChargingStation(); 78 | } else { 79 | ma.robotHelper.say("I can't undock from ChargingStation as I am not docked"); 80 | Log.d(TAG, "Can't undock from ChargingStation as not docked"); 81 | } 82 | } else if (ma.robotHelper.goToHelper.isDocked(null).getValue()) { 83 | ma.undockFromChargingStation(); 84 | } else { 85 | ma.robotHelper.say("I can't undock from ChargingStation as I am not docked"); 86 | Log.d(TAG, "Can't undock from ChargingStation as not docked & no ChargingStation frame saved"); 87 | } 88 | }); 89 | 90 | // GoToFrameFragment is available only if Pepper is localized. 91 | if (ma.robotIsLocalized.get()) { 92 | goToFrameButton.setEnabled(true); 93 | goToFrameButton.setAlpha(1); 94 | goToFrameButton.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.ic_icn_goto_frame, 0, 0); 95 | startLocalizeButton.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.ic_icn_localize_robot_burgermenu_oklocation, 0, 0); 96 | } 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /app/src/main/java/com/softbankrobotics/maplocalizeandmove/Fragments/SetupFragment.java: -------------------------------------------------------------------------------- 1 | package com.softbankrobotics.maplocalizeandmove.Fragments; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | 6 | import androidx.annotation.Nullable; 7 | 8 | import android.util.Log; 9 | import android.view.ContextThemeWrapper; 10 | import android.view.LayoutInflater; 11 | import android.view.View; 12 | import android.view.ViewGroup; 13 | import android.widget.Button; 14 | 15 | import androidx.fragment.app.Fragment; 16 | 17 | import com.softbankrobotics.maplocalizeandmove.MainActivity; 18 | import com.softbankrobotics.maplocalizeandmove.R; 19 | 20 | public class SetupFragment extends Fragment { 21 | 22 | private static final String TAG = "MSI_SetupFragment"; 23 | private MainActivity ma; 24 | 25 | /** 26 | * Inflates the layout associated with this fragment 27 | * If an application theme is set, it will be applied to this fragment. 28 | */ 29 | 30 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, 31 | Bundle savedInstanceState) { 32 | int fragmentId = R.layout.fragment_setup; 33 | this.ma = (MainActivity) getActivity(); 34 | if (ma != null) { 35 | Integer themeId = ma.getThemeId(); 36 | if (themeId != null) { 37 | final Context contextThemeWrapper = new ContextThemeWrapper(ma, themeId); 38 | LayoutInflater localInflater = inflater.cloneInContext(contextThemeWrapper); 39 | return localInflater.inflate(fragmentId, container, false); 40 | } else { 41 | return inflater.inflate(fragmentId, container, false); 42 | } 43 | } else { 44 | Log.d(TAG, "could not get mainActivity, can't create fragment"); 45 | return null; 46 | } 47 | } 48 | 49 | @Override 50 | public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 51 | view.findViewById(R.id.button_localize_and_map).setOnClickListener((v) -> { 52 | if (!ma.robotHelper.askToCloseIfFlapIsOpened()) { 53 | ma.setFragment(new LocalizeAndMapFragment(), false); 54 | } 55 | }); 56 | 57 | Button menuSaveLocations = view.findViewById(R.id.menu_save_location); 58 | menuSaveLocations.setOnClickListener((v) -> 59 | ma.setFragment(new SaveLocationsFragment(), false)); 60 | 61 | view.findViewById(R.id.back_button).setOnClickListener((v) -> 62 | ma.setFragment(new MainFragment(), true)); 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /app/src/main/java/com/softbankrobotics/maplocalizeandmove/Fragments/SplashFragment.java: -------------------------------------------------------------------------------- 1 | package com.softbankrobotics.maplocalizeandmove.Fragments; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | 6 | import androidx.annotation.Nullable; 7 | 8 | import android.util.Log; 9 | import android.view.ContextThemeWrapper; 10 | import android.view.LayoutInflater; 11 | import android.view.View; 12 | import android.view.ViewGroup; 13 | 14 | import androidx.fragment.app.Fragment; 15 | 16 | import com.softbankrobotics.maplocalizeandmove.MainActivity; 17 | import com.softbankrobotics.maplocalizeandmove.R; 18 | 19 | public class SplashFragment extends Fragment { 20 | 21 | private static final String TAG = "MSI_SplashFragment"; 22 | private MainActivity ma; 23 | 24 | /** 25 | * Inflates the layout associated with this fragment 26 | * If an application theme is set, it will be applied to this fragment. 27 | */ 28 | 29 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, 30 | Bundle savedInstanceState) { 31 | int fragmentId = R.layout.fragment_splash; 32 | this.ma = (MainActivity) getActivity(); 33 | if (ma != null) { 34 | Integer themeId = ma.getThemeId(); 35 | if (themeId != null) { 36 | final Context contextThemeWrapper = new ContextThemeWrapper(ma, themeId); 37 | LayoutInflater localInflater = inflater.cloneInContext(contextThemeWrapper); 38 | return localInflater.inflate(fragmentId, container, false); 39 | } else { 40 | return inflater.inflate(fragmentId, container, false); 41 | } 42 | } else { 43 | Log.d(TAG, "could not get mainActivity, can't create fragment"); 44 | return null; 45 | } 46 | } 47 | 48 | @Override 49 | public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 50 | 51 | } 52 | 53 | } 54 | -------------------------------------------------------------------------------- /app/src/main/java/com/softbankrobotics/maplocalizeandmove/Utils/NavUtils.java: -------------------------------------------------------------------------------- 1 | package com.softbankrobotics.maplocalizeandmove.Utils; 2 | 3 | import com.aldebaran.qi.sdk.object.geometry.Quaternion; 4 | 5 | import static java.lang.Math.atan2; 6 | 7 | class NavUtils { 8 | 9 | private static final String TAG = "MSI_MapLocalizeAndMove"; 10 | 11 | /** 12 | * Get the "yaw" (or "theta") angle from a quaternion (the only angle relevant for navigation). 13 | */ 14 | static double getYawFromQuaternion(Quaternion q) { 15 | // yaw (z-axis rotation) 16 | double x = q.getX(); 17 | double y = q.getY(); 18 | double z = q.getZ(); 19 | double w = q.getW(); 20 | double sinYaw = 2.0 * (w * z + x * y); 21 | double cosYaw = 1.0 - 2.0 * (y * y + z * z); 22 | return atan2(sinYaw, cosYaw); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/softbankrobotics/maplocalizeandmove/Utils/PointsOfInterestView.kt: -------------------------------------------------------------------------------- 1 | package com.softbankrobotics.maplocalizeandmove.Utils 2 | 3 | import android.content.Context 4 | import android.graphics.Canvas 5 | import android.graphics.Color 6 | import android.graphics.Paint 7 | import android.graphics.PointF 8 | import android.util.AttributeSet 9 | import android.util.Log 10 | import com.softbankrobotics.dx.pepperextras.ui.ExplorationMapView 11 | 12 | class PointsOfInterestView(context: Context, attributeSet: AttributeSet): ExplorationMapView(context, attributeSet){ 13 | override fun onDraw(canvas: Canvas) { 14 | super.onDraw(canvas) 15 | mapFramePosition?.let { 16 | canvas.drawCircle(it.x, it.y, poiCircleSize.toFloat(), mapFramePaint) 17 | } 18 | 19 | poiPositions?.let { 20 | for (poiPosition in it){ 21 | canvas.drawCircle(poiPosition.x, poiPosition.y, poiCircleSize.toFloat(), poiPaint) 22 | } 23 | } 24 | } 25 | 26 | private val TAG = "MSI_PointsOfInterestView" 27 | 28 | // Size of the circle representing the robot 29 | private val poiCircleSize: Int = 10 30 | 31 | // Paint for the MapFrame 32 | private val mapFramePaint = Paint().apply { 33 | color = Color.BLUE 34 | style = Paint.Style.FILL 35 | } 36 | 37 | // Paint for the Poi 38 | private val poiPaint = Paint().apply { 39 | color = Color.GREEN 40 | style = Paint.Style.FILL 41 | } 42 | 43 | 44 | private var mapFramePosition : PointF? = null 45 | private var poiPositions : MutableList? = mutableListOf() 46 | 47 | fun setMapFramPosition() { 48 | // Compute the position of the robot in the View 49 | mapFramePosition = mapToViewCoordinates(0.0, 0.0) 50 | Log.i(TAG, "setMapFramPosition: x: ${mapFramePosition?.x}, y: ${mapFramePosition?.y}") 51 | postInvalidate() 52 | } 53 | 54 | fun setPoiPositions(positionsInMap: MutableList) { 55 | for (position in positionsInMap){ 56 | poiPositions?.add(mapToViewCoordinates(position.x.toDouble(),position.y.toDouble())) 57 | } 58 | for (position in poiPositions!!){ 59 | Log.i(TAG, "setPoiPositions: x: ${position.x}, y: ${position.y} ") 60 | } 61 | postInvalidate() 62 | } 63 | } -------------------------------------------------------------------------------- /app/src/main/java/com/softbankrobotics/maplocalizeandmove/Utils/Popup.java: -------------------------------------------------------------------------------- 1 | package com.softbankrobotics.maplocalizeandmove.Utils; 2 | 3 | import android.app.AlertDialog; 4 | 5 | import androidx.fragment.app.Fragment; 6 | 7 | import android.view.LayoutInflater; 8 | import android.view.View; 9 | import android.view.WindowManager; 10 | 11 | import com.softbankrobotics.maplocalizeandmove.MainActivity; 12 | 13 | public class Popup { 14 | public AlertDialog dialog; 15 | public View inflator; 16 | public WindowManager.LayoutParams lp; 17 | 18 | public Popup(int layout, Fragment saveLocationsFragment, MainActivity ma) { 19 | LayoutInflater inflaterPopup = saveLocationsFragment.getLayoutInflater(); 20 | inflator = inflaterPopup.inflate(layout, null); 21 | AlertDialog.Builder builder = new AlertDialog.Builder(ma); 22 | 23 | setSystemUiVisibilityMode(); 24 | inflator.setOnSystemUiVisibilityChangeListener(visibility -> { 25 | setSystemUiVisibilityMode(); // Needed to avoid exiting immersive_sticky when keyboard is displayed 26 | }); 27 | 28 | builder.setView(inflator); 29 | dialog = builder.create(); 30 | 31 | lp = new WindowManager.LayoutParams(); 32 | lp.copyFrom(dialog.getWindow().getAttributes()); 33 | lp.width = WindowManager.LayoutParams.MATCH_PARENT; 34 | lp.height = WindowManager.LayoutParams.MATCH_PARENT; 35 | } 36 | 37 | private void setSystemUiVisibilityMode() { 38 | int options; 39 | options = View.SYSTEM_UI_FLAG_LAYOUT_STABLE 40 | | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 41 | | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 42 | | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar 43 | | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar 44 | | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; 45 | 46 | inflator.setSystemUiVisibility(options); 47 | } 48 | } -------------------------------------------------------------------------------- /app/src/main/java/com/softbankrobotics/maplocalizeandmove/Utils/Vector2theta.java: -------------------------------------------------------------------------------- 1 | package com.softbankrobotics.maplocalizeandmove.Utils; 2 | 3 | import android.os.Parcel; 4 | import android.os.Parcelable; 5 | 6 | import androidx.annotation.NonNull; 7 | 8 | import com.aldebaran.qi.sdk.builder.TransformBuilder; 9 | import com.aldebaran.qi.sdk.object.actuation.Frame; 10 | import com.aldebaran.qi.sdk.object.geometry.Quaternion; 11 | import com.aldebaran.qi.sdk.object.geometry.Transform; 12 | import com.aldebaran.qi.sdk.object.geometry.Vector3; 13 | 14 | import java.io.Serializable; 15 | 16 | public class Vector2theta implements Parcelable, Serializable { 17 | public static final Creator CREATOR = new Creator() { 18 | @Override 19 | public Vector2theta createFromParcel(Parcel in) { 20 | return new Vector2theta(in); 21 | } 22 | 23 | @Override 24 | public Vector2theta[] newArray(int size) { 25 | return new Vector2theta[size]; 26 | } 27 | }; 28 | private double x, y, theta; 29 | 30 | private Vector2theta(double x, double y, double theta) { 31 | this.x = x; 32 | this.y = y; 33 | this.theta = theta; 34 | } 35 | 36 | /***************** PARCELABLE REQUIREMENTS *******************/ 37 | 38 | private Vector2theta(Parcel in) { 39 | x = in.readDouble(); 40 | y = in.readDouble(); 41 | theta = in.readDouble(); 42 | } 43 | 44 | /** 45 | * Create a Vector2theta representing the translation between two frames and angle. 46 | * 47 | * @param frameOrigin the origin of the translation 48 | * @param frameDestination the end of the translation 49 | * @return the Vector2theta to go from frameOrigin to frameDestination 50 | */ 51 | public static Vector2theta betweenFrames(@NonNull Frame frameDestination, @NonNull Frame frameOrigin) { 52 | // Compute the transform to go from "frameOrigin" to "frameDestination" 53 | Transform transform = frameOrigin.async().computeTransform(frameDestination).getValue().getTransform(); 54 | 55 | // Extract translation from the transform 56 | Vector3 translation = transform.getTranslation(); 57 | // Extract quaternion from the transform 58 | Quaternion quaternion = transform.getRotation(); 59 | 60 | // Extract the 2 coordinates from the translation and orientation angle from quaternion 61 | return new Vector2theta(translation.getX(), translation.getY(), NavUtils.getYawFromQuaternion(quaternion)); 62 | } 63 | 64 | /** 65 | * Return a Transform representing the translation described by this Vector2theta. 66 | * 67 | * @return the Transform 68 | */ 69 | public Transform createTransform() { 70 | // this.theta is the radian angle to appy taht was serialized 71 | return TransformBuilder.create().from2DTransform(this.x, this.y, this.theta); 72 | } 73 | 74 | @Override 75 | public int describeContents() { 76 | return 0; 77 | } 78 | 79 | @Override 80 | public void writeToParcel(Parcel parcel, int i) { 81 | parcel.writeDouble(x); 82 | parcel.writeDouble(y); 83 | parcel.writeDouble(theta); 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /app/src/main/res/anim/enter_fade_in_left.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | 10 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/anim/enter_fade_in_right.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | 10 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/anim/exit_fade_out_left.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | 10 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/anim/exit_fade_out_right.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | 10 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/anim/pulse.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 9 | 13 | 16 | 18 | 19 | 25 | 26 | 27 | 28 | 29 | 30 | 33 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/charging_sation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/softbankrobotics-labs/maplocalizeandmove/845ece3dd73ac767e014a1916e865f9762b94944/app/src/main/res/drawable/charging_sation.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/dropdown_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/softbankrobotics-labs/maplocalizeandmove/845ece3dd73ac767e014a1916e865f9762b94944/app/src/main/res/drawable/dropdown_icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_360map_bg.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 7 | 10 | 12 | 15 | 19 | 21 | 24 | 27 | 28 | 31 | 34 | 36 | 39 | 42 | 43 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_btn_add_full.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_btn_back.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_btn_close.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_btn_del.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_btn_del_round.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_btn_goto.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_btn_ok.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_btn_save_down.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_btn_save_up.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 13 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_del_btn.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_dot_followone.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_dot_followthree.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_dot_followtwo.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_dot_full.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_dot_outline.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_icn_goto_frame.xml: -------------------------------------------------------------------------------- 1 | 7 | 11 | 14 | 16 | 17 | 23 | 24 | 25 | 26 | 27 | 28 | 31 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_icn_goto_frame_error.xml: -------------------------------------------------------------------------------- 1 | 7 | 11 | 14 | 17 | 21 | 25 | 29 | 31 | 32 | 38 | 39 | 40 | 41 | 42 | 43 | 46 | 49 | 50 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_icn_goto_frame_error_update.xml: -------------------------------------------------------------------------------- 1 | 7 | 11 | 14 | 17 | 21 | 25 | 29 | 31 | 32 | 38 | 39 | 40 | 41 | 42 | 43 | 46 | 49 | 50 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_icn_goto_frame_notavailable.xml: -------------------------------------------------------------------------------- 1 | 7 | 11 | 18 | 25 | 32 | 39 | 46 | 53 | 60 | 62 | 63 | 69 | 70 | 71 | 72 | 73 | 74 | 77 | 80 | 81 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_icn_goto_frame_ok.xml: -------------------------------------------------------------------------------- 1 | 7 | 11 | 14 | 16 | 17 | 23 | 24 | 25 | 26 | 27 | 28 | 31 | 34 | 38 | 41 | 42 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_icn_goto_frame_ok_update.xml: -------------------------------------------------------------------------------- 1 | 7 | 11 | 14 | 16 | 17 | 23 | 24 | 25 | 26 | 27 | 28 | 31 | 34 | 37 | 41 | 44 | 45 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_icn_localize_and_map.xml: -------------------------------------------------------------------------------- 1 | 7 | 9 | 10 | 16 | 17 | 18 | 19 | 20 | 21 | 24 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_icn_localize_done.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 15 | 18 | 21 | 25 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_icn_localize_error.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 15 | 18 | 22 | 26 | 30 | 31 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_icn_localize_robot_burgermenu.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_icn_localize_robot_burgermenu_oklocation.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 13 | 16 | 19 | 21 | 22 | 28 | 29 | 30 | 31 | 32 | 33 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | 63 | 64 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_icn_map_positions.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 12 | 13 | 19 | 20 | 21 | 22 | 23 | 24 | 32 | 36 | 39 | 42 | 46 | 48 | 49 | 55 | 56 | 57 | 58 | 59 | 60 | 63 | 64 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_icn_mapping.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 12 | 13 | 19 | 20 | 21 | 22 | 23 | 24 | 27 | 30 | 34 | 37 | 39 | 40 | 46 | 47 | 48 | 49 | 50 | 51 | 54 | 55 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_icn_nolocation.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_icn_productionmode.xml: -------------------------------------------------------------------------------- 1 | 7 | 11 | 15 | 19 | 23 | 27 | 31 | 38 | 39 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 58 | 61 | 62 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_icn_save_frames.xml: -------------------------------------------------------------------------------- 1 | 7 | 9 | 10 | 16 | 17 | 18 | 19 | 20 | 21 | 23 | 24 | 30 | 31 | 32 | 33 | 34 | 35 | 38 | 42 | 43 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_icn_save_frames_ok.xml: -------------------------------------------------------------------------------- 1 | 7 | 9 | 10 | 16 | 17 | 18 | 19 | 20 | 21 | 23 | 24 | 30 | 31 | 32 | 33 | 34 | 35 | 38 | 41 | 45 | 48 | 49 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_icn_setupmode.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 31 | 32 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 47 | 48 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 64 | 67 | 71 | 74 | 78 | 81 | 82 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_icn_warning.xml: -------------------------------------------------------------------------------- 1 | 3 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_location.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_separation_list.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_separation_menu.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/spinner.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 14 | 15 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/spinner_boarder.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ui_pepper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/softbankrobotics-labs/maplocalizeandmove/845ece3dd73ac767e014a1916e865f9762b94944/app/src/main/res/drawable/ui_pepper.png -------------------------------------------------------------------------------- /app/src/main/res/font/verdana.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/softbankrobotics-labs/maplocalizeandmove/845ece3dd73ac767e014a1916e865f9762b94944/app/src/main/res/font/verdana.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/verdanab.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/softbankrobotics-labs/maplocalizeandmove/845ece3dd73ac767e014a1916e865f9762b94944/app/src/main/res/font/verdanab.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/verdanai.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/softbankrobotics-labs/maplocalizeandmove/845ece3dd73ac767e014a1916e865f9762b94944/app/src/main/res/font/verdanai.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/verdanaz.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/softbankrobotics-labs/maplocalizeandmove/845ece3dd73ac767e014a1916e865f9762b94944/app/src/main/res/font/verdanaz.ttf -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_loading.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_localize_robot.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 |