Bulk read present current XM430_w350T

  1. State the model of servo, or ROBOTIS edutainment kit, you are using.
    XM430_W350T

  2. Specify which software you are using. Tag your post with the relevant software (or create a tag). (Note: “R+” is written in tags as “Rplus”)
    Dynamixel_SDK

  3. Describe your control environment. This includes the controller or interface, operating system (and version #) of your computer, and any power source you are using.
    Ubuntu 18.04

  4. For programming posts, state any libraries or example code you are using.
    Library Used is Dynamixel_SDK
    Programming Language: Python3
    Protocol: 2

I am trying to bulk read the present position and present current from several dynamixel motors simultaneously while it is moving. To test the code, I have written the following program for one Dynamixel motor by referring the sample code provided in the Dynamixel_SDK workbench.

import os
if os.name == 'nt':
import msvcrt
def getch():
    return msvcrt.getch().decode()
else:
import sys, tty, termios
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
def getch():
    try:
        tty.setraw(sys.stdin.fileno())
        ch = sys.stdin.read(1)
    finally:
        termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
    return ch

from dynamixel_sdk import *                    # Uses Dynamixel SDK library

# Control table address
ADDR_PRO_TORQUE_ENABLE      = 64               # Control table address is different in Dynamixel model
ADDR_PRO_GOAL_POSITION      = 116
ADDR_PRO_PRESENT_POSITION   = 132
ADDR_PRESENT_CURRENT        = 168

# Data Byte Length
LEN_PRO_GOAL_POSITION       = 4
LEN_PRO_PRESENT_POSITION    = 4
LEN_PRESENT_CURRENT         = 2

# Protocol version
PROTOCOL_VERSION            = 2.0               # See which protocol version is used in the Dynamixel

# Default setting
DXL1_ID                     = 1                 # Dynamixel#1 ID : 1
BAUDRATE                    = 1000000             # Dynamixel default baudrate : 57600
DEVICENAME                  = '/dev/ttyUSB0'    # Check which port is being used on your controller
                                            # ex) Windows: "COM1"   Linux: "/dev/ttyUSB0" Mac: 
 "/dev/tty.usbserial-*"

TORQUE_ENABLE               = 1                 # Value for enabling the torque
TORQUE_DISABLE              = 0                 # Value for disabling the torque
DXL_MINIMUM_POSITION_VALUE  = 100           # Dynamixel will rotate between this value
DXL_MAXIMUM_POSITION_VALUE  = 4000            # and this value (note that the Dynamixel would not move when the position value is out of movable range. Check e-manual about the range of the Dynamixel you use.)
DXL_MOVING_STATUS_THRESHOLD = 20                # Dynamixel moving status threshold

index = 0
dxl_goal_position = [DXL_MINIMUM_POSITION_VALUE, DXL_MAXIMUM_POSITION_VALUE]        # 
Goal position


# Initialize PortHandler instance
# Set the port path
# Get methods and members of PortHandlerLinux or PortHandlerWindows
portHandler = PortHandler(DEVICENAME)

# Initialize PacketHandler instance
# Set the protocol version
# Get methods and members of Protocol1PacketHandler or Protocol2PacketHandler
packetHandler = PacketHandler(PROTOCOL_VERSION)

# Initialize GroupBulkWrite instance
groupBulkWrite = GroupBulkWrite(portHandler, packetHandler)

# Initialize GroupBulkRead instace for Present Position
groupBulkRead = GroupBulkRead(portHandler, packetHandler)

# Open port
if portHandler.openPort():
     print("Succeeded to open the port")
else:
       print("Failed to open the port")
       print("Press any key to terminate...")
      getch()
      quit()


# Set port baudrate
if portHandler.setBaudRate(BAUDRATE):
    print("Succeeded to change the baudrate")
else:
   print("Failed to change the baudrate")
   print("Press any key to terminate...")
  getch()
  quit()


# Enable Dynamixel#1 Torque
  dxl_comm_result, dxl_error = packetHandler.write1ByteTxRx(portHandler, DXL1_ID, 
  ADDR_PRO_TORQUE_ENABLE, TORQUE_ENABLE)
  if dxl_comm_result != COMM_SUCCESS:
      print("%s" % packetHandler.getTxRxResult(dxl_comm_result))
  elif dxl_error != 0:
        print("%s" % packetHandler.getRxPacketError(dxl_error))
  else:
   print("Dynamixel#%d has been successfully connected" % DXL1_ID)


# Add parameter storage for Dynamixel#1 present position
dxl_addparam_result = groupBulkRead.addParam(DXL1_ID, ADDR_PRO_PRESENT_POSITION, 
LEN_PRO_PRESENT_POSITION)
if dxl_addparam_result != True:
    print("[ID:%03d] groupBulkRead addparam failed for position" % DXL1_ID)
    quit()

# Add parameter storage for Dynamixel#1 current value
dxl_addparam_result = groupBulkRead.addParam(DXL1_ID, ADDR_PRESENT_CURRENT, 
LEN_PRESENT_CURRENT)
if dxl_addparam_result != True:
    print("[ID:%03d] groupBulkRead addparam failed for current" % DXL1_ID)
    quit()

while 1:
print("Press any key to continue! (or press ESC to quit!)")
if getch() == chr(0x1b):
    break

# Allocate goal position value into byte array
param_goal_position = [DXL_LOBYTE(DXL_LOWORD(dxl_goal_position[index])), DXL_HIBYTE(DXL_LOWORD(dxl_goal_position[index])), DXL_LOBYTE(DXL_HIWORD(dxl_goal_position[index])), DXL_HIBYTE(DXL_HIWORD(dxl_goal_position[index]))]

# Add Dynamixel#1 goal position value to the Bulkwrite parameter storage
dxl_addparam_result = groupBulkWrite.addParam(DXL1_ID, ADDR_PRO_GOAL_POSITION, LEN_PRO_GOAL_POSITION, param_goal_position)
if dxl_addparam_result != True:
    print("[ID:%03d] groupBulkWrite addparam failed" % DXL1_ID)
    quit()

     #Clear bulkwrite parameter storage
   groupBulkWrite.clearParam()

 while 1:
    # Bulkread present position and current 
    dxl_comm_result = groupBulkRead.txRxPacket()
    if dxl_comm_result != COMM_SUCCESS:
        print("%s" % packetHandler.getTxRxResult(dxl_comm_result))

    # Check if groupbulkread data of Dynamixel#1 is available
    dxl_getdata_result = groupBulkRead.isAvailable(DXL1_ID, ADDR_PRO_PRESENT_POSITION, LEN_PRO_PRESENT_POSITION)
    if dxl_getdata_result != True:
        print("[ID:%03d] groupBulkRead getdata failed for present position" % DXL1_ID)
        quit()

    # Check if groupbulkread data of Dynamixel#1 is available
    dxl_getdata_result = groupBulkRead.isAvailable(DXL1_ID, ADDR_PRESENT_CURRENT, LEN_PRESENT_CURRENT)
    if dxl_getdata_result != True:
        print("[ID:%03d] groupBulkRead getdata failed for present current" % DXL1_ID)
        quit()

    # Get present position value
    dxl1_present_position = groupBulkRead.getData(DXL1_ID, ADDR_PRO_PRESENT_POSITION, LEN_PRO_PRESENT_POSITION)

    # Get current value
    dxl1_current_value_read = groupBulkRead.getData(DXL1_ID, ADDR_PRESENT_CURRENT, LEN_PRESENT_CURRENT)

    print("[ID:%03d] Present Position : %d \t [ID:%03d] current Value: %d" % (DXL1_ID, dxl1_present_position, DXL1_ID, dxl1_current_value_read))

    if not (abs(dxl_goal_position[index] - dxl1_present_position) > DXL_MOVING_STATUS_THRESHOLD):
        break

# Change goal position
if index == 0:
    index = 1
else:
    index = 0

# Clear bulkread parameter storage
groupBulkRead.clearParam()

# Disable Dynamixel#1 Torque
dxl_comm_result, dxl_error = packetHandler.write1ByteTxRx(portHandler, DXL1_ID, 
ADDR_PRO_TORQUE_ENABLE, TORQUE_DISABLE)
if dxl_comm_result != COMM_SUCCESS:
    print("%s" % packetHandler.getTxRxResult(dxl_comm_result))
elif dxl_error != 0:
     print("%s" % packetHandler.getRxPacketError(dxl_error))


# Close port
portHandler.closePort()Preformatted text

**When i run the code, i am getting the following failure message: **

Succeeded to open the port
Succeeded to change the baudrate
Dynamixel#1 has been successfully connected
Press any key to continue! (or press ESC to quit!)
[ID:001] groupBulkRead getdata failed for present current

Can anyone help me figure out this error. What is the mistake in the code?