GO2 Foxy Quick Start
This guide provides instructions for interfacing with the Unitree GO2 Edu robot using Ubuntu 20.04 and ROS2 Foxy.

Note
Ensure that you have already completed the setup and pairing with your GO2 Edu.
Verify all functionality using the mobile app before continuing.
Initial setup instructions can be found in the GO2 Docs.
This guide builds upon the information available in those docs.
Warning
The documentation below is valid only for the GO2 Edu version (tested until 08-July-2025).
Warning
Unitree is constantly updating their firmware, and at times changing naming conventions may cause breakage in some newer firmwares. If this occurs, either submit an issue or create a pull request with the correct feature updates.
Static Network Connection
For the first-time connection, you must configure the robot’s network via a LAN cable.
On your PC (not on the robot), open:
Settings → Network → Add (+) New Connection
In the IPv4 settings:
Change the method to Manual
Set the IP Address:
192.168.123.51
Set the Netmask:
24
Save and restart your network connection
Confirm that the host’s local IP is configured correctly:
ifconfig
Ping the robot to verify the connection:
ping 192.168.123.18
Access the robot via SSH:
ssh -X unitree@192.168.123.18
Default password:
123
GO2 IP Addresses
IP Address |
Device |
Username |
Password |
---|---|---|---|
192.168.123.161 |
GO2 MCU |
x |
x |
192.168.123.18 |
GO2 Auxiliary PC |
unitree |
123 |
192.168.123.18:9000 |
GO2 Webserver MBS |
x |
mybotshop |
Warning
Other active networks may interfere with your connection. For best results, disconnect from all other networks and connect only to the GO2.
Network Connection
Connection via LAN:
ssh -X unitree@192.168.123.18
When starting up, keep in mind:
The Go2 wrapper operates on
ROS_DOMAIN_ID=10
. Launch files automatically use Domain ID 10.The namespace can be changed to match your robot’s ID for multi-robot systems.
GO2 Drivers Startup
After completing installation, the ROS2 packages will run in the background (if pre-installed by the mybotshop team).
Important
To check which packages must run, see the
go2_bringup
startup script.Service names are mentioned there and can be referenced directly.
Example:
sudo service go2-webserver status
ros2 launch go2_webserver webserver.launch.py
Ensure duplicate services are not running simultaneously. Close unnecessary services before launching new ones.

GO2 Gaits
Available gait modes:
Normal Trot (recommended for Nav2, SLAM applications):
ROS_DOMAIN_ID=10 ros2 service call /go2_unit_21576/modes go2_interface/srv/Go2Modes "{request_data: 'gait_type_classic'}"
Flat Terrain Mode (for flat environments):
ROS_DOMAIN_ID=10 ros2 service call /go2_unit_21576/modes go2_interface/srv/Go2Modes "{request_data: 'gait_type_flat_terrain'}"
Economic Trot (long runs, battery conservation):
ROS_DOMAIN_ID=10 ros2 service call /go2_unit_21576/modes go2_interface/srv/Go2Modes "{request_data: 'gait_type_economic'}"
Fast Trot:
ROS_DOMAIN_ID=10 ros2 service call /go2_unit_21576/modes go2_interface/srv/Go2Modes "{request_data: 'gait_type_trot_run'}"
A.I Trot:
ROS_DOMAIN_ID=10 ros2 service call /go2_unit_21576/modes go2_interface/srv/Go2Modes "{request_data: 'gait_type_agile'}"
GO2 Sports Mode
Important
The Sports Mode feature is deprecated in GO2 v2.2.1+ or with the latest firmware update.
Switch to sports mode:
ROS_DOMAIN_ID=10 ros2 service call /go2_unit_21576/modes go2_interface/srv/Go2Modes "{request_data: 'sports_mode'}"
GO2 Visualization
Launch RViz visualization:
ros2 launch go2_viz view_robot.launch.py
GO2 Tele-operation
Run teleoperation with keyboard:
ROS_DOMAIN_ID=10 ros2 run teleop_twist_keyboard teleop_twist_keyboard --ros-args --remap cmd_vel:=/go2_unit_21576/cmd_vel
Go2 ROS2 Modules
This section describes the ROS2 modules available for the Unitree GO2 platform, their usage, and example commands.
GO2 Webserver
The GO2 Webserver module comes pre-installed for heavy integration projects.
It can be accessed directly via:
Wi-Fi: The IP assigned to the robot
The configuration file is located at:
/opt/mybotshop/src/mybotshop/go2_webserver/config/robot_webserver.yaml
Login
The login page allows authorized access to the GO2 webserver interface.

