...
POST No. 2408063
OpenCR + MX-106 + ROS using arduino IDE
2021-07-08 12:36:16 dchang16
Hello, I am trying to control a multi-axis motors using OpenCR and MX-106 using ROS and arduino IDE, but I would like to get some help since I have some problems.
[ In the Korean version of my account (robotis.com/service), I had some issue in my membership registration, so I inevitably post on the English version of the site. Therefore, even if you reply in Korean, I can reply. ]

Briefly about the current system I am working on, the OpenCR arduino version of DynamixelSDK c++ code and ROS Serial has been used.
And, the status of MX-106 is read (using GroupBulkRead) and the motor set-values are updated every 4ms from the python code outside the arduino via ROS topic or service node.
In the arduino code, those values are subscribed and sync-written to the motors (using GroupSyncWrite).
For ROS setup, WSL1 allows to connect to the arduino serial node and the each command of motor set-values is updated every 4ms through topic or service node in a different python program.  

Regarding this system, I have two different questions.
1)
For some reason, the arduino DynamixelSDK c++ codes (protocol version 2) didn't work for the most part (at least, all the code I tested).
I wonder if there is another compatibility part with the MX motor that I am not aware of.
Even, in the case of protocol version 1.0, the example code seems to work only when the baudrate is set to 1000000.

2) I would like to use GroupBulkRead and GroupSyncWrite as class member object.
In all arduino examples, GroupBulkRead and GroupSyncWrite instances seems works globally as follows:
dynamixel::GroupBulkRead _groupBulkRead(portHandler, packetHandler);

For example,
Since I use the arduino c++ class, the class header file is as follows:

dynamixel::PortHandler* portHandler;
dynamixel::PacketHandler* packetHandler;
dynamixel::GroupBulkRead* groupBulkRead;
dynamixel::GroupSyncWrite* groupSyncWrite;

In the cpp file, in Init() in my class, I would like to use as follows (new or malloc()):

portHandler = dynamixel::PortHandler::getPortHandler(DEVICE_NAME);
groupBulkRead = new dynamixel::GroupBulkRead(portHandler, packetHandler);
groupSyncWrite = new dynamixel::GroupSyncWrite(portHandler, packetHandler, ADDR_MX_GOAL_POSITION, LEN_MX_GOAL_POSITION);

I was wondering if there could be any special problems when used them like this in terms of interal memory inside Dynamixel SDK.
_______________________________________________________________________________________________________________________
안녕하세요, 저는 OpenCR 보드와 MX-106 모터들을 ROS와 arduino IDE를 사용하여 제어하려고 합니다. 몇 가지 문제점이 있어 도움을 받고자 글을 남깁니다.
(아 사실, 한국말 버전 사이트에서 회원 가입이 잘 안 되어서, 부득이하게 영어 버전 사이트에 글을 올리는데 사실 한글로 답을 주셔도 제가 확인할 수 있습니다.)

제가 구성하고 있는 시스템에 대해 간단히 설명을 드리면, 현재 DynamixelSDK c++ code example의 일부들을 사용하여 custom class로 만들어서 ROS node와 연결하고 arduino IDE를 통해 코드가 compile됩니다.

arduino 코드에서는, MX-106 모터들의 상태를 읽고 (이 때, GroupBulkRead 사용), 원하는 모터값들은 ROS message로 구독되고 모터에 전달됩니다 (이 때, GroupSyncWrite 사용).
WSL1를 사용해서 arduino serial node를 open했고, 모터 설정 값들의 각 명령은 다른 파이썬 프로그램의 주제 또는 서비스 노드를 통해 4ms마다 업데이트됩니다.

이 시스템과 관련하여 두 가지 다른 질문이 있습니다.
1)
어떤 이유로 arduino DynamixelSDK c++ 코드(프로토콜 버전 2)는 대부분(적어도 내가 테스트한 모든 코드)에서 작동하지 않았습니다.
혹시 제가 모르는 MX 모터와 호환되는 부분이 또 있는지 궁금합니다.
프로토콜 버전 1.0의 경우에도 baudrate가 1000000으로 설정된 경우에만 예제 코드가 작동하는 것 같습니다.

2) 저는 GroupBulkRead 및 GroupSyncWrite를 클래스 멤버 개체로 사용하고 싶습니다.
모든 arduino 예제에서 GroupBulkRead 및 GroupSyncWrite 인스턴스는 다음과 같이 전역적으로 사용되는 것 같습니다.
dynamixel::GroupBulkRead _groupBulkRead(portHandler, packetHandler);

예를 들면, 저는 arduino C++ 클래스 헤더에서는 아래와 같이,

dynamixel::PortHandler* portHandler;
dynamixel::PacketHandler* packetHandler;
dynamixel::GroupBulkRead* groupBulkRead;
dynamixel::GroupSyncWrite* groupSyncWrite;

cpp 파일에서 제 클래스의 Init()에서 다음과 같이 사용하고 싶습니다 (new or malloc()).

portHandler = dynamixel::PortHandler::getPortHandler(DEVICE_NAME);
groupBulkRead = new dynamixel::GroupBulkRead(portHandler, packetHandler);
groupSyncWrite = new dynamixel::GroupSyncWrite(portHandler, packetHandler, ADDR_MX_GOAL_POSITION, LEN_MX_GOAL_POSITION);

