Skip to content

ATR-Lab/go2_ws

Repository files navigation

Go2 Robot Dog Workspace

A comprehensive ROS2 workspace for controlling and interacting with Unitree Go2 robot dogs, featuring advanced computer vision, human interaction, and performance-optimized video streaming.

Recent Performance Optimizations

WebRTC Video Stream Analysis (January 2025)

We conducted a comprehensive analysis of the WebRTC communication layer to identify video streaming bottlenecks and H.264 decoder issues.

WebRTC SDP Negotiation Analysis

Problem: Persistent H.264 decoder errors (No start code is found, Error splitting the input into NAL units, non-existing PPS 0 referenced)

Investigation Results:

  • SDP Negotiation Working Correctly: Robot properly negotiates H.264 Baseline profile (profile-level-id=42e01f)
  • Codec Parameters Already Optimal: Both client and robot use correct packetization-mode=1 settings
  • Issue is in WebRTC Transport Layer: H.264 packets arriving corrupted/incomplete at decoder

SDP Analysis Details:

Client Offer (Our SDK):

m=video 9 UDP/TLS/RTP/SAVPF 97 98 99 100 101 102
a=rtpmap:97 VP8/90000
a=rtpmap:99 H264/90000
a=fmtp:99 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f
a=rtpmap:101 H264/90000  
a=fmtp:101 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f

Robot Answer (Go2 Response):

m=video 9 UDP/TLS/RTP/SAVPF 101
a=rtpmap:101 H264/90000
a=fmtp:101 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=candidate:0 1 udp 2130706431 192.168.2.113 48890 typ host

Analysis:

  • Client offers: VP8 + 2 H.264 profiles (42001f, 42e01f) with optimal parameters
  • Robot selects: H.264 codec 101 with Baseline profile (42e01f) using our suggested parameters
  • Network: Direct UDP connection to 192.168.2.113:48890
  • Result: Robot intelligently chose the best codec from our offer - SDP negotiation working perfectly
  • Issue: Packet-level corruption during WebRTC transport (after successful negotiation)
Complete Raw SDP Exchange

Full Client SDP Offer:

v=0
o=- 3966375704 3966375704 IN IP4 0.0.0.0
s=-
t=0 0
a=group:BUNDLE 0 1
a=msid-semantic:WMS *
m=video 9 UDP/TLS/RTP/SAVPF 97 98 99 100 101 102
c=IN IP4 0.0.0.0
a=recvonly
a=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=mid:0
a=msid:153ffb7b-6fab-4d28-8c8d-0523ea88b215 112f41df-3f71-45d3-96a3-9e1092823adb
a=rtcp:9 IN IP4 0.0.0.0
a=rtcp-mux
a=ssrc-group:FID 3115696685 3103399473
a=ssrc:3115696685 cname:81bf4672-ec5d-4168-98ad-d4901a1aa935
a=ssrc:3103399473 cname:81bf4672-ec5d-4168-98ad-d4901a1aa935
a=rtpmap:97 VP8/90000
a=rtcp-fb:97 nack
a=rtcp-fb:97 nack pli
a=rtcp-fb:97 goog-remb
a=rtpmap:98 rtx/90000
a=fmtp:98 apt=97
a=rtpmap:99 H264/90000
a=rtcp-fb:99 nack
a=rtcp-fb:99 nack pli
a=rtcp-fb:99 goog-remb
a=fmtp:99 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f
a=rtpmap:100 rtx/90000
a=fmtp:100 apt=99
a=rtpmap:101 H264/90000
a=rtcp-fb:101 nack
a=rtcp-fb:101 nack pli
a=rtcp-fb:101 goog-remb
a=fmtp:101 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=rtpmap:102 rtx/90000
a=fmtp:102 apt=101
a=ice-ufrag:KIds
a=ice-pwd:bJVeZk1ZTiAhinux5ayAPk
a=fingerprint:sha-256 4B:BA:F4:A0:EB:32:AC:92:E4:39:52:DE:7B:12:81:AA:25:72:9B:F1:A3:7A:F4:C3:31:C1:46:03:C9:33:69:0A
a=setup:actpass
m=application 9 DTLS/SCTP 5000
c=IN IP4 0.0.0.0
a=mid:1
a=sctpmap:5000 webrtc-datachannel 65535
a=max-message-size:65536
a=ice-ufrag:KIds
a=ice-pwd:bJVeZk1ZTiAhinux5ayAPk
a=fingerprint:sha-256 4B:BA:F4:A0:EB:32:AC:92:E4:39:52:DE:7B:12:81:AA:25:72:9B:F1:A3:7A:F4:C3:31:C1:46:03:C9:33:69:0A
a=setup:actpass

Full Robot SDP Answer:

v=0
o=- 1558803594 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 0 1
a=msid-semantic: WMS myKvsVideoStream
m=video 9 UDP/TLS/RTP/SAVPF 101
c=IN IP4 127.0.0.1
a=candidate:0 1 udp 2130706431 192.168.2.113 48890 typ host raddr 0.0.0.0 rport 0 generation 0 network-cost 999
a=msid:unitreeMediaStream unitreeVideoTrack
a=ssrc:1611937682 cname:LuhoTlphzp1/lZ+r
a=ssrc:1611937682 msid:unitreeMediaStream unitreeVideoTrack
a=ssrc:1611937682 mslabel:unitreeMediaStream
a=ssrc:1611937682 label:unitreeVideoTrack
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:Ta41
a=ice-pwd:EE/L2yY/6K0Qt607jGsbw+wd
a=ice-options:trickle
a=fingerprint:sha-256 C1:6E:52:54:1D:F6:0E:59:B7:1E:6E:2A:C3:17:1F:B0:82:48:17:78:1A:96:F1:A9:36:85:87:6E:F6:40:22:16
a=setup:active
a=mid:0
a=sendonly
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:101 H264/90000
a=fmtp:101 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=rtcp-fb:101 nack
a=rtcp-fb:101 goog-remb
m=application 9 UDP/DTLS/SCTP webrtc-datachannel
c=IN IP4 127.0.0.1
a=candidate:0 1 udp 2130706431 192.168.2.113 48890 typ host raddr 0.0.0.0 rport 0 generation 0 network-cost 999
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:Ta41
a=ice-pwd:EE/L2yY/6K0Qt607jGsbw+wd
a=fingerprint:sha-256 C1:6E:52:54:1D:F6:0E:59:B7:1E:6E:2A:C3:17:1F:B0:82:48:17:78:1A:96:F1:A9:36:85:87:6E:F6:40:22:16
a=setup:active
a=mid:1
a=sctp-port:5000

Root Cause: The problem is NOT in codec negotiation but in the WebRTC data transport mechanism itself, likely:

  • Network packet corruption during WebRTC transport
  • Incomplete H.264 frames arriving at decoder
  • Missing NAL unit headers in the stream
  • Timing/synchronization issues in the WebRTC pipeline

Next Steps: Focus on WebRTC connection state management and packet-level transport reliability rather than SDP manipulation.

Camera Video Stream Improvements (January 2025)

We've implemented significant performance optimizations for the camera video streaming system:

1. QoS Configuration Fix

Problem: Choppy video display in RViz and custom UI due to QoS mismatch

  • Root Cause: Publishers using BEST_EFFORT QoS while subscribers expected RELIABLE delivery
  • Solution: Standardized on RELIABLE QoS with depth=10 buffer for guaranteed smooth delivery
  • Impact: Eliminated frame drops and stuttering in video display

Files Modified:

  • src/go2_robot_sdk/go2_robot_sdk/presentation/go2_driver_node.py - Go2 SDK camera publishers
  • src/test_camera/test_camera/test_camera_threaded_node.py - Test camera publisher
  • src/test_camera_ui/test_camera_ui/ros_interface/frame_receiver.py - UI subscriber

2. Color Format Optimization (RGB24 Conversion)

Problem: Unnecessary BGR→RGB conversion consuming 40%+ CPU in UI

  • Root Cause: Go2 SDK converted WebRTC YUV420 → BGR24, then UI converted BGR → RGB for Qt display
  • Solution: Changed Go2 SDK to convert WebRTC YUV420 → RGB24 directly, eliminating UI conversion
  • Impact: Dramatic CPU reduction (20-40% less usage) and smoother real-time performance

Technical Details:

Previous Pipeline: WebRTC (YUV420) → Go2 SDK (BGR24) → ROS (bgr8) → UI (BGR→RGB conversion) → Qt Display
Optimized Pipeline: WebRTC (YUV420) → Go2 SDK (RGB24) → ROS (rgb8) → UI (direct display) → Qt Display

Files Modified:

  • src/go2_robot_sdk/go2_robot_sdk/presentation/go2_driver_node.py - Changed format="bgr24" to format="rgb24"
  • src/go2_robot_sdk/go2_robot_sdk/domain/entities/robot_data.py - Updated default encoding to rgb8
  • src/test_camera_ui/test_camera_ui/widgets/camera_display.py - Added adaptive BGR/RGB handling
  • src/test_camera_ui/test_camera_ui/ros_interface/frame_receiver.py - Added encoding detection

3. Architecture Insights

RViz vs Custom UI Behavior:

  • RViz: Automatically handles multiple image encodings (rgb8, bgr8, etc.) without code changes
  • Custom UI: Required explicit updates to handle format changes, but provides more optimization control

QoS Selection Guidelines:

  • RELIABLE QoS: Use for human display, video recording, sequence analysis (guarantees frame delivery)
  • BEST_EFFORT QoS: Use for real-time AI processing where latest frame matters more than completeness

Performance Results

After optimizations:

  • Smooth 30 FPS video in both RViz and custom UI
  • 40%+ CPU reduction in video display processing
  • Eliminated frame drops and stuttering
  • Better real-time performance for computer vision tasks
  • Backward compatibility maintained for existing BGR sources

Quick Start

Launch Camera System

# Activate workspace
source install/setup.bash

# Launch threaded camera with optimized settings
ros2 launch test_camera threaded_camera_only.launch.py

# Launch camera UI (separate terminal)
ros2 launch test_camera_ui camera_ui.launch.py

# Launch Go2 robot with optimized camera stream
ros2 launch go2_robot_sdk robot.launch.py

View in RViz

# Launch RViz
rviz2

# Add Image display
# Set topic to: /camera/image_raw
# Encoding will be automatically detected (rgb8 or bgr8)

Architecture

This workspace implements a multi-threaded, performance-optimized architecture:

  • Threaded Camera Nodes: Separate capture, processing, and publishing threads
  • Qt-based UI: Professional video display with performance monitoring
  • Adaptive Format Handling: Supports both RGB and BGR video sources
  • Optimized QoS: RELIABLE delivery for smooth video, configurable for different use cases

Packages

  • go2_robot_sdk - Core Go2 robot communication and control
  • test_camera - Camera capture and streaming (threaded architecture)
  • test_camera_ui - Qt-based video display interface
  • human_interaction - Computer vision for human detection and gesture recognition
  • speech_processor - Audio processing and text-to-speech
  • navigation_manager - Autonomous navigation and mapping

For detailed package documentation, see individual package README files.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •  

Languages