Dashboard
The Dashboard provides key system controls:
Enable or disable the GO2 ROS2 services.
Record system logs for debugging or analysis.

System
The System page displays the external PC status of the Unitree GO2. - Battery status is only active when ROS2 drivers are enabled from the Dashboard.

Console
The Console allows direct control over the Unitree GO2:
Move the robot and switch between different gaits.
Adaptable to new ROS2 services.
Record ROS2 bags for later playback.
Access the GO2 external speaker if available.

Remote Desktop
Access the on-board screen of the GO2’s computer directly via the webserver.

LLM Interface
This feature is coming soon.
GO2 Mode Activation
The following modes are available via ROS2 services:
balance_stand
recovery_stand
stand_down
stand_up
stretch
damp
sit
rise_sit
front_jump
front_pounce
front_flip
stop_move
Note
These functions can be extended in the go2_platform.cpp
file
to support new firmware features from the Unitree team.
Available functionalities via ROS2 services:
Light level: 0–10
Volume level: 0–10
Example — Activating stand-up mode:
ROS_DOMAIN_ID=10 ros2 service call /go2_unit_001/modes go2_interface/srv/Go2Modes "{request_data: 'stand_up'}"
Wait a few seconds, then switch to balance stand:
ROS_DOMAIN_ID=10 ros2 service call /go2_unit_001/modes go2_interface/srv/Go2Modes "{request_data: 'balance_stand'}"
Example — Standing down:
ROS_DOMAIN_ID=10 ros2 service call /go2_unit_001/modes go2_interface/srv/Go2Modes "{request_data: 'stand_up'}"
Note
First use stand_up
to remove balance mode,
then stand_down
. This is required for the latest firmware and GO2-W.
ROS_DOMAIN_ID=10 ros2 service call /go2_unit_001/modes go2_interface/srv/Go2Modes "{request_data: 'stand_down'}"
Example — Changing light level (0–10):
ROS_DOMAIN_ID=10 ros2 service call /go2_unit_21576/light go2_interface/srv/Go2Light "{light_level: 10}"
Example — Changing volume level (0–10):
ROS_DOMAIN_ID=10 ros2 service call /go2_unit_21576/volume go2_interface/srv/Go2Volume "{volume_level: 4}"
Note
Sometimes modes (e.g., stand
) may fail to activate.
In such cases, use the recovery stand mode.
Realsense Depth Cameras
Warning
If running both Realsense cameras, launch them in separate terminals with a 10s delay to avoid conflicts.
Realsense D405:
ros2 launch go2_depth_camera realsense_d405.launch.py
Realsense D435i:
ros2 launch go2_depth_camera realsense_d435i.launch.py
Note
By default, both Realsense D435i and D405 are disabled.
The launch file is preconfigured to stream depth data continuously from D435i without lag. Modify parameters in:
go2_depth_camera/launch/realsense_d4XX.launch.py