이렇게 사용하면 SDK 내부의 메모리 관련하여 특별한 이슈가 없는지 궁금합니다.
2021-07-08 12:36:16
dchang16
2021-07-09 14:46:25 Will Son

안녕하세요,


contactus2@robotis.com으로 국내 사이트 계정 관련 문의를 주시면 담당직원을 통해 도움드리겠습니다.

문의하신 내용에 아래와 같이 답변드립니다.


  1. 말씀하신 "arduino DynamixelSDK c++ 코드"가 무엇인지 정확히 모르겠으나, Arduino IDE의 OpenCR 보드 패키지에 포함된 예제는 특정 다이나믹셀의 기본 설정을 기준으로 작성되어있습니다.
    예를 들어, read_write.ino 예제의 경우 다이나믹셀 PRO 시리즈의 컨트롤테이블 주소와 초기값 ID = 1, Baudrate = 57600bps 로 설정되어 있습니다.
    MX를 사용할 경우 eManual을 참고하셔서 컨트롤 테이블과 최대 최소 위치값 등의 정의를 수정해주시기 바랍니다.
    특정 baudrate에서만 코드가 동작한다면, 다이나믹셀 자체의 baudrate이 1Mbps로 설정되어 있을 수 있습니다. 다이나믹셀의 통신속도와 예제의 통신속도를 동일하게 맞춰야 합니다.



  2. 임의로 수정된 코드에 대해서는 동작을 보장해드리지 않습니다.
    클래스 포인터를 생성 후 new를 이용해서 객체를 할당해도 문제가 될 것으로 보이지는 않으나, 동적 메모리 할당 대한 메모리 누수를 살펴보시기 바랍니다.
감사합니다.
2021-07-09 14:46:25
willson
2021-07-10 12:20:11 Dongjune Chang

안녕하세요, 먼저 답변을 주셔서 감사합니다. 몇가지 관련 질문이 더 있어서 답글로 질문을 드립니다.


1. 현재 제가 고려하고 있는 시스템 MX-106 6축과 OpenCR 그리고 ROS 가 원래 이론적으로 가능한 조합인지 궁금합니다
 (예제가 없어서요.. 혹시 이 조합으로 예제가 있는데 제가 못 찾고 있는 것인지 궁금합니다.)

2. 그리고 https://emanual.robotis.com/docs/en/dxl/protocol2/ 에서 보면,
------------------------------------------
MX(2.0) is a special firmware for the DYNAMIXEL MX series supporting the DYNAMIXEL Protocol 2.0.

The MX(2.0) firmware can be upgraded from the Protocol 1.0 by using the Firmware Recovery in DYNAMIXEL Wizard 2.0.
------------------------------------------

라는 부분이 있어서 firmware recovery로 들어가보니,
모터와 윈도우 / 리눅스에 직접 연결하는 것으로 보이는데 혹시 저희가 구매해야하는 다른 usb device가 필요한 것인지 궁금합니다.

3. 그리고 MX106의 경우 protocol 2가 더 선호되는지 1이 선호되는지도 궁금합니다.

감사합니다.

2021-07-10 12:20:11
dchang16
2021-07-14 17:41:04 Will Son

안녕하세요,


터틀봇3의 OpenCR ROS1 / ROS2 펌웨어에서 라즈베리파이 - OpenCR - 다이나믹셀(X시리즈 2개) 와 같이 구성하여 연결하고 있습니다.

MX도 유사한 방식으로 연결이 가능하지만 어느정도 프로그래밍과 ROS에 대한 이해도가 필요한 부분입니다.

ROS2의 경우 micro ROS Arduino 라이브러리에서 OpenCR을 지원하고 있어 Foxy환경에서 개발을 할 수 있습니다.


다이나믹셀의 펌웨어 관리나 각종 설정 및 테스트를 진행할 때에는 다이나믹셀 위자드 2.0을 추천하고 있습니다.

PC나 라즈베리파이와 같은 SBC를 다이나믹셀과 연결해주는 U2D2가 포함되어 있는 다이나믹셀 스타터 셋트를 이용하면 간편하게 다이나믹셀과 연결할 수 있습니다.

만약 USB2DYNAMIXEL을 가지고 계시다면 이를 활용하셔도 되지만 위자드 2.0의 모든 기능을 지원하는 U2D2의 사용을 추천드립니다.


MX-106, MX-64, MX-28의 경우 기본적으로 프로토콜 1.0이 설정되어 출고되지만, 필요에 따라서는 위자드 2.0의 펌웨어 복구를 통해 프로토콜 2.0 펌웨어를 사용할 수 있으며, X시리즈와 호환이 가능합니다.

이 경우 MX-106(2.0)MX-64(2.0)MX-28(2.0) 매뉴얼을 참고하시면 됩니다.


MX의 프로토콜 2.0 펌웨어는 X 시리즈의 펌웨어를 기반으로 만들어졌기 때문에 다이나믹셀 X의 최신 기능 중 일부를 사용할 수 있으며, 제어 알고리즘의 업그레이드로 더 나은 제어성능을 보여줍니다.

프로토콜 1.0으로 작성된 코드가 있다면 사용하실 수 없으므로 유의하시기 바랍니다.


감사합니다.

2021-07-14 17:41:04
willson
Reply
웹에디터 시작 웹 에디터 끝