├── src ├── android_foo │ ├── .gitignore │ ├── control_app │ │ ├── .gitignore │ │ ├── libs │ │ │ └── osmbonuspack_v5.8.1.aar │ │ ├── src │ │ │ └── main │ │ │ │ ├── res │ │ │ │ ├── drawable │ │ │ │ │ ├── gps.png │ │ │ │ │ ├── logo.png │ │ │ │ │ ├── wifi_0.png │ │ │ │ │ ├── wifi_1.png │ │ │ │ │ ├── wifi_2.png │ │ │ │ │ ├── wifi_3.png │ │ │ │ │ ├── wifi_4.png │ │ │ │ │ ├── speedometer.png │ │ │ │ │ └── background_splash.xml │ │ │ │ ├── drawable-hdpi │ │ │ │ │ ├── marker.png │ │ │ │ │ ├── user1.png │ │ │ │ │ ├── user2.png │ │ │ │ │ ├── marker2.jpeg │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ ├── drawer_shadow.9.png │ │ │ │ │ ├── ic_action_about.png │ │ │ │ │ ├── ic_action_camera.png │ │ │ │ │ ├── ic_action_cloud.png │ │ │ │ │ ├── ic_action_email.png │ │ │ │ │ ├── ic_action_good.png │ │ │ │ │ ├── ic_action_group.png │ │ │ │ │ ├── ic_action_help.png │ │ │ │ │ ├── ic_action_labels.png │ │ │ │ │ ├── ic_action_prefs.png │ │ │ │ │ ├── ic_action_search.png │ │ │ │ │ ├── ic_action_topics.png │ │ │ │ │ ├── ic_action_video.png │ │ │ │ │ ├── ic_action_gamepad.png │ │ │ │ │ ├── ic_action_settings.png │ │ │ │ │ ├── ic_edit_black_24dp.png │ │ │ │ │ ├── ic_flag_black_24dp.png │ │ │ │ │ ├── ic_help_black_24dp.png │ │ │ │ │ ├── ic_warning_system.png │ │ │ │ │ ├── ic_android_black_24dp.png │ │ │ │ │ ├── ic_delete_black_24dp.png │ │ │ │ │ ├── ic_terrain_black_24dp.png │ │ │ │ │ ├── ic_action_import_export.png │ │ │ │ │ ├── ic_settings_black_24dp.png │ │ │ │ │ ├── ic_add_circle_black_24dp.png │ │ │ │ │ ├── ic_info_outline_black_24dp.png │ │ │ │ │ ├── ic_navigation_black_24dp.png │ │ │ │ │ ├── ic_view_quilt_black_24dp.png │ │ │ │ │ ├── ic_view_quilt_black_48dp.png │ │ │ │ │ ├── ic_linked_camera_black_24dp.png │ │ │ │ │ └── ic_settings_ethernet_black_24dp.png │ │ │ │ ├── drawable-mdpi │ │ │ │ │ ├── user1.png │ │ │ │ │ ├── user2.png │ │ │ │ │ ├── ic_drawer.png │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ ├── ic_action_about.png │ │ │ │ │ ├── ic_action_camera.png │ │ │ │ │ ├── ic_action_cloud.png │ │ │ │ │ ├── ic_action_email.png │ │ │ │ │ ├── ic_action_good.png │ │ │ │ │ ├── ic_action_group.png │ │ │ │ │ ├── ic_action_help.png │ │ │ │ │ ├── ic_action_labels.png │ │ │ │ │ ├── ic_action_prefs.png │ │ │ │ │ ├── ic_action_search.png │ │ │ │ │ ├── ic_action_topics.png │ │ │ │ │ ├── ic_action_video.png │ │ │ │ │ ├── ic_action_gamepad.png │ │ │ │ │ ├── ic_action_settings.png │ │ │ │ │ ├── ic_edit_black_24dp.png │ │ │ │ │ ├── ic_flag_black_24dp.png │ │ │ │ │ ├── ic_help_black_24dp.png │ │ │ │ │ ├── ic_warning_system.png │ │ │ │ │ ├── ic_android_black_24dp.png │ │ │ │ │ ├── ic_delete_black_24dp.png │ │ │ │ │ ├── ic_terrain_black_24dp.png │ │ │ │ │ ├── ic_action_import_export.png │ │ │ │ │ ├── ic_settings_black_24dp.png │ │ │ │ │ ├── ic_add_circle_black_24dp.png │ │ │ │ │ ├── ic_info_outline_black_24dp.png │ │ │ │ │ ├── ic_navigation_black_24dp.png │ │ │ │ │ ├── ic_view_quilt_black_24dp.png │ │ │ │ │ ├── ic_view_quilt_black_48dp.png │ │ │ │ │ ├── ic_linked_camera_black_24dp.png │ │ │ │ │ └── ic_settings_ethernet_black_24dp.png │ │ │ │ ├── drawable-xhdpi │ │ │ │ │ ├── user1.png │ │ │ │ │ ├── user2.png │ │ │ │ │ ├── ic_action_about.png │ │ │ │ │ ├── ic_action_cloud.png │ │ │ │ │ ├── ic_action_email.png │ │ │ │ │ ├── ic_action_good.png │ │ │ │ │ ├── ic_action_group.png │ │ │ │ │ ├── ic_action_help.png │ │ │ │ │ ├── ic_action_prefs.png │ │ │ │ │ ├── ic_action_video.png │ │ │ │ │ ├── ic_action_camera.png │ │ │ │ │ ├── ic_action_gamepad.png │ │ │ │ │ ├── ic_action_labels.png │ │ │ │ │ ├── ic_action_search.png │ │ │ │ │ ├── ic_action_topics.png │ │ │ │ │ ├── ic_warning_system.png │ │ │ │ │ ├── ic_action_settings.png │ │ │ │ │ ├── ic_delete_black_24dp.png │ │ │ │ │ ├── ic_edit_black_24dp.png │ │ │ │ │ ├── ic_flag_black_24dp.png │ │ │ │ │ ├── ic_help_black_24dp.png │ │ │ │ │ ├── ic_android_black_24dp.png │ │ │ │ │ ├── ic_settings_black_24dp.png │ │ │ │ │ ├── ic_terrain_black_24dp.png │ │ │ │ │ ├── ic_action_import_export.png │ │ │ │ │ ├── ic_add_circle_black_24dp.png │ │ │ │ │ ├── ic_navigation_black_24dp.png │ │ │ │ │ ├── ic_view_quilt_black_24dp.png │ │ │ │ │ ├── ic_view_quilt_black_48dp.png │ │ │ │ │ ├── ic_info_outline_black_24dp.png │ │ │ │ │ ├── ic_linked_camera_black_24dp.png │ │ │ │ │ └── ic_settings_ethernet_black_24dp.png │ │ │ │ ├── drawable-xxhdpi │ │ │ │ │ ├── user1.png │ │ │ │ │ ├── user2.png │ │ │ │ │ ├── ros_logo.png │ │ │ │ │ ├── ic_action_good.png │ │ │ │ │ ├── ic_action_help.png │ │ │ │ │ ├── ic_action_about.png │ │ │ │ │ ├── ic_action_camera.png │ │ │ │ │ ├── ic_action_cloud.png │ │ │ │ │ ├── ic_action_email.png │ │ │ │ │ ├── ic_action_group.png │ │ │ │ │ ├── ic_action_labels.png │ │ │ │ │ ├── ic_action_prefs.png │ │ │ │ │ ├── ic_action_search.png │ │ │ │ │ ├── ic_action_topics.png │ │ │ │ │ ├── ic_action_video.png │ │ │ │ │ ├── ic_action_gamepad.png │ │ │ │ │ ├── ic_action_settings.png │ │ │ │ │ ├── ic_edit_black_24dp.png │ │ │ │ │ ├── ic_flag_black_24dp.png │ │ │ │ │ ├── ic_help_black_24dp.png │ │ │ │ │ ├── ic_warning_system.png │ │ │ │ │ ├── ic_android_black_24dp.png │ │ │ │ │ ├── ic_delete_black_24dp.png │ │ │ │ │ ├── ic_terrain_black_24dp.png │ │ │ │ │ ├── ic_action_import_export.png │ │ │ │ │ ├── ic_add_circle_black_24dp.png │ │ │ │ │ ├── ic_navigation_black_24dp.png │ │ │ │ │ ├── ic_settings_black_24dp.png │ │ │ │ │ ├── ic_view_quilt_black_24dp.png │ │ │ │ │ ├── ic_view_quilt_black_48dp.png │ │ │ │ │ ├── ic_info_outline_black_24dp.png │ │ │ │ │ ├── ic_linked_camera_black_24dp.png │ │ │ │ │ └── ic_settings_ethernet_black_24dp.png │ │ │ │ ├── drawable-ldpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── drawable-xxxhdpi │ │ │ │ │ ├── ic_edit_black_24dp.png │ │ │ │ │ ├── ic_flag_black_24dp.png │ │ │ │ │ ├── ic_help_black_24dp.png │ │ │ │ │ ├── ic_delete_black_24dp.png │ │ │ │ │ ├── ic_android_black_24dp.png │ │ │ │ │ ├── ic_settings_black_24dp.png │ │ │ │ │ ├── ic_terrain_black_24dp.png │ │ │ │ │ ├── ic_add_circle_black_24dp.png │ │ │ │ │ ├── ic_navigation_black_24dp.png │ │ │ │ │ ├── ic_view_quilt_black_24dp.png │ │ │ │ │ ├── ic_view_quilt_black_48dp.png │ │ │ │ │ ├── ic_info_outline_black_24dp.png │ │ │ │ │ ├── ic_linked_camera_black_24dp.png │ │ │ │ │ └── ic_settings_ethernet_black_24dp.png │ │ │ │ ├── values-v21 │ │ │ │ │ └── styles.xml │ │ │ │ ├── anim │ │ │ │ │ ├── slide_in_top.xml │ │ │ │ │ └── slide_out_bottom.xml │ │ │ │ ├── values │ │ │ │ │ ├── colors.xml │ │ │ │ │ └── styles.xml │ │ │ │ ├── menu │ │ │ │ │ ├── menu_robot_chooser.xml │ │ │ │ │ └── menu_control_app.xml │ │ │ │ ├── layout │ │ │ │ │ ├── show_camera.xml │ │ │ │ │ ├── fragment_about.xml │ │ │ │ │ ├── pageone_fragment.xml │ │ │ │ │ ├── pagethree_fragment.xml │ │ │ │ │ ├── pagetwo_fragment.xml │ │ │ │ │ ├── fragment_joystick_view.xml │ │ │ │ │ ├── fragment_camera_view.xml │ │ │ │ │ ├── fragment_map.xml │ │ │ │ │ ├── actionbar_dropdown_menu.xml │ │ │ │ │ ├── nav_drawer_menu_item.xml │ │ │ │ │ ├── fragment_help.xml │ │ │ │ │ ├── fragment_overview.xml │ │ │ │ │ ├── fragment_laser_scan.xml │ │ │ │ │ ├── main.xml │ │ │ │ │ ├── robot_info_view.xml │ │ │ │ │ └── robot_chooser.xml │ │ │ │ ├── layout-land │ │ │ │ │ ├── fragment_overview.xml │ │ │ │ │ └── main.xml │ │ │ │ ├── raw │ │ │ │ │ ├── about.html │ │ │ │ │ ├── faq.html │ │ │ │ │ ├── using.html │ │ │ │ │ └── setup.html │ │ │ │ └── layout-large │ │ │ │ │ └── fragment_hud.xml │ │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── robotca │ │ │ │ │ └── ControlApp │ │ │ │ │ ├── Core │ │ │ │ │ ├── Savable.java │ │ │ │ │ ├── IWaypointProvider.java │ │ │ │ │ ├── DrawerItem.java │ │ │ │ │ ├── LocationProvider.java │ │ │ │ │ ├── ControlMode.java │ │ │ │ │ ├── Plans │ │ │ │ │ │ ├── RandomWalkPlan.java │ │ │ │ │ │ ├── SimpleWaypointPlan.java │ │ │ │ │ │ └── RobotPlan.java │ │ │ │ │ ├── NavDrawerAdapter.java │ │ │ │ │ └── WarningSystem.java │ │ │ │ │ ├── Fragments │ │ │ │ │ ├── PageOneFragment.java │ │ │ │ │ ├── PageThreeFragment.java │ │ │ │ │ ├── PageTwoFragment.java │ │ │ │ │ ├── AboutFragment.java │ │ │ │ │ ├── SimpleFragment.java │ │ │ │ │ ├── AboutFragmentRobotChooser.java │ │ │ │ │ ├── PreferencesFragment.java │ │ │ │ │ ├── RosFragment.java │ │ │ │ │ ├── CameraViewFragment.java │ │ │ │ │ ├── OverviewFragment.java │ │ │ │ │ ├── JoystickFragment.java │ │ │ │ │ └── LaserScanFragment.java │ │ │ │ │ ├── ToolbarActionItemTarget.java │ │ │ │ │ ├── Views │ │ │ │ │ ├── BetterEditTextPreference.java │ │ │ │ │ └── LaserScanView.java │ │ │ │ │ ├── SplashActivity.java │ │ │ │ │ ├── Dialogs │ │ │ │ │ └── ConfirmDeleteDialogFragment.java │ │ │ │ │ └── ShowCamera.java │ │ │ │ └── AndroidManifest.xml │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ ├── gradle-wrapper.jar │ │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew.bat │ │ └── build.gradle │ ├── control_app_lib │ │ ├── .gitignore │ │ ├── src │ │ │ └── main │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── res │ │ │ │ ├── drawable-hdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── drawable-ldpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── drawable-mdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── values │ │ │ │ └── strings.xml │ │ │ │ └── layout │ │ │ │ └── main.xml │ │ └── build.gradle │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── settings.gradle │ ├── CMakeLists.txt │ ├── package.xml │ ├── gradlew.bat │ └── build.gradle └── CMakeLists.txt ├── devel ├── .catkin ├── .rosinstall ├── share │ ├── maven │ │ └── com │ │ │ └── github │ │ │ └── rosjava │ │ │ └── android_foo │ │ │ ├── control_app │ │ │ ├── maven-metadata.xml.md5 │ │ │ ├── 0.1.0 │ │ │ │ ├── control_app-0.1.0.apk.md5 │ │ │ │ ├── control_app-0.1.0.pom.md5 │ │ │ │ ├── control_app-0.1.0.apk.sha1 │ │ │ │ ├── control_app-0.1.0.pom.sha1 │ │ │ │ └── control_app-0.1.0.pom │ │ │ ├── maven-metadata.xml.sha1 │ │ │ ├── unspecified │ │ │ │ ├── control_app-unspecified.apk.md5 │ │ │ │ ├── control_app-unspecified.pom.md5 │ │ │ │ ├── control_app-unspecified.apk.sha1 │ │ │ │ ├── control_app-unspecified.pom.sha1 │ │ │ │ └── control_app-unspecified.pom │ │ │ └── maven-metadata.xml │ │ │ └── control_app_lib │ │ │ ├── maven-metadata.xml.md5 │ │ │ ├── maven-metadata.xml.sha1 │ │ │ ├── 0.1.0 │ │ │ ├── control_app_lib-0.1.0.aar.md5 │ │ │ ├── control_app_lib-0.1.0.pom.md5 │ │ │ ├── control_app_lib-0.1.0.aar.sha1 │ │ │ ├── control_app_lib-0.1.0.pom.sha1 │ │ │ ├── control_app_lib-0.1.0.aar │ │ │ └── control_app_lib-0.1.0.pom │ │ │ ├── unspecified │ │ │ ├── control_app_lib-unspecified.aar.md5 │ │ │ ├── control_app_lib-unspecified.pom.md5 │ │ │ ├── control_app_lib-unspecified.aar.sha1 │ │ │ ├── control_app_lib-unspecified.pom.sha1 │ │ │ ├── control_app_lib-unspecified.aar │ │ │ └── control_app_lib-unspecified.pom │ │ │ └── maven-metadata.xml │ └── android_foo │ │ └── cmake │ │ └── android_fooConfig-version.cmake ├── setup.bash ├── setup.zsh ├── env.sh └── setup.sh ├── Release └── control_app-debug.apk ├── .catkin_workspace ├── .gitignore ├── Release.key └── README.md /src/android_foo/.gitignore: -------------------------------------------------------------------------------- 1 | .idea/* -------------------------------------------------------------------------------- /devel/.catkin: -------------------------------------------------------------------------------- 1 | /home/mike/rosjava/catkin_ws_android/src -------------------------------------------------------------------------------- /src/android_foo/control_app/.gitignore: -------------------------------------------------------------------------------- 1 | .idea/* 2 | **/*.iml 3 | -------------------------------------------------------------------------------- /src/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | /opt/ros/indigo/share/catkin/cmake/toplevel.cmake -------------------------------------------------------------------------------- /src/android_foo/control_app_lib/.gitignore: -------------------------------------------------------------------------------- 1 | .idea/* 2 | **/*.iml 3 | -------------------------------------------------------------------------------- /devel/.rosinstall: -------------------------------------------------------------------------------- 1 | - setup-file: 2 | local-name: /home/mike/rosjava/catkin_ws_android/devel/setup.sh 3 | -------------------------------------------------------------------------------- /Release/control_app-debug.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/Release/control_app-debug.apk -------------------------------------------------------------------------------- /devel/share/maven/com/github/rosjava/android_foo/control_app/maven-metadata.xml.md5: -------------------------------------------------------------------------------- 1 | 40bcbe215214de584560ec9de06b3db2 -------------------------------------------------------------------------------- /.catkin_workspace: -------------------------------------------------------------------------------- 1 | # This file currently only serves to mark the location of a catkin workspace for tool integration 2 | -------------------------------------------------------------------------------- /devel/share/maven/com/github/rosjava/android_foo/control_app_lib/maven-metadata.xml.md5: -------------------------------------------------------------------------------- 1 | 240d8f2762869c331e7acea06f444dda -------------------------------------------------------------------------------- /devel/share/maven/com/github/rosjava/android_foo/control_app/0.1.0/control_app-0.1.0.apk.md5: -------------------------------------------------------------------------------- 1 | e5d3731be4aeec5212bf33b3196e6302 -------------------------------------------------------------------------------- /devel/share/maven/com/github/rosjava/android_foo/control_app/0.1.0/control_app-0.1.0.pom.md5: -------------------------------------------------------------------------------- 1 | 84f37e24572948907dd4e3daaa7e8734 -------------------------------------------------------------------------------- /devel/share/maven/com/github/rosjava/android_foo/control_app/maven-metadata.xml.sha1: -------------------------------------------------------------------------------- 1 | 4213c0135db638abe41b4e65b1864917634914a9 -------------------------------------------------------------------------------- /devel/share/maven/com/github/rosjava/android_foo/control_app_lib/maven-metadata.xml.sha1: -------------------------------------------------------------------------------- 1 | 09b60a0d720f731396baa27b7caa8bc7a6ca2fed -------------------------------------------------------------------------------- /devel/share/maven/com/github/rosjava/android_foo/control_app/0.1.0/control_app-0.1.0.apk.sha1: -------------------------------------------------------------------------------- 1 | 3a180c7be6675ddebf2cbf54f9a4b1ef14765e96 -------------------------------------------------------------------------------- /devel/share/maven/com/github/rosjava/android_foo/control_app/0.1.0/control_app-0.1.0.pom.sha1: -------------------------------------------------------------------------------- 1 | 11834477bb30f74943dfc1cd0641833406ca9f22 -------------------------------------------------------------------------------- /devel/share/maven/com/github/rosjava/android_foo/control_app_lib/0.1.0/control_app_lib-0.1.0.aar.md5: -------------------------------------------------------------------------------- 1 | e29da5cd67b76881afb3d1965ff0394c -------------------------------------------------------------------------------- /devel/share/maven/com/github/rosjava/android_foo/control_app_lib/0.1.0/control_app_lib-0.1.0.pom.md5: -------------------------------------------------------------------------------- 1 | c4c08792ee845de251273947123ad808 -------------------------------------------------------------------------------- /devel/share/maven/com/github/rosjava/android_foo/control_app/unspecified/control_app-unspecified.apk.md5: -------------------------------------------------------------------------------- 1 | c036fa9169f6ca330bf8768000fd1309 -------------------------------------------------------------------------------- /devel/share/maven/com/github/rosjava/android_foo/control_app/unspecified/control_app-unspecified.pom.md5: -------------------------------------------------------------------------------- 1 | c5510332e874c0a6938c904d9ce02d13 -------------------------------------------------------------------------------- /devel/share/maven/com/github/rosjava/android_foo/control_app_lib/0.1.0/control_app_lib-0.1.0.aar.sha1: -------------------------------------------------------------------------------- 1 | 488cf1ef2fd3987f7e77860f31e8765ee4a891cf -------------------------------------------------------------------------------- /devel/share/maven/com/github/rosjava/android_foo/control_app_lib/0.1.0/control_app_lib-0.1.0.pom.sha1: -------------------------------------------------------------------------------- 1 | 9de56d26f31dc43d98c5b5ad382422432551ff86 -------------------------------------------------------------------------------- /devel/share/maven/com/github/rosjava/android_foo/control_app/unspecified/control_app-unspecified.apk.sha1: -------------------------------------------------------------------------------- 1 | ec0d0b6687d0ed2ae0288234d5ddf823020f3c50 -------------------------------------------------------------------------------- /devel/share/maven/com/github/rosjava/android_foo/control_app/unspecified/control_app-unspecified.pom.sha1: -------------------------------------------------------------------------------- 1 | d0f5d3c8ac0a73eb4e3233aad6643368fa983419 -------------------------------------------------------------------------------- /devel/share/maven/com/github/rosjava/android_foo/control_app_lib/unspecified/control_app_lib-unspecified.aar.md5: -------------------------------------------------------------------------------- 1 | e29da5cd67b76881afb3d1965ff0394c -------------------------------------------------------------------------------- /devel/share/maven/com/github/rosjava/android_foo/control_app_lib/unspecified/control_app_lib-unspecified.pom.md5: -------------------------------------------------------------------------------- 1 | 8297cfe99ddba4f638d44e9c070d2cb8 -------------------------------------------------------------------------------- /devel/share/maven/com/github/rosjava/android_foo/control_app_lib/unspecified/control_app_lib-unspecified.aar.sha1: -------------------------------------------------------------------------------- 1 | 488cf1ef2fd3987f7e77860f31e8765ee4a891cf -------------------------------------------------------------------------------- /devel/share/maven/com/github/rosjava/android_foo/control_app_lib/unspecified/control_app_lib-unspecified.pom.sha1: -------------------------------------------------------------------------------- 1 | b63c63155a9d1a0c6b9bc4e4206c02ba2f400172 -------------------------------------------------------------------------------- /src/android_foo/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /src/android_foo/control_app/libs/osmbonuspack_v5.8.1.aar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/libs/osmbonuspack_v5.8.1.aar -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable/gps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable/gps.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable/logo.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable/wifi_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable/wifi_0.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable/wifi_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable/wifi_1.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable/wifi_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable/wifi_2.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable/wifi_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable/wifi_3.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable/wifi_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable/wifi_4.png -------------------------------------------------------------------------------- /src/android_foo/control_app/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-hdpi/marker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-hdpi/marker.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-hdpi/user1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-hdpi/user1.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-hdpi/user2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-hdpi/user2.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-mdpi/user1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-mdpi/user1.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-mdpi/user2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-mdpi/user2.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xhdpi/user1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xhdpi/user1.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xhdpi/user2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xhdpi/user2.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable/speedometer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable/speedometer.png -------------------------------------------------------------------------------- /src/android_foo/control_app_lib/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-hdpi/marker2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-hdpi/marker2.jpeg -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxhdpi/user1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxhdpi/user1.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxhdpi/user2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxhdpi/user2.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-ldpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-ldpi/ic_launcher.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-mdpi/ic_drawer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-mdpi/ic_drawer.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxhdpi/ros_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxhdpi/ros_logo.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-hdpi/drawer_shadow.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-hdpi/drawer_shadow.9.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-hdpi/ic_action_about.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-hdpi/ic_action_about.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-hdpi/ic_action_camera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-hdpi/ic_action_camera.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-hdpi/ic_action_cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-hdpi/ic_action_cloud.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-hdpi/ic_action_email.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-hdpi/ic_action_email.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-hdpi/ic_action_good.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-hdpi/ic_action_good.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-hdpi/ic_action_group.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-hdpi/ic_action_group.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-hdpi/ic_action_help.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-hdpi/ic_action_help.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-hdpi/ic_action_labels.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-hdpi/ic_action_labels.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-hdpi/ic_action_prefs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-hdpi/ic_action_prefs.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-hdpi/ic_action_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-hdpi/ic_action_search.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-hdpi/ic_action_topics.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-hdpi/ic_action_topics.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-hdpi/ic_action_video.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-hdpi/ic_action_video.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-mdpi/ic_action_about.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-mdpi/ic_action_about.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-mdpi/ic_action_camera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-mdpi/ic_action_camera.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-mdpi/ic_action_cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-mdpi/ic_action_cloud.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-mdpi/ic_action_email.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-mdpi/ic_action_email.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-mdpi/ic_action_good.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-mdpi/ic_action_good.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-mdpi/ic_action_group.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-mdpi/ic_action_group.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-mdpi/ic_action_help.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-mdpi/ic_action_help.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-mdpi/ic_action_labels.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-mdpi/ic_action_labels.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-mdpi/ic_action_prefs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-mdpi/ic_action_prefs.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-mdpi/ic_action_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-mdpi/ic_action_search.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-mdpi/ic_action_topics.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-mdpi/ic_action_topics.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-mdpi/ic_action_video.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-mdpi/ic_action_video.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_action_about.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_action_about.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_action_cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_action_cloud.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_action_email.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_action_email.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_action_good.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_action_good.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_action_group.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_action_group.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_action_help.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_action_help.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_action_prefs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_action_prefs.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_action_video.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_action_video.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_action_good.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_action_good.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_action_help.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_action_help.png -------------------------------------------------------------------------------- /src/android_foo/control_app_lib/src/main/res/drawable-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app_lib/src/main/res/drawable-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /src/android_foo/control_app_lib/src/main/res/drawable-ldpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app_lib/src/main/res/drawable-ldpi/ic_launcher.png -------------------------------------------------------------------------------- /src/android_foo/control_app_lib/src/main/res/drawable-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app_lib/src/main/res/drawable-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /src/android_foo/control_app_lib/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | ACTIVITY_ENTRY_NAME 4 | 5 | -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-hdpi/ic_action_gamepad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-hdpi/ic_action_gamepad.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-hdpi/ic_action_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-hdpi/ic_action_settings.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-hdpi/ic_edit_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-hdpi/ic_edit_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-hdpi/ic_flag_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-hdpi/ic_flag_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-hdpi/ic_help_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-hdpi/ic_help_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-hdpi/ic_warning_system.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-hdpi/ic_warning_system.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-mdpi/ic_action_gamepad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-mdpi/ic_action_gamepad.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-mdpi/ic_action_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-mdpi/ic_action_settings.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-mdpi/ic_edit_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-mdpi/ic_edit_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-mdpi/ic_flag_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-mdpi/ic_flag_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-mdpi/ic_help_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-mdpi/ic_help_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-mdpi/ic_warning_system.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-mdpi/ic_warning_system.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_action_camera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_action_camera.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_action_gamepad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_action_gamepad.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_action_labels.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_action_labels.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_action_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_action_search.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_action_topics.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_action_topics.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_warning_system.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_warning_system.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_action_about.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_action_about.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_action_camera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_action_camera.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_action_cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_action_cloud.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_action_email.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_action_email.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_action_group.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_action_group.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_action_labels.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_action_labels.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_action_prefs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_action_prefs.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_action_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_action_search.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_action_topics.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_action_topics.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_action_video.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_action_video.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-hdpi/ic_android_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-hdpi/ic_android_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-hdpi/ic_delete_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-hdpi/ic_delete_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-hdpi/ic_terrain_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-hdpi/ic_terrain_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-mdpi/ic_android_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-mdpi/ic_android_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-mdpi/ic_delete_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-mdpi/ic_delete_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-mdpi/ic_terrain_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-mdpi/ic_terrain_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_action_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_action_settings.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_delete_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_delete_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_edit_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_edit_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_flag_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_flag_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_help_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_help_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_action_gamepad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_action_gamepad.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_action_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_action_settings.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_edit_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_edit_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_flag_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_flag_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_help_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_help_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_warning_system.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_warning_system.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxxhdpi/ic_edit_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxxhdpi/ic_edit_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxxhdpi/ic_flag_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxxhdpi/ic_flag_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxxhdpi/ic_help_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxxhdpi/ic_help_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-hdpi/ic_action_import_export.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-hdpi/ic_action_import_export.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-hdpi/ic_settings_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-hdpi/ic_settings_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-mdpi/ic_action_import_export.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-mdpi/ic_action_import_export.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-mdpi/ic_settings_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-mdpi/ic_settings_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_android_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_android_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_settings_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_settings_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_terrain_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_terrain_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_android_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_android_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_delete_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_delete_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_terrain_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_terrain_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxxhdpi/ic_delete_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxxhdpi/ic_delete_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-hdpi/ic_add_circle_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-hdpi/ic_add_circle_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-hdpi/ic_info_outline_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-hdpi/ic_info_outline_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-hdpi/ic_navigation_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-hdpi/ic_navigation_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-hdpi/ic_view_quilt_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-hdpi/ic_view_quilt_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-hdpi/ic_view_quilt_black_48dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-hdpi/ic_view_quilt_black_48dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-mdpi/ic_add_circle_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-mdpi/ic_add_circle_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-mdpi/ic_info_outline_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-mdpi/ic_info_outline_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-mdpi/ic_navigation_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-mdpi/ic_navigation_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-mdpi/ic_view_quilt_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-mdpi/ic_view_quilt_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-mdpi/ic_view_quilt_black_48dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-mdpi/ic_view_quilt_black_48dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_action_import_export.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_action_import_export.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_add_circle_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_add_circle_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_navigation_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_navigation_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_view_quilt_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_view_quilt_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_view_quilt_black_48dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xhdpi/ic_view_quilt_black_48dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_action_import_export.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_action_import_export.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_add_circle_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_add_circle_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_navigation_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_navigation_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_settings_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_settings_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_view_quilt_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_view_quilt_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_view_quilt_black_48dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxhdpi/ic_view_quilt_black_48dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxxhdpi/ic_android_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxxhdpi/ic_android_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxxhdpi/ic_settings_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxxhdpi/ic_settings_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/drawable-xxxhdpi/ic_terrain_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ros-autom/RobotCA/HEAD/src/android_foo/control_app/src/main/res/drawable-xxxhdpi/ic_terrain_black_24dp.png -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/values-v21/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | 11 | 12 | 13 |

 About ROS Control

