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)
h/t to