Source code for go2.hardware.native.native_hardware_movement
import sys
from typing import Tuple
from typing_extensions import override
from unitree_sdk2py.core.channel import ChannelFactoryInitialize
from unitree_sdk2py.go2.sport.sport_client import SportClient
from ..hardware_interface_movement import HardwareInterfaceMovement
[docs]
class NativeHardwareMovement(HardwareInterfaceMovement):
"""
Movement hardware interface to execute on the Unitree GO2 itself.
This implementation communicates with the real robot using ``unitree_sdk2py``.
It can only used for native execution on the robot.
Warnings
--------
- This class issues real hardware commands.
- Improper use may cause unexpected robot motion.
"""
def __init__(self):
self._sport_client = None
self._initialized = False
[docs]
@override
def _initialize(self) -> None:
"""
Initialize the Unitree SDK connection.
This method sets up DDS communication and initializes the sport client.
"""
if self._initialized:
return
# TODO: Pull this into yaml or ctor?
if len(sys.argv) < 2:
ChannelFactoryInitialize(1, "lo")
else:
ChannelFactoryInitialize(0, sys.argv[1])
self._sport_client = SportClient()
self._sport_client.Init()
self._sport_client.SetTimeout(3.0)
self._initialized = True
[docs]
@override
def _shutdown(self) -> None:
if self._sport_client:
self._sport_client.StopMove()
[docs]
@override
def _move(self, vx: float, vy: float) -> None:
if self._sport_client:
self._sport_client.Move(vx, vy, 0)
[docs]
@override
def _rotate(self, vrot: float):
if self._sport_client:
self._sport_client.Move(0, 0, vrot)
[docs]
@override
def _stand_up(self) -> None:
if self._sport_client:
self._sport_client.StandUp()
[docs]
@override
def _stand_down(self) -> None:
if self._sport_client:
self._sport_client.StandDown()
[docs]
@override
def _stop_move(self) -> None:
if self._sport_client:
self._sport_client.StopMove()
@override
def _damp(self) -> None:
if self._sport_client:
self._sport_client.Damp()
@override
def _balance_stand(self) -> None:
if self._sport_client:
self._sport_client.BalanceStand()
@override
def _recovery_stand(self) -> None:
if self._sport_client:
self._sport_client.RecoveryStand()
@override
def _euler(self, roll: float, pitch: float, yaw: float) -> None:
if self._sport_client:
self._sport_client.Euler(roll, pitch, yaw)
@override
def _sit(self) -> None:
if self._sport_client:
self._sport_client.Sit()
@override
def _rise_sit(self) -> None:
if self._sport_client:
self._sport_client.RiseSit()
@override
def _speed_level(self, level: int) -> None:
if self._sport_client:
self._sport_client.SpeedLevel(level)
@override
def _hello(self) -> None:
if self._sport_client:
self._sport_client.Hello()
@override
def _stretch(self) -> None:
if self._sport_client:
self._sport_client.Stretch()
@override
def _content(self) -> None:
if self._sport_client:
self._sport_client.Content()
@override
def _dance1(self) -> None:
if self._sport_client:
self._sport_client.Dance1()
@override
def _dance2(self) -> None:
if self._sport_client:
self._sport_client.Dance2()
@override
def _switch_joystick(self, on: bool) -> None:
if self._sport_client:
self._sport_client.SwitchJoystick(on)
@override
def _pose(self, flag: bool) -> None:
if self._sport_client:
self._sport_client.Pose(flag)
@override
def _scrape(self) -> None:
if self._sport_client:
self._sport_client.Scrape()
@override
def _front_flip(self) -> None:
if self._sport_client:
self._sport_client.FrontFlip()
@override
def _front_jump(self) -> None:
if self._sport_client:
self._sport_client.FrontJump()
@override
def _front_pounce(self) -> None:
if self._sport_client:
self._sport_client.FrontPounce()
@override
def _heart(self) -> None:
if self._sport_client:
self._sport_client.Heart()
@override
def _left_flip(self) -> None:
if self._sport_client:
self._sport_client.LeftFlip()
@override
def _back_flip(self) -> None:
if self._sport_client:
self._sport_client.BackFlip()
@override
def _free_walk(self) -> None:
if self._sport_client:
self._sport_client.FreeWalk()
@override
def _free_bound(self, flag: bool) -> None:
if self._sport_client:
self._sport_client.FreeBound(flag)
@override
def _free_jump(self, flag: bool) -> None:
if self._sport_client:
self._sport_client.FreeJump(flag)
@override
def _free_avoid(self, flag: bool) -> None:
if self._sport_client:
self._sport_client.FreeAvoid(flag)
@override
def _walk_upright(self, flag: bool) -> None:
if self._sport_client:
self._sport_client.WalkUpright(flag)
@override
def _cross_step(self, flag: bool) -> None:
if self._sport_client:
self._sport_client.CrossStep(flag)
@override
def _static_walk(self) -> None:
if self._sport_client:
self._sport_client.StaticWalk()
@override
def _trot_run(self) -> None:
if self._sport_client:
self._sport_client.TrotRun()
@override
def _hand_stand(self, flag: bool) -> None:
if self._sport_client:
self._sport_client.HandStand(flag)
@override
def _classic_walk(self, flag: bool) -> None:
if self._sport_client:
self._sport_client.ClassicWalk(flag)
@override
def _auto_recovery_set(self, enabled: bool) -> None:
if self._sport_client:
self._sport_client.AutoRecoverySet(enabled)
@override
def _auto_recovery_get(self) -> Tuple[int, bool | None]:
if self._sport_client:
return self._sport_client.AutoRecoveryGet()
return 1, None
@override
def _switch_avoid_mode(self) -> None:
if self._sport_client:
self._sport_client.SwitchAvoidMode()