14 | 15 |

This app is the result of a Senior Project to design an Android application to control a robot. 16 |
Our goal was to create an Android application to interface with a Robot Operating System (ROS) robot for direct drive, diagnostic, and navigation information. 17 | The application processes data from various sensors on the robot and displays the information in an understandable fashion. It has been optimized for tablets whose increased screen size can accomodate the variety of displays for visualizing data from the robot's sensors. 18 |

19 | 20 |
21 | 22 |

Currently maintained By:

23 | 24 |  ros-autom team - Greece
25 |  @www.github.com/ros-autom
26 |
27 |
28 | 29 |

Originally developed by:

30 | 31 |  Michael Brunson
32 |  Kenneth Spear
33 |  Nathaniel Stone
34 |  Cam Stewart
35 |  Zipporah Lighty
36 |
37 |
38 |

Open Source Dependencies:

39 | 40 |  Gson
41 |  ROS
42 |  rosjava
43 |  osmdroid (OpenStreetMap)
44 |  osmbonuspack
45 |  ShowcaseView
46 |
47 |
48 | 49 | 50 | -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 15 | 16 | 23 | 24 | 32 | 33 | 36 | 37 | 40 | 41 | 44 | -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/java/com/robotca/ControlApp/Core/ControlMode.java: -------------------------------------------------------------------------------- 1 | package com.robotca.ControlApp.Core; 2 | 3 | import android.preference.PreferenceManager; 4 | 5 | import com.robotca.ControlApp.ControlApp; 6 | import com.robotca.ControlApp.Core.Plans.RandomWalkPlan; 7 | import com.robotca.ControlApp.Core.Plans.RobotPlan; 8 | import com.robotca.ControlApp.Core.Plans.SimpleWaypointPlan; 9 | import com.robotca.ControlApp.Core.Plans.WaypointPlan; 10 | 11 | /** 12 | * Enum for different ways to control the Robot. 13 | * 14 | * Created by Michael Brunson on 2/12/16. 15 | */ 16 | public enum ControlMode { 17 | Joystick (true), // Joystick control 18 | Tilt (true), // Tilt sensor control 19 | SimpleWaypoint (false), // SimpleWaypoint control 20 | Waypoint (false), // Potential field waypoint control 21 | RandomWalk (false); // Random walk 22 | 23 | // Whether the user directly controls the Robot in this mode 24 | public final boolean USER_CONTROLLED; 25 | 26 | /** 27 | * Creates a ControlMode. 28 | * @param userControlled Whether the user controls the Robot directly in this mode. 29 | */ 30 | ControlMode(boolean userControlled) 31 | { 32 | USER_CONTROLLED = userControlled; 33 | } 34 | 35 | /** 36 | * Creates a RobotPlan for the specified ControlMode if one exists. 37 | * @param controlApp The ControlApp 38 | * @param controlMode The ControlMode 39 | * @return A RobotPlan for the ControlMode or null if none exists 40 | */ 41 | public static RobotPlan getRobotPlan(ControlApp controlApp, ControlMode controlMode) { 42 | 43 | RobotPlan plan; 44 | 45 | switch (controlMode) { 46 | 47 | case SimpleWaypoint: plan = new SimpleWaypointPlan(controlApp); break; 48 | case Waypoint: plan = new WaypointPlan(controlApp); break; 49 | case RandomWalk: plan = new RandomWalkPlan( 50 | Float.parseFloat(PreferenceManager 51 | .getDefaultSharedPreferences(controlApp) 52 | .getString("edittext_random_walk_range_proximity", "1"))); 53 | break; 54 | default: plan = null; break; 55 | } 56 | 57 | return plan; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/android_foo/package.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | android_foo 4 | 0.1.0 5 | The android_foo package 6 | 7 | 8 | 9 | 10 | mike 11 | 12 | 13 | 14 | 15 | 16 | Apache 2.0 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | catkin 43 | android_core 44 | rosjava_build_tools 45 | rosjava_core 46 | std_msgs 47 | testing 48 | 49 | 50 | 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/raw/faq.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |

 FAQ

6 | 7 |

These are just a few questions that may come up as you're using the app based on common and sometimes recurring issues.

8 | 9 |
10 | 11 |

Why can't I connect to the robot?

12 |

While this seems like a simple question, there are a variety of reasons for why you can't connect. Check all possibilities below before making further inquiries.

13 | 14 |
Are you connected to the correct Wi-Fi?
15 |

This should be relatively easy to check. Make sure that your device and your computer are connected to the same network. Otherwise you will not be able to connect to the robot.

16 | 17 |
Do you have the correct IP address?
18 |

Make sure that you are inputting the IP address of the ROS_IP environment variable if connecting to a simulator, or the IP address of the robot if connecting to a robot.

19 | 20 |
Did you input the Master URI properly?
21 |

The only thing that you should remove is "localhost". That should be replaced with the IP address. (i.e. 132.45.531.5)

22 | 23 |
Do you have the newest version of the app?
24 |

This may seem unnecessary but it could be important. It won't hurt at all to update to the newest version!

25 | 26 |
27 | 28 |

Why can't I see a view?

29 |

If one of the views is not drawing this could indicate that you are not receiving messages for the topic associated with the view. Check your robot and make sure it is publishing messages to all the required topics.

30 | 31 |

Why are the Waypoints not drawing in correct relation to the Robot?

32 |

Any problems with drawing the Waypoints on the Laser Scan screen are most likely caused by issues receiving Odometry messages from the Robot. Make sure you have a strong connection to the Robot and that it is publishing Odometry messages.

33 | 34 |
35 | 36 |

In general, problems are most commonly related to having a weak connection to the Robot or not receiving messages for one of the required topics.

37 | 38 |
39 | -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/layout/main.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 12 | 13 | 16 | 17 | 21 | 22 | 28 | 29 | 38 | 39 | 40 | 41 | 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/layout-land/main.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 14 | 15 | 18 | 19 | 23 | 29 | 38 | 39 | 40 | 41 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/layout/robot_info_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 15 | 16 | 21 | 22 | 28 | 29 | 34 | 35 | 40 | 46 | 47 | 52 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/layout/robot_chooser.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | 11 | 16 | 17 | 25 | 26 | 30 | 31 | 37 | 38 | 48 | 49 | 50 | 51 | 52 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/java/com/robotca/ControlApp/Core/Plans/RandomWalkPlan.java: -------------------------------------------------------------------------------- 1 | package com.robotca.ControlApp.Core.Plans; 2 | 3 | import com.robotca.ControlApp.Core.ControlMode; 4 | import com.robotca.ControlApp.Core.RobotController; 5 | 6 | import java.util.Random; 7 | 8 | import sensor_msgs.LaserScan; 9 | 10 | /** 11 | * Simple bump and turn motion plan. 12 | * 13 | * Created by Michael Brunson on 2/13/16. 14 | */ 15 | public class RandomWalkPlan extends RobotPlan { 16 | 17 | private final Random random; 18 | private float minRange; 19 | 20 | /** 21 | * Creates a RandomWalkPlan with the specified minimum range. 22 | * @param minRange The minimum range 23 | */ 24 | public RandomWalkPlan(float minRange) { 25 | this.minRange = Math.max(minRange, 0.2f); 26 | random = new Random(); 27 | } 28 | 29 | /** 30 | * @return The ControlMode for this RobotPlan 31 | */ 32 | @Override 33 | public ControlMode getControlMode() { 34 | return ControlMode.RandomWalk; 35 | } 36 | 37 | @Override 38 | public void start(final RobotController controller) throws Exception { 39 | // Laser scan data 40 | float[] ranges; 41 | // Temporary variables 42 | float shortestDistance, angle, angleDelta, angleIncrement; 43 | 44 | while(!isInterrupted()) { 45 | LaserScan laserScan = controller.getLaserScan(); 46 | 47 | ranges = laserScan.getRanges(); 48 | shortestDistance = ranges[ranges.length / 2]; 49 | angle = laserScan.getAngleMin(); 50 | angleDelta = (float) Math.toRadians(30); 51 | angleIncrement = laserScan.getAngleIncrement(); 52 | 53 | // Find the shortest range 54 | for (int i = 0; i < laserScan.getRanges().length; i++) { 55 | if (ranges[i] < shortestDistance && angle > -angleDelta && angle < angleDelta) { 56 | shortestDistance = ranges[i]; 57 | } 58 | 59 | angle += angleIncrement; 60 | } 61 | 62 | // If a wall is close, stop, turn a random amount, and continue moving 63 | if (shortestDistance < minRange) { 64 | controller.publishVelocity(0, 0, 0); 65 | waitFor(1000); 66 | 67 | long delay = (long) (2000 * (1 + random.nextFloat())); 68 | controller.publishVelocity(0, 0, .75); 69 | waitFor(delay); 70 | controller.publishVelocity(0, 0, 0); 71 | waitFor(1000); 72 | } else { 73 | controller.publishVelocity(.75, 0, 0); 74 | } 75 | } 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/java/com/robotca/ControlApp/Core/NavDrawerAdapter.java: -------------------------------------------------------------------------------- 1 | package com.robotca.ControlApp.Core; 2 | 3 | import android.app.Activity; 4 | import android.content.Context; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.ArrayAdapter; 9 | import android.widget.ImageView; 10 | import android.widget.TextView; 11 | 12 | import com.robotca.ControlApp.R; 13 | 14 | import java.util.List; 15 | 16 | /** 17 | * Adapter class for the NavDrawer. 18 | * 19 | * Created by Michael Brunson on 1/23/16. 20 | */ 21 | public class NavDrawerAdapter extends ArrayAdapter { 22 | 23 | Context context; 24 | List drawerItemList; 25 | int layoutResID; 26 | 27 | /** 28 | * Creates a NavDrawerAdapter. 29 | * @param context The Adapter's context 30 | * @param layoutResourceID The resource id of the layout 31 | * @param listItems The list of items for the NavDrawer 32 | */ 33 | public NavDrawerAdapter(Context context, int layoutResourceID, List listItems) { 34 | super(context, layoutResourceID, listItems); 35 | this.context = context; 36 | this.drawerItemList = listItems; 37 | this.layoutResID = layoutResourceID; 38 | } 39 | 40 | @Override 41 | public View getView(int position, View convertView, ViewGroup parent) { 42 | 43 | DrawerItemHolder drawerHolder; 44 | View view = convertView; 45 | 46 | // Create the view if it doesn't already exist 47 | if (view == null) { 48 | LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 49 | drawerHolder = new DrawerItemHolder(); 50 | 51 | view = inflater.inflate(layoutResID, parent, false); 52 | drawerHolder.ItemName = (TextView) view 53 | .findViewById(R.id.nav_drawer_item_text_view); 54 | drawerHolder.icon = (ImageView) view.findViewById(R.id.nav_drawer_item_image_view); 55 | 56 | view.setTag(drawerHolder); 57 | 58 | } else { 59 | drawerHolder = (DrawerItemHolder) view.getTag(); 60 | } 61 | 62 | // Initialize the selected DrawerItem 63 | DrawerItem dItem = this.drawerItemList.get(position); 64 | 65 | //noinspection deprecation // Minimum API level 66 | drawerHolder.icon.setImageDrawable(view.getResources().getDrawable(dItem.getImgResID())); 67 | 68 | drawerHolder.ItemName.setText(dItem.getItemName()); 69 | 70 | return view; 71 | } 72 | 73 | /* 74 | * Container class for a drawer item 75 | */ 76 | private static class DrawerItemHolder { 77 | TextView ItemName; 78 | ImageView icon; 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/java/com/robotca/ControlApp/Views/LaserScanView.java: -------------------------------------------------------------------------------- 1 | package com.robotca.ControlApp.Views; 2 | 3 | import android.content.Context; 4 | import android.graphics.PixelFormat; 5 | import android.opengl.GLSurfaceView; 6 | import android.util.AttributeSet; 7 | import android.util.Log; 8 | import android.view.MotionEvent; 9 | import android.view.SurfaceHolder; 10 | 11 | import com.robotca.ControlApp.ControlApp; 12 | import com.robotca.ControlApp.Layers.LaserScanRenderer; 13 | 14 | /** 15 | * Custom GLSurfaceView for rendering a LaserScanLayer. 16 | * 17 | * Created by Nathaniel Stone on 3/29/16. 18 | */ 19 | public class LaserScanView extends GLSurfaceView { 20 | 21 | private static final String TAG = "LaserScanView"; 22 | 23 | // The Renderer for this View 24 | private LaserScanRenderer laserScanRenderer; 25 | 26 | 27 | /** 28 | * Required Constructor. 29 | * @param context The parent context 30 | */ 31 | public LaserScanView(Context context) { 32 | super(context); 33 | 34 | if (!isInEditMode()) 35 | setRenderer(laserScanRenderer = new LaserScanRenderer((ControlApp) getContext())); 36 | } 37 | 38 | /** 39 | * Standard View constructor. 40 | */ 41 | public LaserScanView(Context context, AttributeSet attrs) { 42 | super(context, attrs); 43 | 44 | if (!isInEditMode()) 45 | setRenderer(laserScanRenderer = new LaserScanRenderer((ControlApp) getContext())); 46 | } 47 | 48 | /** 49 | * @return The renderer for this view 50 | */ 51 | public LaserScanRenderer getLaserScanRenderer() { 52 | return laserScanRenderer; 53 | } 54 | 55 | @Override 56 | public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) 57 | { 58 | super.surfaceChanged(holder, format, w, h); 59 | 60 | Log.d(TAG, "surfaceChanged(" + format + ", " + w + ", " + h + ")"); 61 | 62 | ((ControlApp)getContext()).getRobotController().addLaserScanListener(laserScanRenderer); 63 | } 64 | 65 | @Override 66 | public void surfaceCreated(SurfaceHolder holder) { 67 | super.surfaceCreated(holder); 68 | 69 | getHolder().setFormat(PixelFormat.TRANSLUCENT); 70 | 71 | Log.d(TAG, "surfaceCreated(" + holder + ")"); 72 | } 73 | 74 | @Override 75 | public void surfaceDestroyed(SurfaceHolder holder) { 76 | super.surfaceDestroyed(holder); 77 | 78 | Log.d(TAG, "surfaceDestroyed(" + holder + ")"); 79 | 80 | ((ControlApp)getContext()).getRobotController().removeLaserScanListener(laserScanRenderer); 81 | } 82 | 83 | @Override 84 | public boolean onTouchEvent(MotionEvent e) { 85 | return laserScanRenderer.onTouchEvent(e); 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /src/android_foo/gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /src/android_foo/control_app/gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /src/android_foo/build.gradle: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2014 Mike 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | task wrapper(type: Wrapper) { 18 | gradleVersion = '2.2.3' 19 | } 20 | 21 | buildscript { 22 | 23 | apply from: "https://github.com/rosjava/android_core/raw/kinetic/buildscript.gradle" 24 | dependencies { 25 | //Add this to fix the gradle plugin issues 26 | classpath 'com.android.tools.build:gradle:1.5.0' 27 | 28 | // TEST 29 | classpath 'junit:junit:4.12' 30 | classpath 'org.mockito:mockito-core:1.10.19' 31 | } 32 | } 33 | 34 | apply plugin: 'catkin' 35 | 36 | 37 | allprojects { 38 | /* A github url provides a good standard unique name for your project */ 39 | group 'com.github.sccapstone.robotca' 40 | //version = project.catkin.pkg.version 41 | } 42 | 43 | subprojects { 44 | /* 45 | * The android plugin configures a few things: 46 | * 47 | * - local deployment repository : where it dumps the jars and packaged artifacts) 48 | * - local maven repositories : where it finds your locally installed/built artifacts) 49 | * - external maven repositories : where it goes looking if it can't find dependencies locally 50 | * - android build tools version : which version we use across the board 51 | * 52 | * To modify, or add repos to the default external maven repositories list, pull request against this code: 53 | * 54 | * https://github.com/rosjava/rosjava_bootstrap/blob/indigo/gradle_plugins/src/main/groovy/org/ros/gradle_plugins/RosPlugin.groovy#L31 55 | * 56 | * To modify the build tools version, pull request against this code: 57 | * 58 | * https://github.com/rosjava/rosjava_bootstrap/blob/indigo/gradle_plugins/src/main/groovy/org/ros/gradle_plugins/RosAndroid.groovy#L14 59 | */ 60 | apply plugin: 'ros-android' 61 | 62 | afterEvaluate { project -> 63 | android { 64 | // Exclude a few files that are duplicated across our dependencies and 65 | // prevent packaging Android applications. 66 | packagingOptions { 67 | exclude "META-INF/LICENSE.txt" 68 | exclude "META-INF/NOTICE.txt" 69 | } 70 | } 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /devel/setup.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | # generated from catkin/cmake/template/setup.sh.in 3 | 4 | # Sets various environment variables and sources additional environment hooks. 5 | # It tries it's best to undo changes from a previously sourced setup file before. 6 | # Supported command line options: 7 | # --extend: skips the undoing of changes from a previously sourced setup file 8 | 9 | # since this file is sourced either use the provided _CATKIN_SETUP_DIR 10 | # or fall back to the destination set at configure time 11 | : ${_CATKIN_SETUP_DIR:=/home/mike/rosjava/catkin_ws_android/devel} 12 | _SETUP_UTIL="$_CATKIN_SETUP_DIR/_setup_util.py" 13 | unset _CATKIN_SETUP_DIR 14 | 15 | if [ ! -f "$_SETUP_UTIL" ]; then 16 | echo "Missing Python script: $_SETUP_UTIL" 17 | return 22 18 | fi 19 | 20 | # detect if running on Darwin platform 21 | _UNAME=`uname -s` 22 | _IS_DARWIN=0 23 | if [ "$_UNAME" = "Darwin" ]; then 24 | _IS_DARWIN=1 25 | fi 26 | unset _UNAME 27 | 28 | # make sure to export all environment variables 29 | export CMAKE_PREFIX_PATH 30 | export CPATH 31 | if [ $_IS_DARWIN -eq 0 ]; then 32 | export LD_LIBRARY_PATH 33 | else 34 | export DYLD_LIBRARY_PATH 35 | fi 36 | unset _IS_DARWIN 37 | export PATH 38 | export PKG_CONFIG_PATH 39 | export PYTHONPATH 40 | 41 | # remember type of shell if not already set 42 | if [ -z "$CATKIN_SHELL" ]; then 43 | CATKIN_SHELL=sh 44 | fi 45 | 46 | # invoke Python script to generate necessary exports of environment variables 47 | # use TMPDIR if it exists, otherwise fall back to /tmp 48 | if [ -d "${TMPDIR}" ]; then 49 | _TMPDIR="${TMPDIR}" 50 | else 51 | _TMPDIR=/tmp 52 | fi 53 | _SETUP_TMP=`mktemp "${_TMPDIR}/setup.sh.XXXXXXXXXX"` 54 | unset _TMPDIR 55 | if [ $? -ne 0 -o ! -f "$_SETUP_TMP" ]; then 56 | echo "Could not create temporary file: $_SETUP_TMP" 57 | return 1 58 | fi 59 | CATKIN_SHELL=$CATKIN_SHELL "$_SETUP_UTIL" $@ >> "$_SETUP_TMP" 60 | _RC=$? 61 | if [ $_RC -ne 0 ]; then 62 | if [ $_RC -eq 2 ]; then 63 | echo "Could not write the output of '$_SETUP_UTIL' to temporary file '$_SETUP_TMP': may be the disk if full?" 64 | else 65 | echo "Failed to run '\"$_SETUP_UTIL\" $@': return code $_RC" 66 | fi 67 | unset _RC 68 | unset _SETUP_UTIL 69 | rm -f "$_SETUP_TMP" 70 | unset _SETUP_TMP 71 | return 1 72 | fi 73 | unset _RC 74 | unset _SETUP_UTIL 75 | . "$_SETUP_TMP" 76 | rm -f "$_SETUP_TMP" 77 | unset _SETUP_TMP 78 | 79 | # source all environment hooks 80 | _i=0 81 | while [ $_i -lt $_CATKIN_ENVIRONMENT_HOOKS_COUNT ]; do 82 | eval _envfile=\$_CATKIN_ENVIRONMENT_HOOKS_$_i 83 | unset _CATKIN_ENVIRONMENT_HOOKS_$_i 84 | eval _envfile_workspace=\$_CATKIN_ENVIRONMENT_HOOKS_${_i}_WORKSPACE 85 | unset _CATKIN_ENVIRONMENT_HOOKS_${_i}_WORKSPACE 86 | # set workspace for environment hook 87 | CATKIN_ENV_HOOK_WORKSPACE=$_envfile_workspace 88 | . "$_envfile" 89 | unset CATKIN_ENV_HOOK_WORKSPACE 90 | _i=$((_i + 1)) 91 | done 92 | unset _i 93 | 94 | unset _CATKIN_ENVIRONMENT_HOOKS_COUNT 95 | -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/raw/using.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |

 Using

6 | 7 |

Once connected, a variety of screens and control modes can be chosen from to operate the robot.

8 | 9 |
10 | 11 |

Controlling the Robot

12 |

Several control schemes exist for moving the robot and can be selected by clicking the three dots on the top right of the screen on the menu bar.

13 | 14 |
Random Walk
15 |

In this mode, the robot drives until nearing an obstacle and then turns a random amount and continues driving.

16 | 17 |
Joystick Control
18 |

In this mode the robot can be controlled with the joystick on the bottom right of the screen.

19 | 20 |
Tilt Control
21 |

In this mode, on devices with accelerometers, the robot can be controlled by tilting the android device. Tilt forward or backwards to drive forward or reverse and left or right to turn. Tapping the joystick will recalibrate the tilt sensor.

22 | 23 |
Simple Waypoint Control
24 |

In this mode, the robot will follow the trail marked by the placed Waypoints. See the LaserScan view for placing and viewing Waypoints.

25 | 26 |
Waypoint Control
27 |

Similar to Simple Waypoint Control, in this mode the robot uses a potential field calculated from it's laser scanner to navigate around obstacles.

28 | 29 |
30 | 31 |

Navigation Drawer Views

32 |

Once connected to the robot, the navigation drawer on the left can be opened to choose from the following screens:

33 | 34 |
The Overview screen
35 | 36 |

The Overview screen contains both the Camera screen and the LaserScan screen.

37 | 38 |
The Camera screen
39 | 40 |

The Camera screen shows the view from the robot's camera.

41 | 42 |
The LaserScan screen
43 | 44 |

The LaserScan screen option shows obstacles sensed by the robot's laser scanner. The blue arrow indicates the robot's current direction in relation to the scan data.

45 |

This screen also shows the current Waypoint trail used by the various Waypoint control modes. Waypoints can be dropped or deleted with a double tap and moved by selecting them via a long press. Dropping a Waypoint on the existing trail will insert it into the trail.

46 | 47 |
The Map screen
48 | 49 |

The Map screen shows both the robot's and android device's GPS position on the map.

50 | 51 |
Preferences
52 | 53 |

The Preferences allows you to edit a variety of settings including the ROS topics you are connected to and warning options.

54 |
55 | -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/java/com/robotca/ControlApp/SplashActivity.java: -------------------------------------------------------------------------------- 1 | package com.robotca.ControlApp; 2 | 3 | import android.app.Activity; 4 | import android.app.AlertDialog; 5 | import android.content.Intent; 6 | import android.net.Uri; 7 | import android.os.Build; 8 | import android.os.Bundle; 9 | import android.provider.Settings; 10 | import android.util.Log; 11 | 12 | /** 13 | * Simple splash screen. 14 | */ 15 | public class SplashActivity extends Activity { 16 | 17 | // Log tag String 18 | private static final String TAG = "SplashActivity"; 19 | 20 | // Request code for Overlay permissions 21 | // private static final int OVERLAY_REQUEST_CODE = 0xABCD1234; 22 | 23 | @Override 24 | protected void onCreate(Bundle savedInstanceState) { 25 | super.onCreate(savedInstanceState); 26 | 27 | //checkDrawOverlayPermission(); 28 | 29 | goToNextActivity(500L); 30 | } 31 | 32 | 33 | /** 34 | * Checks for draw overlay permissions. Required on higher levels of Android. 35 | */ 36 | /** 37 | public void checkDrawOverlayPermission() { 38 | 39 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 40 | if (!Settings.canDrawOverlays(this)) { 41 | Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, 42 | Uri.parse("package:" + getPackageName())); 43 | startActivityForResult(intent, OVERLAY_REQUEST_CODE); 44 | } else { 45 | goToNextActivity(2000L); 46 | } 47 | } 48 | else { 49 | goToNextActivity(2000L); 50 | } 51 | } 52 | */ 53 | /** 54 | * Callback for when the user has to grant overlay permissions. This only happens on high android version. 55 | */ 56 | 57 | /** 58 | @Override 59 | protected void onActivityResult(int requestCode, int resultCode, Intent data) { 60 | 61 | if (requestCode == OVERLAY_REQUEST_CODE) { 62 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 63 | 64 | // If this permission is not granted, the app will crash because of something 65 | // ROS implements so we'll just cleanly close the app here 66 | if (!Settings.canDrawOverlays(this)) { 67 | 68 | AlertDialog.Builder builder = new AlertDialog.Builder(this); 69 | builder.setTitle("Permission Required!").setMessage("The app needs this permission " + 70 | "to run, it will now be closed.").create().show(); 71 | finish(); 72 | } else { 73 | goToNextActivity(100L); 74 | } 75 | } else { 76 | goToNextActivity(100L); 77 | } 78 | } 79 | } 80 | */ 81 | 82 | /* 83 | * Moves to the next Activity after the specified delay. 84 | */ 85 | private void goToNextActivity(long delay) 86 | { 87 | Intent intent = new Intent(this, RobotChooser.class); 88 | try { 89 | Thread.sleep(delay, 0); 90 | } catch (InterruptedException e) { 91 | Log.e(TAG, "", e); 92 | } 93 | startActivity(intent); 94 | finish(); 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /Release.key: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP PUBLIC KEY BLOCK----- 2 | 3 | mQINBFZSdWIBEADMN3A3XcP4JWX6ppu1K74gqHCL2QK4F2wZHlckL1UsT2PaxgO4 4 | TuWdAWiqKiImjJfwntBltWNFJrO2zBcKzRUBa++20KL9ox5xWwIUhHBs9Flwm7VS 5 | ZRzHGvqjXrX/84TF62xWOKqqsMwCzoA0Os5rAjPEu20khq1uC6l3H/druxFSyJCl 6 | ADfpyzTRLn8RkN6e2dvUeKRC0MbAibJ/HlFTBR2cH9we6O++0d44HhCuz4AQ73Pn 7 | conGKClvwctdTV5e41pRnBL7za8Y1DuH4rzsbUkLRpIv95GLNwN6333chXY8W/9U 8 | xKm23gLg+6qy6b0UeJbPFrMotO77WfIq4hQmV49Ak1NPEmh0LU/JCEr0lnTHjHN9 9 | xYg/q+jrUdHPjOVZMC0aKEjvlLc5OvJK3NJmG/PPuBqVQ4ijOallqv1LKByav/Fo 10 | IK6W5k+8sRMaLOzP8bYNMvIfDMTQi4xFebY50lUfiNs5CUH4ddOn8l3nIeuM4bAF 11 | crcEo4vwLVpwaVUP1myoHc/1AOlVq0o/fe5Amrrkw5citOG9cGdyQ1PLJUqq7m3O 12 | xegKEiuF7OONS75eTBDKxlKzgLoGoeLVgrhWF1rcPw9IGPI1Kbe614/Rvmlzbglg 13 | BYZ0kxLiMPDEvaT2Gu1QylwPDIwu980tNikFYso6M1i9zmL/f/uJ0aup8wARAQAB 14 | tDtTZWJhc3RpYW4gTGFja25lciAoV2luZUhRIHBhY2thZ2VzKSA8c2ViYXN0aWFu 15 | QGZkcy10ZWFtLmRlPokCPgQTAQIAKAUCVlJ1YgIbAwUJEswDAAYLCQgHAwIGFQgC 16 | CQoLBBYCAwECHgECF4AACgkQgYpDXF/L9UpTTBAAx0ge30P0ojHrx2eRYVVQRsG9 17 | nzlnEW/KmdlO7p880K0/Df3pdr7+E06ZlZW1J2vqobqYvxvraarvYP19LsA9tfi/ 18 | YYrHxnLvg8DZPCjM0lf2ixImzrSACnYZ4JN133FeT5JLURjgSUwKbF1U9cbUawRX 19 | e56zjBq9gtWsPY/0OYKDhcSWzBvrjryCccwtSiuhj7ZBapVtco0nNt/eHI9QyTPB 20 | g8XB+GPmk1cw14GTq5IhgNGaWiWb10oaRqGkixwk5xhH4wlKpcXS/LEj+iekM1oj 21 | CxEIcAMINPyIkaSqdK6M0ZBJ4x2RsNp+36FmLJHjbjSGGkpKEHxQNF6bDhk+S69K 22 | Y3FsHtkho1e7kkmSKDPTAwe2DzD6Ez8ENmD9XrBWCsxu7rdgIOVWr8HSpkeal/rf 23 | dn4cudpne7J+zu3SiNKy8PHR4uTN1RzcrH7UT/i/qpDBzRTzKjRduvbp3PpOqWEh 24 | JW4ECY40v4MvA+YbyeWtMAQGD/oU5dxfLS5zKZ5RbDDKTmGT5pNdZgSgD/QGjSJY 25 | J4KM6+uqJkrX+FXlHbddHyCFLqKjAk4nBgNRltjWEMfGPbCqpJnViZXnaaRZ4UAl 26 | PleLqIfmYE0GqzA7YlX/HGltBNUjQmMVD9apowDBg+2+jqX3sevzlfZxcbiykSlo 27 | UIx+7aLJQzGP+F3Zt5G5Ag0EVlJ1YgEQAL/NLpriuWhyHLZMhMvw1gSZporEvpfE 28 | gLKFIK9LK7Htb5VjfnrkWxXDB5CmA9sLEQFaWgoLNtwRl8JuMPGkpAOdG2E82V9k 29 | oCAnZCz3QljVmYwnpgygFlVEpGQMLuqVREwZ/5d5ZFyMRUHIfVCS91MI5ZALQUpj 30 | A5W7/BhaGJRxqWg/nMpgeA/qPeaDN+RmTkmMVKYxWJ2Xbb1cJRfIP30c99ALhQDl 31 | LIRps7aZ8TO4MDWjMF8y7ivPlHY17FpA1GAWM7TuQbEDx7kjC/7DRd4+60DGjbsv 32 | vzyDqFiGSqZjYTm5yoEhiOVR4uznkOYralhT1C5wEVFaB0r0Iz/MazWiHGJv0Ltv 33 | ioZhVcDckyms6jkFv5WmLZA56UM78aHSDMOEsYqcnG/PjZjx0GxdxIkXopW/qsu8 34 | pbrOzJvLwBw/ybK58qhrHXfGcddMK0053cXlwqZbR/o7qCS7VMeWOq7WvqEeFbzI 35 | 6DbJjvsqZs0g1ctY5f8ZjNmFFSAJ+GBqpr3WSfxQu4mtB/jI/P9CsQA08q1bXoHB 36 | Q8/Sk7piczow2YasKM2PFtMUiAxrc+ZNx/HcHSeb2c0DGto3Q1JX8m2R9yhwTZbL 37 | /kJJMYNkB1vlacdR9UQcLy8PjPFVz7q8HFt/Y57g2LRiLVmOPIzu72eyrFNko6tX 38 | aGgXzNVgCpXVABEBAAGJAiQEGAECAA8FAlZSdWICGwwFCRLMAwAACgkQgYpDXF/L 39 | 9UoXXw/3e2+6ZPrhy+7hlbHM9rbAhSg2dsAZAKZ3Yu5HWJ0qH/FxH4f5ysqfFQsD 40 | V5x9mQV0en9JMnkYJSq/uUMIi0DqUzFWd7cLwbJOLzI6jJJaZvoNn+WkexqORR0e 41 | qxD7Q3UVKpJf4E9LTVxAkmHQ9A+PSYGW7QlyqvQX8z6mOEHYdkNTsVGHYCPd+p5D 42 | j82p2JXbK13PhHXJBYD2VxzyChevKB5h9WwUzQJj4siIb0tNCCgHFwEIMSR0wnPB 43 | zIbzdXxYXssHyzRBwVkkmusm2lCX4jy3NfJjEicmaxBP+w9GdKAxGNHJgBpKQ2Do 44 | llOgPXHI96QvcZqFS2vH5y34i7ZHr4hUaemX+bBUDQordaclJfHS3ZImJ2sJP4tP 45 | cdPUkw9OwTsuWLq8NXMkphIAl6wBN9H6t3qKQo7x8ylLlKVbZD/bTpf3hy5Y7GIk 46 | 5G/3Mui04VsCnJs/+eIZgY33DudOYzE4S9Lv3Nh1YZnMAHssmFGroEabFkrVdFpV 47 | /0CJGi/TCHigoDt0yOR7ucDaQku3T7LJAPCYD8I+nZf3vdO/m0+M8HOWpIUfwQN9 48 | gvF0Vp47psf3BlNBlVS1Q1VWvb3edFSeeLI42XccMFYhfpr7+0wWgb+5vzi+PR+x 49 | WPVDQKjClup8fzJAr80k18/PILIHFPDufhrAG1mZXhNylixz8A== 50 | =53Sn 51 | -----END PGP PUBLIC KEY BLOCK----- 52 | -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/java/com/robotca/ControlApp/Fragments/CameraViewFragment.java: -------------------------------------------------------------------------------- 1 | package com.robotca.ControlApp.Fragments; 2 | 3 | import android.annotation.SuppressLint; 4 | import android.os.Bundle; 5 | import android.preference.PreferenceManager; 6 | import android.support.annotation.Nullable; 7 | import android.view.LayoutInflater; 8 | import android.view.View; 9 | import android.view.ViewGroup; 10 | import android.widget.TextView; 11 | 12 | import com.robotca.ControlApp.ControlApp; 13 | import com.robotca.ControlApp.Core.RobotController; 14 | import com.robotca.ControlApp.R; 15 | 16 | import org.ros.android.BitmapFromCompressedImage; 17 | import org.ros.android.view.RosImageView; 18 | import org.ros.message.MessageListener; 19 | 20 | import sensor_msgs.CompressedImage; 21 | 22 | /** 23 | * Fragment for showing the view from the Robot's camera. 24 | * 25 | * Created by Michael Brunson on 11/7/15. 26 | */ 27 | public class CameraViewFragment extends RosFragment { 28 | 29 | private RosImageView cameraView; 30 | private TextView noCameraTextView; 31 | private RobotController controller; 32 | 33 | /** 34 | * Default Constructor. 35 | */ 36 | public CameraViewFragment(){} 37 | 38 | @Nullable 39 | @Override 40 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 41 | 42 | @SuppressLint("InflateParams") View view = inflater.inflate(R.layout.fragment_camera_view, null); 43 | noCameraTextView = (TextView)view.findViewById(R.id.noCameraTextView); 44 | //noinspection unchecked 45 | cameraView = (RosImageView) view.findViewById(R.id.camera_fragment_camera_view); 46 | 47 | cameraView.setTopicName(PreferenceManager.getDefaultSharedPreferences(getActivity()).getString("edittext_camera_topic", getString(R.string.camera_topic))); 48 | cameraView.setMessageType(CompressedImage._TYPE); 49 | cameraView.setMessageToBitmapCallable(new BitmapFromCompressedImage()); 50 | 51 | try { 52 | controller = ((ControlApp) getActivity()).getRobotController(); 53 | } 54 | catch(Exception ignore){ 55 | } 56 | 57 | // Create a message listener for getting camera data 58 | if(controller != null){ 59 | controller.setCameraMessageReceivedListener(new MessageListener() { 60 | @Override 61 | public void onNewMessage(CompressedImage compressedImage) { 62 | if (compressedImage != null) { 63 | controller.setCameraMessageReceivedListener(null); 64 | getActivity().runOnUiThread(new Runnable() { 65 | @Override 66 | public void run() { 67 | noCameraTextView.setVisibility(View.GONE); 68 | } 69 | }); 70 | } 71 | } 72 | }); 73 | } 74 | 75 | if (nodeConfiguration != null) 76 | nodeMainExecutor.execute(cameraView, nodeConfiguration.setNodeName("android/fragment_camera_view")); 77 | 78 | return view; 79 | } 80 | 81 | @Override 82 | void shutdown() { 83 | nodeMainExecutor.shutdownNodeMain(cameraView); 84 | } 85 | } -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 41 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 63 | 68 | 69 | 70 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/java/com/robotca/ControlApp/Dialogs/ConfirmDeleteDialogFragment.java: -------------------------------------------------------------------------------- 1 | package com.robotca.ControlApp.Dialogs; 2 | 3 | import android.app.Activity; 4 | import android.app.Dialog; 5 | import android.content.DialogInterface; 6 | import android.os.Bundle; 7 | import android.support.annotation.NonNull; 8 | import android.support.v4.app.DialogFragment; 9 | import android.support.v7.app.AlertDialog; 10 | 11 | import com.robotca.ControlApp.R; 12 | 13 | /** 14 | * Dialog for requesting confirmation before deleting a RobotInfo. 15 | * 16 | * Created by Michael Brunson on 1/23/16. 17 | */ 18 | public class ConfirmDeleteDialogFragment extends DialogFragment { 19 | 20 | /** Bundle key for the name of the Robot being deleted */ 21 | public static final String NAME_KEY = "DELETE_ITEM_NAME_KEY"; 22 | /** Bundle key for the position of the RobotItem being deleted */ 23 | public static final String POSITION_KEY = "DELETE_ITEM_POSITION_KEY"; 24 | 25 | private DialogListener mListener; 26 | private String mItemName; 27 | private int mPosition; 28 | 29 | @Override 30 | public void setArguments(Bundle args) { 31 | super.setArguments(args); 32 | mItemName = args.getString(NAME_KEY, ""); 33 | mPosition = args.getInt(POSITION_KEY, -1); 34 | } 35 | 36 | // Override the Fragment.onAttach() method to instantiate the DialogListener 37 | @Override 38 | public void onAttach(Activity activity) { 39 | super.onAttach(activity); 40 | // Verify that the host activity implements the callback interface 41 | try { 42 | // Instantiate the DialogListener so we can send events to the host 43 | mListener = (DialogListener) activity; 44 | } catch (ClassCastException e) { 45 | // The activity doesn't implement the interface, throw exception 46 | //throw new ClassCastException(activity.toString() + " must implement DialogListener"); 47 | } 48 | } 49 | 50 | /** 51 | * Creates the Dialog. 52 | */ 53 | @NonNull 54 | @Override 55 | public Dialog onCreateDialog(Bundle savedInstanceState) { 56 | AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 57 | 58 | builder.setTitle(R.string.delete) 59 | .setMessage("Delete: " + "'" + mItemName + "'" + "?") 60 | .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { 61 | @Override 62 | public void onClick(DialogInterface dialog, int which) { 63 | // Notify the listener 64 | mListener.onConfirmDeleteDialogPositiveClick(mPosition, mItemName); 65 | dialog.dismiss(); 66 | } 67 | }) 68 | .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { 69 | @Override 70 | public void onClick(DialogInterface dialog, int which) { 71 | // Notify the listener 72 | mListener.onConfirmDeleteDialogNegativeClick(); 73 | dialog.cancel(); 74 | } 75 | }); 76 | 77 | return builder.create(); 78 | } 79 | 80 | /** 81 | * Interface for Objects that need to be notified of the result of the user's action on the Dialog. 82 | */ 83 | public interface DialogListener { 84 | void onConfirmDeleteDialogPositiveClick(int position, String name); 85 | void onConfirmDeleteDialogNegativeClick(); 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/java/com/robotca/ControlApp/Fragments/OverviewFragment.java: -------------------------------------------------------------------------------- 1 | package com.robotca.ControlApp.Fragments; 2 | 3 | import android.os.Bundle; 4 | import android.preference.PreferenceManager; 5 | import android.support.annotation.Nullable; 6 | import android.util.Log; 7 | import android.view.LayoutInflater; 8 | import android.view.View; 9 | import android.view.ViewGroup; 10 | import android.widget.TextView; 11 | 12 | import com.robotca.ControlApp.ControlApp; 13 | import com.robotca.ControlApp.Core.RobotController; 14 | import com.robotca.ControlApp.R; 15 | 16 | import org.ros.android.BitmapFromCompressedImage; 17 | import org.ros.android.view.RosImageView; 18 | import org.ros.message.MessageListener; 19 | 20 | import sensor_msgs.CompressedImage; 21 | 22 | /** 23 | * Fragment containing a CameraView and a LaserScanView. 24 | * 25 | * Created by Michael Brunson on 11/7/15. 26 | */ 27 | public class OverviewFragment extends RosFragment { 28 | 29 | private View view; 30 | private TextView noCameraTextView; 31 | private RosImageView cameraView; 32 | private RobotController controller; 33 | 34 | @SuppressWarnings("unused") 35 | private static final String TAG = "OverviewFragment"; 36 | 37 | public OverviewFragment(){} 38 | 39 | @Nullable 40 | @Override 41 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 42 | 43 | if (view == null) 44 | { 45 | view = inflater.inflate(R.layout.fragment_overview, container, false); 46 | noCameraTextView = (TextView)view.findViewById(R.id.noCameraTextView); 47 | 48 | LaserScanFragment laserScanFragment = new LaserScanFragment(); 49 | getFragmentManager().beginTransaction().replace( 50 | R.id.laser_scan_placeholder, laserScanFragment).commit(); 51 | 52 | //noinspection unchecked 53 | cameraView = (RosImageView) view.findViewById(R.id.camera_view); 54 | cameraView.setTopicName(PreferenceManager.getDefaultSharedPreferences(getActivity()).getString("edittext_camera_topic", getString(R.string.camera_topic))); 55 | cameraView.setMessageType(CompressedImage._TYPE); 56 | cameraView.setMessageToBitmapCallable(new BitmapFromCompressedImage()); 57 | 58 | 59 | try { 60 | controller = ((ControlApp) getActivity()).getRobotController(); 61 | } 62 | catch(Exception ignore){ 63 | 64 | } 65 | 66 | if(controller != null){ 67 | controller.setCameraMessageReceivedListener(new MessageListener() { 68 | @Override 69 | public void onNewMessage(CompressedImage compressedImage) { 70 | if (compressedImage != null) { 71 | controller.setCameraMessageReceivedListener(null); 72 | getActivity().runOnUiThread(new Runnable() { 73 | @Override 74 | public void run() { 75 | noCameraTextView.setVisibility(View.GONE); 76 | } 77 | }); 78 | } 79 | } 80 | }); 81 | } 82 | } 83 | 84 | if (isInitialized()) { 85 | nodeMainExecutor.execute(cameraView, nodeConfiguration.setNodeName("android/camera_view")); 86 | } 87 | 88 | return view; 89 | } 90 | 91 | @Override 92 | public void shutdown(){ 93 | 94 | if (isInitialized()) { 95 | nodeMainExecutor.shutdownNodeMain(cameraView); 96 | } 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/java/com/robotca/ControlApp/Core/Plans/SimpleWaypointPlan.java: -------------------------------------------------------------------------------- 1 | package com.robotca.ControlApp.Core.Plans; 2 | 3 | import android.util.Log; 4 | 5 | import com.robotca.ControlApp.ControlApp; 6 | import com.robotca.ControlApp.Core.ControlMode; 7 | import com.robotca.ControlApp.Core.RobotController; 8 | import com.robotca.ControlApp.Core.Utils; 9 | import com.robotca.ControlApp.Fragments.HUDFragment; 10 | 11 | import org.ros.rosjava_geometry.Vector3; 12 | 13 | /** 14 | * Rudimentary waypoint plan for testing. No collision detection, just moves towards the next waypoint. 15 | * 16 | * Created by Nathaniel Stone on 3/4/16. 17 | */ 18 | public class SimpleWaypointPlan extends RobotPlan { 19 | 20 | private static final double MINIMUM_DISTANCE = 1.0; 21 | private final ControlApp controlApp; 22 | 23 | private static final String TAG = "SimpleWaypointPlan"; 24 | 25 | private static final double MAX_SPEED = 0.75; 26 | 27 | /** 28 | * Creates a SimpleWaypointPlan for the specified ControlApp. 29 | * @param controlApp The ControlApp 30 | */ 31 | public SimpleWaypointPlan (ControlApp controlApp) { 32 | this.controlApp = controlApp; 33 | } 34 | 35 | /** 36 | * @return The ControlMode for this RobotPlan 37 | */ 38 | @Override 39 | public ControlMode getControlMode() { 40 | return ControlMode.SimpleWaypoint; 41 | } 42 | 43 | @Override 44 | protected void start(RobotController controller) throws Exception { 45 | 46 | Log.d(TAG, "Started"); 47 | 48 | Vector3 next; 49 | double dir, dist, spd; 50 | 51 | while (!isInterrupted()) { 52 | 53 | Log.d(TAG, "begin loop"); 54 | 55 | // Wait for the next point to become available 56 | while (controlApp.getDestination() == null) 57 | waitFor(1000L); 58 | 59 | next = controlApp.getDestination(); 60 | Log.d(TAG, "Found next point: (" + next.getX() + ", " + next.getY() + ")"); 61 | 62 | spd = 0.0; 63 | 64 | do { 65 | // Increment speed 66 | spd += MAX_SPEED / 15.0; 67 | if (spd > MAX_SPEED) 68 | spd = MAX_SPEED; 69 | 70 | // Check angle to target 71 | dir = Utils.pointDirection(RobotController.getX(), RobotController.getY(), next.getX(), next.getY()); 72 | dir = Utils.angleDifference(RobotController.getHeading(), dir); 73 | 74 | controller.publishVelocity(spd * Math.cos(dir), 0.0, spd * Math.sin(dir)); 75 | 76 | // Check distance to target 77 | dist = Utils.distance(RobotController.getX(), RobotController.getY(), next.getX(), next.getY()); 78 | 79 | } while (!isInterrupted() && dist > MINIMUM_DISTANCE && next.equals(controlApp.getDestination())); 80 | 81 | // Stop 82 | final int N = 15; 83 | for (int i = N - 1; i >= 0 && !isInterrupted(); --i) { 84 | 85 | // Check angle to target 86 | dir = Utils.pointDirection(RobotController.getX(), RobotController.getY(), next.getX(), next.getY()); 87 | dir = Utils.angleDifference(RobotController.getHeading(), dir) / 2.0; 88 | 89 | // Slow down 90 | controller.publishVelocity(spd * ((double)i / N) * Math.cos(dir), 0.0, spd * ((double)i / N) * Math.sin(dir)); 91 | waitFor(N); 92 | } 93 | 94 | // Remove the way point 95 | if (!isInterrupted() && next.equals(controlApp.getDestination())) 96 | controlApp.pollDestination(); 97 | } 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/raw/setup.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |

 Setup

6 | 7 |

There are two ways to set up the app to be able to connect to a robot. You can use a simulated robot, or a real robot.

8 | 9 |
10 | 11 |

Using a Simulated Robot

12 |

It is likely easier to access a simulated robot rather than a real one, so follow these steps to set up a simulation

13 | 14 |

Step 1: Installing Ubuntu 16.04.x or newer

15 |

Download a 32 or 64 bit Ubuntu iso, either will work, and install it on a physical computer or a virtual machine. The robot will move much much smoother if Ubuntu 14.04.3 is installed to a physical computer.

16 |

Note: If installing Ubuntu on a virtual machine, make sure that you use a Bridged Network Adapter and NOT a NAT adapter.

17 | 18 |

Step 2: Installing ROS Kinetic

19 |

Once you have Ubuntu installed, follow these instructions to install ROS Kinetic on your machine.

20 | http://wiki.ros.org/Kinetic/Installation/Ubuntu 21 | 22 |

Step 3: Installing the Husky Robot Simulator

23 |

To install the simulator open a terminal and run the command sudo apt-get install ros-kinetic-husky-simulator

24 | 25 |

Step 4: Setting Up Your Web-cam as the Robot's Camera (Optional)

26 |

To set up your web-cam can be a hassle, and the app will work fine without it set up, you just will see whitespace where the camera view would be. 27 | To set it up follow the instruction links from the link below to our GitHub page to set up a workspace and to install the ROS web-cam software.

28 | https://github.com/SCCapstone/RobotCA/wiki/Tutorial-For-Simulating-the-Husky-Robot 29 | 30 | 31 |

Step 5: Launching the Simulator

32 |

To begin open a terminal and run the command ifconfig, then run the command export ROS_IP="the IP address of wlan0". 33 | Once you have done that, start ROS in the same terminal using the command roscore. If you chose to set up the camera you can start it using roslaunch ./camera_node.launch. Finally start the husky simulator using the command roslaunch husky_gazebo husky_playpen.launch.

34 |

Note: Sometimes, on the very first launch of the husky simulator ever it may not work. That's okay, just re-run the command to start it and it should work.

35 | 36 |

Step 6: Connecting to the Simulated Robot

37 |

To connect to the simulator, make sure that your computer running the simulator and your Android device are on the same wifi network first. Then, open the app and click the add a robot button. When the prompt pops up, replace only the word "localhost" with the same IP address that you set 38 | your ROS_IP environment variable to earlier. Hit connect and you should connect to the simulated robot and be able to use the app.

39 | 40 |

Using a Real Robot

41 |

As far as connecting to a robot goes, it will be easier to connect to a real robot, but accessing one will be much harder

42 | 43 |

Step 1: Connecting to the Robot

44 |

To connect to the robot, make sure your Android device is on the robot's wifi network. Then open the app and add a robot. Replace only the word "localhost" with the IP address of the robot and hit connect. You should connect to the robot and be able to use the app.

45 | 46 | 47 | 48 |
-------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/java/com/robotca/ControlApp/Fragments/JoystickFragment.java: -------------------------------------------------------------------------------- 1 | package com.robotca.ControlApp.Fragments; 2 | 3 | 4 | import android.app.Fragment; 5 | import android.os.Bundle; 6 | import android.support.annotation.Nullable; 7 | import android.view.LayoutInflater; 8 | import android.view.View; 9 | import android.view.ViewGroup; 10 | 11 | import com.robotca.ControlApp.Core.ControlMode; 12 | import com.robotca.ControlApp.R; 13 | import com.robotca.ControlApp.Views.JoystickView; 14 | 15 | /** 16 | * Fragment containing the JoystickView. 17 | * 18 | * Created by Michael Brunson on 11/7/15. 19 | */ 20 | public class JoystickFragment extends Fragment { 21 | private JoystickView virtualJoystick; 22 | private View view; 23 | private ControlMode controlMode = ControlMode.Joystick; 24 | 25 | /** 26 | * Default Constructor. 27 | */ 28 | public JoystickFragment() { 29 | } 30 | 31 | /** 32 | * Create this Fragments View. 33 | */ 34 | @Nullable 35 | @Override 36 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 37 | 38 | // Inflate the view if needed 39 | if (view == null) { 40 | view = inflater.inflate(R.layout.fragment_joystick_view, container, false); 41 | 42 | // Grab the JoystickView and set its topic 43 | virtualJoystick = (JoystickView) view.findViewById(R.id.joystick_view); 44 | } 45 | 46 | return view; 47 | } 48 | 49 | /** 50 | * Returns the JoystickView 51 | * @return The JoystickView 52 | */ 53 | public JoystickView getJoystickView() { 54 | return virtualJoystick; 55 | } 56 | 57 | /** 58 | * Get the currently active ControlMode. 59 | * @return The current ControlMode 60 | */ 61 | public ControlMode getControlMode() { 62 | return controlMode; 63 | } 64 | 65 | /** 66 | * Set the ControlMode for controlling the Joystick. 67 | * @param controlMode The new ControlMode 68 | */ 69 | public void setControlMode(ControlMode controlMode) { 70 | this.controlMode = controlMode; 71 | this.invalidate(); 72 | } 73 | 74 | /** 75 | * Tests whether the Joystick supports accelerometer control. 76 | * @return True if the Joystick supports accelerometer control, false otherwise 77 | */ 78 | @SuppressWarnings("unused") // Maybe later... 79 | public boolean hasAccelerometer() { 80 | return virtualJoystick.hasAccelerometer(); 81 | } 82 | 83 | /** 84 | * Invalidate the Fragment, updating the visibility of the Joystick based on the ControlMode. 85 | * 86 | */ 87 | public void invalidate() { 88 | 89 | switch (controlMode) { 90 | case Joystick: 91 | show(); 92 | break; 93 | 94 | case Tilt: 95 | show(); 96 | break; 97 | 98 | default: 99 | hide(); 100 | break; 101 | } 102 | 103 | virtualJoystick.setControlMode(controlMode); 104 | virtualJoystick.controlSchemeChanged(); 105 | } 106 | 107 | /** 108 | * Stops the JoystickFragment. 109 | */ 110 | public void stop() { 111 | virtualJoystick.stop(); 112 | } 113 | 114 | /** 115 | * Shows the JoystickFragment. 116 | */ 117 | public void show(){ 118 | getFragmentManager() 119 | .beginTransaction() 120 | .show(this) 121 | .commit(); 122 | } 123 | 124 | /** 125 | * Hides the JoystickFragment. 126 | */ 127 | public void hide(){ 128 | getFragmentManager() 129 | .beginTransaction() 130 | .hide(this) 131 | .commit(); 132 | } 133 | } 134 | -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/java/com/robotca/ControlApp/Core/WarningSystem.java: -------------------------------------------------------------------------------- 1 | package com.robotca.ControlApp.Core; 2 | 3 | import android.content.SharedPreferences; 4 | import android.preference.PreferenceManager; 5 | 6 | import com.robotca.ControlApp.ControlApp; 7 | import com.robotca.ControlApp.R; 8 | 9 | import org.ros.message.MessageListener; 10 | 11 | import sensor_msgs.LaserScan; 12 | 13 | /** 14 | * Warning system for alerting ControlApp when a collision is imminent. 15 | * Created by Nathaniel on 3/31/16 (Adapted from WarningSystemPlan created by lightyz on 3/24/16). 16 | */ 17 | public class WarningSystem implements MessageListener { 18 | 19 | private final ControlApp controlApp; 20 | 21 | private final float minRange; 22 | private boolean enabled; 23 | private boolean safemode; 24 | 25 | private static final float ANGLE_DELTA = (float) Math.toRadians(40.0); 26 | 27 | /** The minimum distance at which to register laser scan points as dangerous */ 28 | public static final float MIN_DISTANCE = 0.25f; 29 | 30 | // Log tag String 31 | @SuppressWarnings("unused") 32 | private static final String TAG = "WarningSystem"; 33 | 34 | /** 35 | * Creates a WarningSystem plan for the specified ControlApp. 36 | * @param controlApp The ControlApp 37 | */ 38 | public WarningSystem(ControlApp controlApp) { 39 | this.controlApp = controlApp; 40 | 41 | SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(controlApp); 42 | 43 | this.enabled = prefs.getBoolean(controlApp.getString(R.string.prefs_warning_system_key), true); 44 | this.safemode = prefs.getBoolean(controlApp.getString(R.string.prefs_warning_safemode_key), true); 45 | 46 | String val = prefs.getString(controlApp.getString(R.string.prefs_warning_mindist_key), 47 | controlApp.getString(R.string.default_warning_mindist)); 48 | this.minRange = Math.max(0.2f, Float.parseFloat(val)); 49 | } 50 | 51 | /** 52 | * Enables/Disables the Warning System. 53 | * @param enabled Whether to enable or disable the Warning System 54 | */ 55 | public void setEnabled(boolean enabled) { 56 | this.enabled = enabled; 57 | } 58 | 59 | /** 60 | * Enables/Disables safe mode. 61 | * @param enable Whether to enable or disable safe mode 62 | */ 63 | public void enableSafemode(boolean enable) { 64 | safemode = enable; 65 | } 66 | 67 | /** 68 | * @return Whether safe mode is enable 69 | */ 70 | public boolean isSafemodeEnabled() { 71 | return safemode; 72 | } 73 | 74 | @Override 75 | public void onNewMessage(LaserScan laserScan) { 76 | 77 | if (!enabled) 78 | return; 79 | 80 | float[] ranges = laserScan.getRanges(); 81 | float shortestDistance = ranges[ranges.length / 2]; 82 | 83 | // Log.d(TAG, "Original shortest distance: " + shortestDistance); 84 | 85 | float angle = laserScan.getAngleMin(); 86 | 87 | // Correct for the Robot's turn rate 88 | angle += (float) RobotController.getTurnRate(); 89 | 90 | float angleIncrement = laserScan.getAngleIncrement(); 91 | 92 | for (int i = 0; i < laserScan.getRanges().length; i++) { 93 | if (ranges[i] > MIN_DISTANCE && ranges[i] < shortestDistance 94 | && angle > -ANGLE_DELTA && angle < ANGLE_DELTA) { 95 | shortestDistance = ranges[i]; 96 | } 97 | 98 | angle += angleIncrement; 99 | } 100 | 101 | // Warn the ControlApp if necessary 102 | if (RobotController.getSpeed() > -0.1 && 103 | shortestDistance < minRange * Math.max(0.5, RobotController.getSpeed())) { 104 | 105 | controlApp.collisionWarning(); 106 | } 107 | } 108 | } 109 | -------------------------------------------------------------------------------- /src/android_foo/control_app/build.gradle: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2014 Mike. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | /* 18 | Examples of 19 | 1) dependencies from another project in this gradle stack. 20 | 2,3) open ranged dependencies from a maven repository. 21 | 22 | It's a good idea to restrict the open ranged dependency to 23 | the patch version to avoid breakages due to api changes 24 | which usually occur on minor and major version numbers. 25 | */ 26 | 27 | repositories { 28 | mavenCentral() 29 | mavenLocal() 30 | 31 | flatDir { 32 | dirs 'libs' 33 | } 34 | maven { url "https://jitpack.io" } 35 | } 36 | 37 | 38 | dependencies { 39 | // compile project(':control_app_lib') 40 | compile fileTree(include: ['*.jar'], dir: 'libs') 41 | /////////////// 42 | compile 'org.ros.android_core:android_10:[0.3,0.4)' 43 | compile 'org.ros.android_core:android_15:[0.3,0.4)' 44 | compile 'com.github.rosjava.android_extras:gingerbread:[0.2,0.3]' 45 | compile 'org.ros.rosjava_messages:tf2_msgs:[0.5,0.6]' 46 | compile 'com.google.code.gson:gson:2.5' 47 | compile 'com.android.support:support-v13:25.1.0' 48 | compile 'com.android.support:appcompat-v7:25.1.0' 49 | compile 'com.android.support:cardview-v7:25.1.0' 50 | compile 'com.android.support:recyclerview-v7:25.1.0' 51 | compile 'org.osmdroid:osmdroid-android:5.2@aar' 52 | compile(name:'osmbonuspack_v5.8.1', ext:'aar') 53 | compile 'org.apache.commons:commons-lang3:3.3.2' 54 | compile 'com.squareup.okhttp:okhttp:2.6.0' 55 | compile 'com.android.support:support-v4:23.2.0' 56 | compile 'com.github.amlcurran.showcaseview:library:5.4.1' 57 | compile project(':control_app_lib') 58 | } 59 | 60 | apply plugin: 'com.android.application' 61 | 62 | android { 63 | compileSdkVersion 25 64 | defaultConfig { 65 | minSdkVersion 19 66 | targetSdkVersion 25 67 | multiDexEnabled true 68 | versionCode 1 69 | versionName "2.0" 70 | 71 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 72 | } 73 | sourceSets { 74 | main { java.srcDirs = ['src/main/java'] } 75 | debug { java.srcDirs = ['src/debug/java'] } 76 | } 77 | } 78 | 79 | dependencies { 80 | // Required -- JUnit 4 framework 81 | testCompile 'junit:junit:4.12' 82 | // Optional -- Mockito framework 83 | testCompile 'org.mockito:mockito-core:1.10.19' 84 | 85 | androidTestCompile 'com.android.support:support-annotations:25.1.0' 86 | androidTestCompile 'com.android.support.test:runner:0.4' 87 | androidTestCompile 'com.android.support.test:rules:0.4' 88 | // Optional -- Hamcrest library 89 | androidTestCompile 'org.hamcrest:hamcrest-library:1.3' 90 | // Optional -- UI testing with Espresso 91 | androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1' 92 | // Optional -- UI testing with UI Automator 93 | // androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v15' 94 | } 95 | 96 | // Needed to resolve app vs test dependencies, specifically, transitive dependencies of 97 | // libraryq and libraryz. Forcing the use of the smaller version after regression testing. 98 | configurations.all { 99 | resolutionStrategy.force 'com.google.code.findbugs:jsr305:1.3.9' 100 | } 101 | -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/java/com/robotca/ControlApp/Core/Plans/RobotPlan.java: -------------------------------------------------------------------------------- 1 | package com.robotca.ControlApp.Core.Plans; 2 | 3 | import android.util.Log; 4 | 5 | import com.robotca.ControlApp.Core.ControlMode; 6 | import com.robotca.ControlApp.Core.RobotController; 7 | 8 | import geometry_msgs.Twist; 9 | import sensor_msgs.LaserScan; 10 | import sensor_msgs.NavSatFix; 11 | 12 | /** 13 | * 14 | * 15 | * Created by Michael Brunson on 2/13/16. 16 | */ 17 | public abstract class RobotPlan { 18 | 19 | // The thread this RobotPlan runs on 20 | private Thread thread; 21 | 22 | // If it makes sense for this RobotPlan to be resumed if stopped 23 | private boolean resumable; 24 | 25 | // Log Tag 26 | private static final String TAG = "RobotPlan"; 27 | 28 | /** 29 | * Default Constructor. 30 | */ 31 | public RobotPlan() { 32 | setResumable(true); 33 | } 34 | 35 | /** 36 | * @return If this RobotPlan is running 37 | */ 38 | public boolean isRunning() { 39 | return thread.isAlive(); 40 | } 41 | 42 | /** 43 | * @return If this RobotPlan has been interrupted 44 | */ 45 | public boolean isInterrupted() { 46 | return thread.isInterrupted(); 47 | } 48 | 49 | /** 50 | * @return True if this RobotPlan can be resumed, false otherwise 51 | */ 52 | public boolean isResumable() { 53 | return resumable; 54 | } 55 | 56 | /** 57 | * Sets whether this RobotPlan can be resumed if stopped. 58 | * @param resumable True if it can be resumed, false otherwise 59 | */ 60 | protected void setResumable(boolean resumable) { 61 | this.resumable = resumable; 62 | } 63 | 64 | /** 65 | * Stops this RobotPlan, interrupting it. 66 | */ 67 | public void stop() { 68 | if (thread != null) { 69 | 70 | Log.d(TAG, "Stopping plan"); 71 | 72 | try { 73 | thread.interrupt(); 74 | thread.join(1000L); 75 | } catch (Exception e) { 76 | Log.e(TAG, "", e); 77 | } 78 | } else { 79 | Log.d(TAG, "No Thread to Stop"); 80 | } 81 | } 82 | 83 | /** 84 | * @return The ControlMode for this RobotPlan 85 | */ 86 | public abstract ControlMode getControlMode(); 87 | 88 | /** 89 | * Runs this RobotPlan. 90 | * @param controller The parent RobotController 91 | */ 92 | public void run(final RobotController controller) { 93 | stop(); 94 | 95 | thread = new Thread(new Runnable() { 96 | @Override 97 | public void run() { 98 | try { 99 | start(controller); 100 | } catch (Exception e) { 101 | Log.e(TAG, "", e); 102 | } 103 | } 104 | }); 105 | 106 | thread.start(); 107 | } 108 | 109 | /** 110 | * Pauses this RobotPlan for the specified amount of time. 111 | * 112 | * @param milliseconds The time, in milliseconds 113 | * @throws InterruptedException If the RobotPlan gets interrupted 114 | */ 115 | protected void waitFor(long milliseconds) throws InterruptedException { 116 | try { 117 | long currentTime = System.currentTimeMillis(); 118 | while (currentTime + milliseconds > System.currentTimeMillis() && !isInterrupted()) 119 | Thread.sleep(milliseconds / 3); 120 | } catch (InterruptedException e) { 121 | throw e; 122 | } catch (Exception e) { 123 | Log.e(TAG, "", e); 124 | } 125 | } 126 | 127 | /** 128 | * Called when the RobotPlan is started. 129 | * @param controller The RobotController for controlling the Robot 130 | * @throws Exception If an exception occurs 131 | */ 132 | protected abstract void start(RobotController controller) throws Exception; 133 | } 134 | -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/java/com/robotca/ControlApp/Fragments/LaserScanFragment.java: -------------------------------------------------------------------------------- 1 | package com.robotca.ControlApp.Fragments; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.NonNull; 5 | import android.util.Log; 6 | import android.view.LayoutInflater; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | import android.widget.CheckBox; 10 | import android.widget.CompoundButton; 11 | 12 | import com.robotca.ControlApp.ControlApp; 13 | import com.robotca.ControlApp.Core.Savable; 14 | import com.robotca.ControlApp.R; 15 | import com.robotca.ControlApp.Views.LaserScanView; 16 | 17 | /** 18 | * Fragment for the LaserScanLayer. 19 | *

20 | * Created by Michael Brunson on 11/7/15. 21 | */ 22 | public class LaserScanFragment extends SimpleFragment implements Savable { 23 | 24 | private LaserScanView laserScanView; 25 | 26 | // Bundle id for if the camera angle is locked on the robot's heading 27 | private static final String CAMERA_ANGLE_LOCKED_BUNDLE_ID = "com.robotca.ControlApp.Fragments.cameraAngleLocked"; 28 | 29 | private static boolean cameraAngleLocked = true; 30 | 31 | @SuppressWarnings("unused") 32 | private static final String TAG = "LaserScanFragment"; 33 | 34 | /** 35 | * Default Constructor. 36 | */ 37 | public LaserScanFragment() { 38 | } 39 | 40 | /** 41 | * Locks or unlocks the camera angle from following the Robot's heading. 42 | * @param lock True if the camera angle should match the Robot and false otherwise 43 | */ 44 | public void lockAngle(boolean lock) { 45 | cameraAngleLocked = lock; 46 | laserScanView.getLaserScanRenderer().makeCameraAngleFollowRobot(lock); 47 | } 48 | 49 | /** 50 | * @return Whether the camera's angle is locked on the Robot's heading 51 | */ 52 | public boolean angleLocked() { 53 | return laserScanView.getLaserScanRenderer().angleFollowsRobot(); 54 | } 55 | 56 | /** 57 | * Inflates the Fragment. 58 | */ 59 | @Override 60 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 61 | 62 | View view = inflater.inflate(R.layout.fragment_laser_scan, container, false); 63 | 64 | laserScanView = (LaserScanView) view.findViewById(R.id.laser_scan_renderer_view); 65 | 66 | (view.findViewById(R.id.recenter_laser_scan)).setOnClickListener( 67 | new View.OnClickListener() { 68 | @Override 69 | public void onClick(View v) {laserScanView.getLaserScanRenderer().recenter();} 70 | }); 71 | 72 | (view.findViewById(R.id.clear_waypoints_button)).setOnClickListener( 73 | new View.OnClickListener() { 74 | @Override 75 | public void onClick(View v) { 76 | laserScanView.getLaserScanRenderer().stopMovingWaypoint(); 77 | ((ControlApp) getActivity()).clearWaypoints(); 78 | } 79 | }); 80 | 81 | (view.findViewById(R.id.clear_waypoints_button)).setEnabled(!getControlApp().getWaypoints().isEmpty()); 82 | 83 | CheckBox checkBox = ((CheckBox) view.findViewById(R.id.lock_camera_checkbox)); 84 | 85 | checkBox.setOnCheckedChangeListener( 86 | new CompoundButton.OnCheckedChangeListener() { 87 | @Override 88 | public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 89 | lockAngle(isChecked); 90 | } 91 | }); 92 | 93 | checkBox.setChecked(cameraAngleLocked); 94 | lockAngle(cameraAngleLocked); 95 | 96 | return view; 97 | } 98 | 99 | /** 100 | * Load from a Bundle. 101 | * 102 | * @param bundle The Bundle 103 | */ 104 | @Override 105 | public void load(@NonNull Bundle bundle) { 106 | 107 | Log.d(TAG, "loading from bundle"); 108 | 109 | lockAngle(bundle.getBoolean(CAMERA_ANGLE_LOCKED_BUNDLE_ID, true)); 110 | } 111 | 112 | /** 113 | * Save to a Bundle. 114 | * 115 | * @param bundle The Bundle 116 | */ 117 | @Override 118 | public void save(@NonNull Bundle bundle) { 119 | 120 | Log.d(TAG, "saving to bundle"); 121 | 122 | bundle.putBoolean(CAMERA_ANGLE_LOCKED_BUNDLE_ID, angleLocked()); 123 | } 124 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # RobotCA 2 | 3 | # ======================= 4 | # NEVER ALLOW ANDROID STUDIO TO UPDATE YOUR BUILD TOOLS.SELECT 'DO NOT ASK AGAIN FOR THIS PROJECT 5 | # ======================= 6 | 7 | #### ROS-autom Team 8 | 9 | This project is active again. 10 | 11 | ###### Prepare your distro for compile: 12 | 13 | + Download Android Studio from https://developer.android.com/studio/index.html#linux-bundle 14 | + Extract the zip file into a folder at your home dir(i.e. android_ide) and run the bin/studio.sh script 15 | + Select Standard setup and finish the installation. 16 | + When the download is done, press on the Configure option on the bottom side and select SDK manager 17 | + From SDK platforms select all API levels from 26 to 22 18 | + From SDK Tools select 'Show package details' 19 | + Select 21.1.2 ,25.0.2 and 26.0.0 20 | + Press apply and ok 21 | + Accept the license and let it download the required files 22 | + Press ok to SDK manager and close the Android Studio 23 | + Install the JDK8 by running 24 | 25 | $ sudo add-apt-repository ppa:openjdk-r/ppa 26 | $ sudo apt-get update 27 | $ sudo apt-get install openjdk-8-jdk 28 | + Run the android studio: . /path/to/studio/bin/studio.sh 29 | + File->Open->RobotCA/src/android_foo folder and press OK. 30 | + Wait until Gradle is being initialized. 31 | + On the plugin update window,select "Dont remind me again for this project". 32 | + File->Other Settings->Default Project Structure->Untick default JDK and add this directory: /usr/lib/jvm/java-1.8.0-openjdk-amd64 33 | + Close Android Studio and run 34 | $ sudo apt-get install lib32z1 lib32ncurses5 lib32stdc++6 35 | + Open Android Studio again and wait gradle to be initialized 36 | 37 | Optional: 38 | Run 39 | + touch ~/.gradle/gradle.properties && echo "org.gradle.daemon=true" >> ~/.gradle/gradle.properties 40 | + echo "org.gradle.parallel=true" >> ~/.gradle/gradle.properties 41 | 42 | This is highly experimental and its not recommended 43 | + echo "org.gradle.configureondemand=true" >> ~/.gradle/gradle.properties 44 | 45 | to speed up the build process. 46 | 47 | #### Troubleshoot 48 | 49 | 1)====================================== 50 | If you get aapt exited with code 127 51 | or 52 | Error:Execution failed for task ':control_app_lib:processReleaseResources'. 53 | > A problem occurred starting process 'command '/home/USERNAME/Android/Sdk/build-tools/21.1.2/aapt'' 54 | please run 55 | sudo apt-get install lib32z1 lib32ncurses5 lib32stdc++6 56 | 57 | 2)====================================== 58 | Never Fix the Gradle Version that is mentioned in Messages. 59 | 60 | #### Pin Android Studio to your launcher tab 61 | + Create a file called "AndroidStudio.desktop" and paste the following code: 62 | ``` 63 | [Desktop Entry] 64 | Version=1.0 65 | Type=Application 66 | Name=Android Studio 67 | Exec="/home/YOURNAME/FOLDER_TO_IDE/bin/studio.sh" %f 68 | Icon=/home/YOURNAME/FOLDER_TO_IDE/bin/studio.png 69 | Categories=Development;IDE; 70 | Terminal=true 71 | StartupNotify=false 72 | StartupWMClass=jetbrains-android-studio 73 | Name[en_GB]=android-studio.desktop 74 | ``` 75 | + save it and then drag and drop that file on the launcher. 76 | + Click it to run the IDE. 77 | + When the IDE is opened right click on the new-second one icon that created on launcher 78 | + Press 'Lock to launcher' 79 | + exit the IDE 80 | + Remove the first icon 81 | 82 | #### Credits 83 | 84 | ros-autom team, Thessaloniki of Greece 2017 85 | 86 | Originally posted by: 87 | #### University of South Carolina 88 | ###### CSCE 490 & 492 Capstone Design 89 | 90 | Our project is to design an Android application to control a robot. Specifically, the goal is to create a native Android tablet application to interface with a Robot Operating System (ROS) robot, Clearpath Robotics' HUSKY model, for direct drive, diagnostic, and navigation information. The application will have to process data from various sensors on the robot and display the information in a user understandable fashion. For example, the robot will have a laser ranging system which will be collecting data on the environment. The application must parse this data and display the environment that the robot "sees". 91 | 92 | Dependencies: 93 | + ROS 94 | + ROSJava 95 | + Android 4.0+ (API level 13+) 96 | 97 | ![Master Chooser](https://cloud.githubusercontent.com/assets/8508489/14839465/021d5f80-0bf9-11e6-9580-10fa54de7cfc.png) 98 | 99 | ![Main Layout](https://cloud.githubusercontent.com/assets/8508489/14839460/0201419c-0bf9-11e6-82c9-8e51ce85d48c.png) 100 | 101 | Client Information: 102 | Dr. Ioannis Rekleitis 103 | Assistant Professor 104 | University of South Carolina 105 | -------------------------------------------------------------------------------- /src/android_foo/control_app/src/main/res/layout-large/fragment_hud.xml: -------------------------------------------------------------------------------- 1 | 8 | 9 | 20 | 21 | 28 | 29 | 40 | 41 | 51 | 52 | 53 | 54 | 64 | 65 | 72 | 73 | 83 | 84 | 93 | 94 | 95 | 96 |