5.5 KiB
Open Source Go2 Dashboard
This dashboard replaces the old ~/GO2 dashboard service for the open-source
go2-nav2-amcl trial.
Safety Boundary
This service is a VM-side integration only. It must not modify the Go2 onboard system, DDS configuration, network routes, systemd services, startup scripts, or packages.
The only robot-side SSH behavior allowed by this dashboard is the explicit user-approved waypoint action command, which runs the existing photo script and then exits. Configuration and development changes belong on the VM.
It serves a small web UI on port 8090 and talks directly to the current ROS 2
Nav2 graph:
/map/amcl_pose/initialpose/cmd_vel/cmd_vel_nav/navigate_to_pose
Fixed Inspection Route
The dashboard supports one VM-side fixed inspection route. Operators create it by selecting route edit mode, dragging fixed poses on the map, then saving. The route is stored here:
go2_dashboard/data/inspection_routes/default.json
Saved routes are bound to the current map yaml and map revision. If the map is rebuilt or replaced, save the route again before starting inspection.
Route execution is single-run only. The dashboard sends each Nav2 goal in order, confirms that the robot has really arrived, calls the VM-side realtime segment HTTP integration, then keeps the original 3 second dwell before continuing. Navigation failure still stops the route and waits for an operator.
Camera-facing patrol points must finish yaw alignment before arrival is accepted.
The dashboard keeps GO2_INSPECTION_YAW_TOLERANCE_DEG at 8.0 by default, and
the Nav2 controller is tuned to rotate into that final heading faster instead of
skipping the heading check.
The realtime segment call is made from the VM after arrival confirmation and before the 3 second dwell:
POST http://192.168.0.199:5000/realtime-segment
The dashboard uploads the current Unitree video JPEG frame as
multipart/form-data. The default file field is image; override it with
GO2_REALTIME_SEGMENT_IMAGE_FIELD if the service expects another field name.
The target URL can be overridden with GO2_REALTIME_SEGMENT_URL.
By default, realtime segment failures are shown in /api/state.inspection_run
and the UI, then the route continues to the 3 second dwell and the next point.
Set GO2_REALTIME_SEGMENT_CONTINUE_ON_FAILURE=false if a missed realtime
segment call must stop the inspection. Timeouts are controlled by
GO2_REALTIME_SEGMENT_TIMEOUT_S and GO2_REALTIME_SEGMENT_FRAME_TIMEOUT_S.
Before a route can start, the dashboard now enforces a navigation preflight:
- Nav2 launch is running and
/navigate_to_poseis ready. - Fresh real Go2 source data is being received from
/lf/sportmodestate,/lf/lowstate,/utlidar/robot_pose, and/utlidar/cloud_deskewed. - The robot accepts
/api/sport/request. - The current map-frame pose is fresh.
- The operator has explicitly confirmed that the displayed robot position and yaw match the real robot in the room after setting the initial pose.
The UI button order is: start navigation, set initial pose, confirm localization,
then send a manual goal or start the saved inspection route. If any preflight
item is missing, route start is blocked and /api/state.preflight lists the
blocking reasons.
The live camera panel serves MJPEG through /api/video. Frames are sampled from
Unitree's official VideoClient.GetImageSample() on the robot network
interface. By default the interface is ens160; override it with
GO2_CAMERA_IFACE when starting the service.
Robot pose displayed on the web map goes through a small pose pipeline reserved for later localization optimization:
go2_dashboard/config/pose_pipeline.json
Current default behavior is pass-through with optional offsets. The preferred
source is tf:map->base_link, then
amcl:/amcl_pose.
After a Nav2 goal returns succeeded, the dashboard can run one onboard
waypoint action after the robot is actually settled at the requested pose. This
is configured here:
go2_dashboard/config/waypoint_action.json
The default action SSH target is the Go2 onboard computer:
cd /unitree_go2_ws/src/action/action && python3 testaction5.py
The hook checks position tolerance, yaw tolerance, fresh pose data, and a short stable hold time before it runs the command. Each goal sequence can trigger the action at most once. If a new goal or stop command arrives while settling, the pending action is superseded.
Nav2 obstacle avoidance is required for dashboard-started navigation. The VM
side startup path refuses to launch navigation if the Nav2 local/global costmap
obstacle and inflation layers are disabled in
src/go2_navigation2/config/nav2_params.yaml.
Do not store passwords in waypoint_action.json. If password SSH is needed,
create go2_dashboard/config/dashboard.env on the VM and set
GO2_ROBOT_PASSWORD there. That file is loaded by
start_go2_dashboard.sh and should stay local to the VM.
The dashboard expects the robot ROS network interface to be ens160 by
default. Override it with GO2_ROS_IFACE in dashboard.env if the VM uses a
different bridged NIC. If that interface is down, the web service falls back to
an available VM network interface so the UI can show diagnostics, but it refuses
to start Nav2 until the robot ROS interface is restored and the service is
restarted.
Start it from the VM:
cd ~/go2_robot_system
./go2_dashboard/start_go2_dashboard.sh
The service intentionally does not implement the legacy /api/v1/... GO2
dashboard API.