Edit on GitHub

Step 7: OMX Teleoperation Example

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_leader("/dev/ttyACM1", 1000000);
  dynamixel::Connector connector_follower("/dev/ttyACM0", 1000000);
  std::unique_ptr<dynamixel::GroupExecutor> group_executor_leader = connector_leader.createGroupExecutor();
  std::unique_ptr<dynamixel::GroupExecutor> group_executor_follower = connector_follower.createGroupExecutor();

  std::unique_ptr<dynamixel::Motor> leader_motor1 = connector_leader.createMotor(1);
  std::unique_ptr<dynamixel::Motor> leader_motor2 = connector_leader.createMotor(2);
  std::unique_ptr<dynamixel::Motor> leader_motor3 = connector_leader.createMotor(3);
  std::unique_ptr<dynamixel::Motor> leader_motor4 = connector_leader.createMotor(4);
  std::unique_ptr<dynamixel::Motor> leader_motor5 = connector_leader.createMotor(5);
  std::unique_ptr<dynamixel::Motor> leader_motor_gripper = connector_leader.createMotor(6);

  std::unique_ptr<dynamixel::Motor> follower_motor1 = connector_follower.createMotor(11);
  std::unique_ptr<dynamixel::Motor> follower_motor2 = connector_follower.createMotor(12);
  std::unique_ptr<dynamixel::Motor> follower_motor3 = connector_follower.createMotor(13);
  std::unique_ptr<dynamixel::Motor> follower_motor4 = connector_follower.createMotor(14);
  std::unique_ptr<dynamixel::Motor> follower_motor5 = connector_follower.createMotor(15);
  std::unique_ptr<dynamixel::Motor> follower_motor_gripper = connector_follower.createMotor(16);

  follower_motor1->enableTorque();
  follower_motor2->enableTorque();
  follower_motor3->enableTorque();
  follower_motor4->enableTorque();
  follower_motor5->enableTorque();
  follower_motor_gripper->enableTorque();

  while(true){
    group_executor_leader->addCmd(leader_motor1->stageGetPresentPosition());
    group_executor_leader->addCmd(leader_motor2->stageGetPresentPosition());
    group_executor_leader->addCmd(leader_motor3->stageGetPresentPosition());
    group_executor_leader->addCmd(leader_motor4->stageGetPresentPosition());
    group_executor_leader->addCmd(leader_motor5->stageGetPresentPosition());
    group_executor_leader->addCmd(leader_motor_gripper->stageGetPresentPosition());

    auto result = group_executor_leader->executeRead();
    group_executor_leader->clearStagedReadCommands();
    int leader_motor1_position = result.value()[0].value();
    int leader_motor2_position = result.value()[1].value();
    int leader_motor3_position = result.value()[2].value();
    int leader_motor4_position = result.value()[3].value();
    int leader_motor5_position = result.value()[4].value();
    int leader_motor_gripper_position = result.value()[5].value();

    group_executor_follower->addCmd(follower_motor1->stageSetGoalPosition(leader_motor1_position));
    group_executor_follower->addCmd(follower_motor2->stageSetGoalPosition(leader_motor2_position));
    group_executor_follower->addCmd(follower_motor3->stageSetGoalPosition(leader_motor3_position));
    group_executor_follower->addCmd(follower_motor4->stageSetGoalPosition(leader_motor4_position));
    group_executor_follower->addCmd(follower_motor5->stageSetGoalPosition(leader_motor5_position));
    group_executor_follower->addCmd(follower_motor_gripper->stageSetGoalPosition(leader_motor_gripper_position));
    auto result_void = group_executor_follower->executeWrite();
    group_executor_follower->clearStagedWriteCommands();
  }
}

Add Header Files

Create Connector and Motor Object

NOTE:

  • Port names may vary depending on your system configuration.
  int main(){
    dynamixel::Connector connector_leader("/dev/ttyACM1", 1000000);
    dynamixel::Connector connector_follower("/dev/ttyACM0", 1000000);

Enable Follower Torque

Leader and Follower Control Loop

Error Handling

Compile and Run