Edit on GitHub

Step 6: Simultaneous Reading of Multiple DYNAMIXELs

NOTE: This tutorial explains how to write code using the Dynamixel Easy SDK. It assumes that you have already installed the SDK.

Make cpp file

Check the Port Names

Source Code Description

#include "dynamixel_easy_sdk/dynamixel_easy_sdk.hpp"

int main(){

  dynamixel::Connector connector("/dev/ttyACM0", 57600);
  std::unique_ptr<dynamixel::GroupExecutor> group_executor = connector.createGroupExecutor();
  std::unique_ptr<dynamixel::Motor> motor1 = connector.createMotor(1);
  std::unique_ptr<dynamixel::Motor> motor2 = connector.createMotor(2);

  group_executor->addCmd(motor1->stageGetPresentPosition());
  group_executor->addCmd(motor2->stageGetPresentPosition());
  auto result = group_executor->executeRead();
  group_executor->clearStagedReadCommands();

  int motor1_position = result.value()[0].value();
  int motor2_position = result.value()[1].value();
  std::cout << "Motor1 Present Position: " << motor1_position << std::endl;
  std::cout << "Motor2 Present Position: " << motor2_position << std::endl;
}

Add Header Files

Create Connector and Motor Object

Read Data from Multiple Motors Simultaneously

Error Handling

Compile and Run

Full Source Code With Error Handling

#include "dynamixel_easy_sdk/dynamixel_easy_sdk.hpp"

int main(){

  dynamixel::Connector connector("/dev/ttyUSB0", 57600);
  std::unique_ptr<dynamixel::GroupExecutor> group_executor = connector.createGroupExecutor();
  std::unique_ptr<dynamixel::Motor> motor1 = connector.createMotor(1);
  std::unique_ptr<dynamixel::Motor> motor2 = connector.createMotor(2);

  auto result_cmd = motor1->stageGetPresentPosition();
  if (!result_cmd.isSuccess()) {
    std::cerr << dynamixel::getErrorMessage(result_cmd.error()) << std::endl;
    return 1;
  }
  group_executor->addCmd(result_cmd.value());

  result_cmd = motor2->stageGetPresentPosition();
  if (!result_cmd.isSuccess()) {
    std::cerr << dynamixel::getErrorMessage(result_cmd.error()) << std::endl;
    return 1;
  }
  group_executor->addCmd(result_cmd.value());

  auto result = group_executor->executeRead();
  if (!result.isSuccess()) {
    std::cerr << dynamixel::getErrorMessage(result.error()) << std::endl;
    return 1;
  }
  group_executor->clearStagedReadCommands();

  std::vector<int> positions;
  for (const auto& result : result.value()) {
    if (!result.isSuccess()) {
      std::cerr << dynamixel::getErrorMessage(result.error()) << std::endl;
      return 1;
    }
    positions.push_back(result.value());
  }
  std::cout << "Motor1 Present Position: " << positions[0] << std::endl;
  std::cout << "Motor2 Present Position: " << positions[1] << std::endl;
}