text: from .cassiemujoco_ctypes import *
  import os
  import ctypes
  import numpy as np
  
  class CassieUdp:
      def __init__(self, remote_addr='127.0.0.1', remote_port='25000',
                   local_addr='0.0.0.0', local_port='25001'):
          self.sock = udp_init_client(str.encode(remote_addr),
                                      str.encode(remote_port),
                                      str.encode(local_addr),
                                      str.encode(local_port))
          self.packet_header_info = packet_header_info_t()
          self.recvlen = 2 + 697
          self.sendlen = 2 + 58
          self.recvlen_pd = 2 + 493
          self.sendlen_pd = 2 + 476
          self.recvbuf = (ctypes.c_ubyte * max(self.recvlen, self.recvlen_pd))()
          self.sendbuf = (ctypes.c_ubyte * max(self.sendlen, self.sendlen_pd))()
          self.inbuf = ctypes.cast(ctypes.byref(self.recvbuf, 2),
                                   ctypes.POINTER(ctypes.c_ubyte))
          self.outbuf = ctypes.cast(ctypes.byref(self.sendbuf, 2),
                                    ctypes.POINTER(ctypes.c_ubyte))
  
      def send(self, u):
          pack_cassie_user_in_t(u, self.outbuf)
          send_packet(self.sock, self.sendbuf, self.sendlen, None, 0)
  
      def send_pd(self, u):
          pack_pd_in_t(u, self.outbuf)
          send_packet(self.sock, self.sendbuf, self.sendlen_pd, None, 0)
  
      def recv_wait(self):
          nbytes = -1
          while nbytes != self.recvlen:
              nbytes = get_newest_packet(self.sock, self.recvbuf, self.recvlen,
                                         None, None)
          process_packet_header(self.packet_header_info,
                                self.recvbuf, self.sendbuf)
          cassie_out = cassie_out_t()
          unpack_cassie_out_t(self.inbuf, cassie_out)
          return cassie_out
  
      def recv_wait_pd(self):
          nbytes = -1
          while nbytes != self.recvlen_pd:
              nbytes = get_newest_packet(self.sock, self.recvbuf, self.recvlen_pd,
                                         None, None)
          process_packet_header(self.packet_header_info,
                                self.recvbuf, self.sendbuf)
          state_out = state_out_t()
          unpack_state_out_t(self.inbuf, state_out)
          return state_out
  
      def recv_newest(self):
          nbytes = get_newest_packet(self.sock, self.recvbuf, self.recvlen,
                                     None, None)
          if nbytes != self.recvlen:
              return None
          process_packet_header(self.packet_header_info,
                                self.recvbuf, self.sendbuf)
          cassie_out = cassie_out_t()
          unpack_cassie_out_t(self.inbuf, cassie_out)
          return cassie_out
  
      def recv_newest_pd(self):
          nbytes = get_newest_packet(self.sock, self.recvbuf, self.recvlen_pd,
                                     None, None)
          if nbytes != self.recvlen_pd:
              return None
          process_packet_header(self.packet_header_info,
                                self.recvbuf, self.sendbuf)
          state_out = state_out_t()
          unpack_state_out_t(self.inbuf, state_out)
          return state_out
  
      def delay(self):
          return ord(self.packet_header_info.delay)
  
      def seq_num_in_diff(self):
          return ord(self.packet_header_info.seq_num_in_diff)
  
      def __del__(self):
          udp_close(self.sock)