Logan's robot

G1 in Mujoco: Getting started

If you'd like to test out the G1 in Unitree's Mujoco repo, you'll need to modify two files:

simulate_python/config.py

Update the top two variables

ROBOT = "g1" # Robot name, "go2", "b2", "b2w", "h1", "go2w", "g1" 
ROBOT_SCENE = "../unitree_robots/" + ROBOT + "/scene_23dof.xml" # Robot scene

simulate_python/test/test_unitree_sdk2.py

import time
from unitree_sdk2py.core.channel import ChannelFactoryInitialize
from unitree_sdk2py.core.channel import ChannelPublisher, ChannelSubscriber
from unitree_sdk2py.idl.default import unitree_hg_msg_dds__LowState_
from unitree_sdk2py.idl.default import unitree_hg_msg_dds__LowCmd_
from unitree_sdk2py.idl.unitree_hg.msg.dds_ import LowState_
from unitree_sdk2py.idl.unitree_hg.msg.dds_ import LowCmd_
from unitree_sdk2py.utils.crc import CRC


def LowStateHandler(msg: LowState_):
    print("IMU state: ", msg.imu_state)

if __name__ == "__main__":
    ChannelFactoryInitialize(1, "lo")
    low_state_suber = ChannelSubscriber("rt/lowstate", LowState_)
    low_state_suber.Init(LowStateHandler, 10)

    low_cmd_puber = ChannelPublisher("rt/lowcmd", LowCmd_)
    low_cmd_puber.Init()
    crc = CRC()

    cmd = unitree_hg_msg_dds__LowCmd_()
    cmd.mode_pr = 0  # PR mode (Pitch/Roll)
    cmd.mode_machine = 0
    for i in range(29):  # HG robot has 29 motors instead of 20
        cmd.motor_cmd[i].mode = 1  # 1:Enable, 0:Disable
        cmd.motor_cmd[i].q = 0.0
        cmd.motor_cmd[i].kp = 0.0
        cmd.motor_cmd[i].dq = 0.0
        cmd.motor_cmd[i].kd = 0.0
        cmd.motor_cmd[i].tau = 0.0
        
    while True:
        for i in range(29):  # Update all motors instead of just 12
            cmd.motor_cmd[i].q = 0.0 
            cmd.motor_cmd[i].kp = 0.0
            cmd.motor_cmd[i].dq = 0.0 
            cmd.motor_cmd[i].kd = 0.0
            cmd.motor_cmd[i].tau = 1.0 
        
        cmd.crc = crc.Crc(cmd)

        #Publish message
        low_cmd_puber.Write(cmd)
        time.sleep(0.002)

Screenshot from 2025-03-27 17-43-45 h/t to Claude and Cursor, ofc