Lidar Modules
Livox Mid360:
ros2 launch go2_lidars livox_mid360.launch.py
Hesai Pandar XT-16:
ros2 launch go2_lidars hesai.launch.py
After launching, access the sensor’s web UI and configure:
Spin rate: 300
Return mode: strongest return
Azimuth: 30 → 330
Fixposition Setup
Install dependencies:
sudo apt update
sudo apt install libyaml-cpp-dev libboost-all-dev zlib1g-dev libeigen3-dev linux-libc-dev nlohmann-json3-dev
Build Fixposition:
distrobox enter ros2_humble
rm /opt/mybotshop/src/third_party/gps/07Aug2025_fixposition_humble/COLCON_IGNORE
cp -r /opt/mybotshop/src/third_party/gps/07Aug2025_fixposition_humble /home/unitree/fixposition_humble
cd /home/unitree/fixposition_humble
source /opt/ros/humble/setup.bash
./setup_ros_ws.sh -r 2
./create_ros_ws.sh /home/unitree/fixposition_humble_ws
cd /home/unitree/fixposition_humble_ws
colcon build --symlink-install --cmake-args -DBUILD_TESTING=OFF && source install/setup.bash
Run Fixposition:
distrobox enter ros2_humble
source /opt/ros/humble/setup.bash
source /home/unitree/fixposition_humble_ws/install/setup.bash
ros2 launch fixposition_driver_ros2 fixposition_humble.launch.py
Run converter (new terminal):
ros2 launch odom_to_tf_ros2 odom_to_tf.launch.py
ROS2 Open Manipulator Control
Start the custom ROS driver:
ros2 launch go2_manipulation openmanipulator.launch.py
Note
This driver must always be running when using MoveIt or joint trajectories.
Launch MoveIt & State Publisher:
ros2 launch go2_manipulation moveit2.launch.py
ROS2 Open Manipulator Commands
Note
Update the namespace accordingly if required.
Test driver:
ROS_DOMAIN_ID=10 ros2 action send_goal /go2_unit_001/open_manipulator/joint_trajectory_controller/follow_joint_trajectory control_msgs/action/FollowJointTrajectory -f "{
trajectory: {
joint_names: [joint1, joint2, joint3, joint4],
points: [
{ positions: [0.1, 0.1, 0.1, 0.1], time_from_start: { sec: 2 } },
{ positions: [-0.1, -0.1, -0.1, -0.1], time_from_start: { sec: 4 } },
{ positions: [0, 0, 0, 0], time_from_start: { sec: 6 } }
]
}
}"
Home position (before turning off, GO2 prior to 06 Mar 2025):
ROS_DOMAIN_ID=10 ros2 action send_goal /go2_unit_001/open_manipulator/joint_trajectory_controller/follow_joint_trajectory control_msgs/action/FollowJointTrajectory -f "{
trajectory: {
joint_names: [joint1, joint2, joint3, joint4],
points: [
{ positions: [0.0, -1.4, 1.2, 1.2], time_from_start: { sec: 2 } },
]
}
}"
Stand position:
ROS_DOMAIN_ID=10 ros2 action send_goal /go2_unit_21576/open_manipulator/joint_trajectory_controller/follow_joint_trajectory control_msgs/action/FollowJointTrajectory -f "{
trajectory: {
joint_names: [joint1, joint2, joint3, joint4],
points: [
{ positions: [0.0, -0.2, -0.1, -0.24], time_from_start: { sec: 1 } },
]
}
}"
Home position (GO2 after 06 Mar 2025):
ROS_DOMAIN_ID=10 ros2 action send_goal /go2_unit_21576/open_manipulator/joint_trajectory_controller/follow_joint_trajectory control_msgs/action/FollowJointTrajectory -f "{
trajectory: {
joint_names: [joint1, joint2, joint3, joint4],
points: [
{ positions: [0.0, -1.7, 1.4, 1.2], time_from_start: { sec: 2 } },
]
}
}"
Close gripper (before turning off):
ROS_DOMAIN_ID=10 ros2 action send_goal /go2_unit_21576/open_manipulator/gripper_controller/follow_joint_trajectory control_msgs/action/FollowJointTrajectory -f "{
trajectory: {
joint_names: [gripper],
points: [
{ positions: [1.0], time_from_start: { sec: 2 } },
]
}
}"
Open gripper:
ROS_DOMAIN_ID=10 ros2 action send_goal /go2_unit_21576/open_manipulator/gripper_controller/follow_joint_trajectory control_msgs/action/FollowJointTrajectory -f "{
trajectory: {
joint_names: [gripper],
points: [
{ positions: [-1.0], time_from_start: { sec: 2 } },
]
}
}"
GO2 Debugging & Miscellaneous
This section provides instructions for debugging, network setup, camera streaming, manipulator control, and recommended hardware enhancements.
Debugging
RQT GUI
Launch the RQT GUI for ROS2:
ROS_DOMAIN_ID=10 ros2 run rqt_gui rqt_gui --ros-args --remap tf:=/go2_unit_21576/tf --ros-args --remap tf_static:=/go2_unit_21576/tf_static
TF Visualization
View TF tree in RQT:
ROS_DOMAIN_ID=10 ros2 run rqt_tf_tree rqt_tf_tree --force-discover --ros-args --remap tf:=/go2_unit_21576/tf --ros-args --remap tf_static:=/go2_unit_21576/tf_static
Generate TF frames diagram:
ROS_DOMAIN_ID=10 ros2 run tf2_tools view_frames.py --force-discover --ros-args --remap tf:=/go2_unit_21576/tf --ros-args --remap tf_static:=/go2_unit_21576/tf_static
Miscellaneous
Internet via LAN
Connect the GO2 to a router with internet access via LAN:
sudo ip link set eth0 down && sudo ip link set eth0 up
sudo dhclient eth0
Wait 10–30 seconds, then update packages:
sudo apt-get update
Update date and time automatically:
sudo date -s "$(wget --method=HEAD -qSO- --max-redirect=0 google.com 2>&1 | sed -n 's/^ *Date: *//p')"
Fix GO2 USB 2.0 → 3.0 Port (2024 Models)
Backup the current device tree:
sudo cp /boot/dtb/kernel_tegra234-p3767-0000-p3768-0000-a0.dtb kernel_tegra234-p3767-0000-p3768-0000-a0.dtb.bak
Download the latest device tree:
Copy the updated device tree to the boot directory:
sudo cp kernel_tegra234-p3767-0000-p3768-0000-a0.dtb /boot/dtb/ -r
Restart the system for changes to take effect.
Sync Host and GO2 Computers
Synchronize source files using rsync:
rsync -avP -t --delete -e ssh src unitree@192.168.123.18://opt/mybotshop
Camera Stream via Terminal (Non-ROS)
View video stream directly from terminal (replace multicast-iface
with the network interface, e.g., eth0
):
gst-launch-1.0 udpsrc address=230.1.1.1 port=1720 multicast-iface=eth0 ! application/x-rtp, media=video, encoding-name=H264 ! rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! autovideosink
Faster version:
gst-launch-1.0 udpsrc address=230.1.1.1 port=1720 multicast-iface=eth0 ! \
application/x-rtp, media=video, encoding-name=H264 ! \
rtph264depay ! queue max-size-buffers=1 ! h264parse ! queue ! avdec_h264 ! \
videoconvert ! autovideosink
Open Manipulator X (Independent)
Launch Open Manipulator X Controller:
ros2 launch open_manipulator_x_controller open_manipulator_x_controller.launch.py
Teleoperate Open Manipulator X:
ros2 run open_manipulator_x_teleop teleop_keyboard
Enhancements
WiFi Stick
We recommend using a long-range WiFi stick, such as TL-WN722N, or any high-end long-range WiFi stick for remote operation.

Connection Hub
For connecting a screen or expanding ports, we recommend a USB-C hub such as Ugreen USB-C Hub with HDMI for testing and debugging.
Latest QRE GO2 Updates
Important
The latest updates are available from the qre_go2 GitHub repository. If access is required, email support@mybotshop.de with your GitHub username and purchase ID.