From 80fa5058b2abc4fae055aacd32ddad30cb558436 Mon Sep 17 00:00:00 2001 From: Yuan SY Date: Mon, 6 Jul 2026 14:50:29 +0800 Subject: [PATCH 1/4] feat(crop): add Person Crop Collector entry skeleton --- .../java/org/openbot/common/FeatureList.java | 3 + .../PersonCropCollectorFragment.java | 54 ++++++++ .../java/org/openbot/main/MainFragment.java | 5 + .../layout/fragment_person_crop_collector.xml | 124 ++++++++++++++++++ .../src/main/res/navigation/nav_graph.xml | 9 ++ android/robot/src/main/res/values/strings.xml | 4 + 6 files changed, 199 insertions(+) create mode 100644 android/robot/src/main/java/org/openbot/cropcollector/PersonCropCollectorFragment.java create mode 100644 android/robot/src/main/res/layout/fragment_person_crop_collector.xml diff --git a/android/robot/src/main/java/org/openbot/common/FeatureList.java b/android/robot/src/main/java/org/openbot/common/FeatureList.java index e023f70b7..a5fab63e3 100644 --- a/android/robot/src/main/java/org/openbot/common/FeatureList.java +++ b/android/robot/src/main/java/org/openbot/common/FeatureList.java @@ -37,6 +37,7 @@ public class FeatureList { public static final String PERSON_FOLLOWING = "Person Following"; public static final String OBJECT_NAV = "Object Tracking"; public static final String CART_SIMULATOR = "Cart Simulator"; + public static final String PERSON_CROP_COLLECTOR = "Person Crop Collector"; public static final String MODEL_MANAGEMENT = "Model Management"; public static final String POINT_GOAL_NAVIGATION = "Point Goal Navigation"; public static final String AUTONOMOUS_DRIVING = "Autonomous Driving"; @@ -84,6 +85,8 @@ public static ArrayList getCategories() { subCategories.add(new SubCategory(AUTOPILOT, R.drawable.ic_autopilot, "#44525F")); subCategories.add(new SubCategory(OBJECT_NAV, R.drawable.ic_person_search, "#E7CE88")); subCategories.add(new SubCategory(CART_SIMULATOR, R.drawable.ic_person_search, "#6BBF8A")); + subCategories.add( + new SubCategory(PERSON_CROP_COLLECTOR, R.drawable.ic_person_search, "#8BBF6B")); subCategories.add( new SubCategory(POINT_GOAL_NAVIGATION, R.drawable.ic_baseline_golf_course, "#1BBFBF")); subCategories.add(new SubCategory(MODEL_MANAGEMENT, R.drawable.ic_list_bulleted_48, "#BC7680")); diff --git a/android/robot/src/main/java/org/openbot/cropcollector/PersonCropCollectorFragment.java b/android/robot/src/main/java/org/openbot/cropcollector/PersonCropCollectorFragment.java new file mode 100644 index 000000000..a8e4e62ec --- /dev/null +++ b/android/robot/src/main/java/org/openbot/cropcollector/PersonCropCollectorFragment.java @@ -0,0 +1,54 @@ +package org.openbot.cropcollector; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.camera.core.ImageProxy; +import java.util.List; +import org.jetbrains.annotations.NotNull; +import org.openbot.R; +import org.openbot.common.CameraFragment; +import org.openbot.databinding.FragmentPersonCropCollectorBinding; +import org.openbot.tflite.Model; +import org.openbot.utils.Enums; + +public class PersonCropCollectorFragment extends CameraFragment { + + private FragmentPersonCropCollectorBinding binding; + + @Override + public View onCreateView( + @NotNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + binding = FragmentPersonCropCollectorBinding.inflate(inflater, container, false); + return inflateFragment(binding, inflater, container); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + List models = getModelNames(f -> f.type.equals(Model.TYPE.DETECTOR)); + initModelSpinner(binding.modelSpinner, models, preferencesManager.getObjectNavModel()); + + setAnalyserResolution(Enums.Preview.HD.getValue()); + + binding.statusText.setText(getString(R.string.person_crop_idle)); + binding.btnStart.setEnabled(true); + binding.btnStop.setEnabled(false); + } + + @Override + protected void processFrame(android.graphics.Bitmap bitmap, ImageProxy image) { + } + + @Override + protected void processUSBData(String data) { + } + + @Override + protected void processControllerKeyData(String commandType) { + } +} diff --git a/android/robot/src/main/java/org/openbot/main/MainFragment.java b/android/robot/src/main/java/org/openbot/main/MainFragment.java index 8f350de77..792bb9709 100644 --- a/android/robot/src/main/java/org/openbot/main/MainFragment.java +++ b/android/robot/src/main/java/org/openbot/main/MainFragment.java @@ -92,6 +92,11 @@ public void onItemClick(SubCategory subCategory) { .navigate(R.id.action_mainFragment_to_cartSimFragment); break; + case FeatureList.PERSON_CROP_COLLECTOR: + Navigation.findNavController(requireView()) + .navigate(R.id.action_mainFragment_to_personCropCollectorFragment); + break; + case FeatureList.POINT_GOAL_NAVIGATION: Navigation.findNavController(requireView()) .navigate(R.id.action_mainFragment_to_pointGoalNavigationFragment); diff --git a/android/robot/src/main/res/layout/fragment_person_crop_collector.xml b/android/robot/src/main/res/layout/fragment_person_crop_collector.xml new file mode 100644 index 000000000..781172783 --- /dev/null +++ b/android/robot/src/main/res/layout/fragment_person_crop_collector.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + +