4axis Robot Arm Project - 3 OpenCR Motor Driver

2021. 5. 22. 18:58Robot/Robot Arm 로봇팔

Control Driver

이전 개시글에서 Prototype 1을 제작했다. 따라서 목표중에 하나였던 OpenCR과 ROS를 이용한 Position제어 Driver를 한번 만들어보도록 하겠다.
목표는 다음과 같다

  1. OpenCR에 아두이노 코드를 빌드하여 엑추에이터의 상태를 Publish하는 Publisher와 외부에서 목표 각도를 입력 받는 Subscriber를 만든다. 즉 Motor Driver를 제작한다.
  2. 제작한 OpenCR Motor Driver를 컴퓨터와 연결하고 ROS 토픽을 통해 서로 정보를 교환하는 시스템을 구성해본다.

OpenCR

Robotis에서 제작한 Robot 제어기이다. 자세한 내용은 Google에 검색😁
이번에는 Dynamixel을 제어 + 컴퓨터와 Serial통신을 위한 제어기로 사용할 계획이다.

Developing Environment

- Jetson Nano (Ubuntu 18.04, ROS Melodic)

컴퓨터가 아니라 Jetson을 이용한 이유는 현재 내가 가지고있는 컴퓨팅 기기가 Macbook이랑 Jetson밖에 없어서 그냥 Jetson을 사용했다. Mac에 ROS를 설치할 수는 있는걸로 알고있지만 솔직히 Mac이 지금 메인 컴퓨터라 M1 칩 호환성 문제 때문에 개발환경 세팅하다가 한번 초기화한 이후로 세팅을 할려니 조금 무섭다. 따라서 막써도 상관 없는 Jetson을 지금 내 메인 개발 PC로 사용중이다. 상당히 불편하다.... 이에 대해서는 나중에 따로 얘기해보도록 하겠다.

  • OpenCR, Dynamixel XM430 4pc

Arduino

이번에 OpenCR을 다뤄보면서 깨달은 사실이지만 OpenCR은 아두이노와 같은 개발 보드라는점이다. 그렇담 반대로 생각해서 Arduino UNO같은것도 ROS를 사용할 수 있지 않을까?? 아두이노 시리얼 통신의 고질적인 문제점은 단방향이라는점이다 물론 통신 패킷을 만들면 되지 않는가? 라고 생각할 수 있다. 음 맞는말인것 같지만 아직 안 해봤다. 그래도 ROS연결이 된다면 굳이 복잡한 통신 패킷을 만들고 관리하는 것 보다 훨씬 편하게 통신할 수 있다고 생각한다.
암튼 이건 나중에 한번 해보도록하고 아두이노에서 ros 세팅을 해보자.

Setting

Jetson(Ubuntu)

우분투에서 세팅을 먼저 해봤었는데 사실 이건 나도 보고 따라했었기 때문에 가장 도움 많이 받았던 링크를 첨부한다. ㅎㅎ

MacBook (BigSur)

아두이노 설치

아두이노 설치 링크에서 Mac os X를 설치한다.

Library 세팅

설치하고 아두이노를 실행시킨뒤 Arduino -> preference

추가적인 보드매니저 URLs에 추가해준다.
https://raw.githubusercontent.com/ROBOTIS-GIT/OpenCR/master/arduino/opencr\_release/package\_opencr\_index.json

보드

사실 이 글을 쓰고있는 지금 이 순간에는 내 mac은 세팅이 끝나서 잘 기억이 안나지만 아마도 위의 과정을 마치면 툴 -> 보드에서 OpenCR이 나오고 선택할 수 있는것으로 기억한다. 만약 아니라면 라이브러리 관리에서 OpenCR을 검색해서 다운로드 ㄱㄱ

코딩

추가적인 보드 매니저를 추가하면 사용할 수 있는 예재파일들에 할 수 있는 예제가 많이 추가된다 한번 보고서 분석해보시길...
사실 굉장히 친절하게 설명이 되어있고, 그양이 방대해서 블로그에서 다루기에는 3%남은 내 노트북 배터리가 못 버틸 것 같다.

Control

Arduino Code

#include <ros.h>
#include <sensor_msgs/JointState.h>
#include <std_msgs/Int16.h>
#include <std_msgs/Float64MultiArray.h>
#include <std_msgs/Int16MultiArray.h>
#include <DynamixelWorkbench.h>

DynamixelWorkbench dxl_wb;
ros::NodeHandle nh;
#define BAUDRATE            57600
#define BAUDRATE_TO_DXL     1000000
#define DXL_ID1  1
#define DXL_ID2  2
#define DXL_ID3  3
#define DXL_ID4  4

double position_arr[4]={0,0,0,0};

void set_callback(const std_msgs::Float64MultiArray& msg){
  for(int i=0; i<4; i++){
    position_arr[i] = msg.data[i];
  }
}

int converter(double data){
  double w = data/180.0;
  return w*2048+2048;
}

ros::Subscriber<std_msgs::Float64MultiArray> sub("/arm", &set_callback); //Subscriber 선언

void setup() {
    Serial.begin(BAUDRATE);
    nh.initNode();

    nh.subscribe(sub);

    dxl_wb.begin("", BAUDRATE_TO_DXL);
    dxl_wb.ping(DXL_ID1);
    dxl_wb.ping(DXL_ID2);
    dxl_wb.ping(DXL_ID3);
    dxl_wb.ping(DXL_ID4);
    dxl_wb.jointMode(DXL_ID1);
    dxl_wb.jointMode(DXL_ID2);
    dxl_wb.jointMode(DXL_ID3);
    dxl_wb.jointMode(DXL_ID4);

}

void loop() {
    dxl_wb.goalPosition(DXL_ID1, converter(position_arr[0]));
    dxl_wb.goalPosition(DXL_ID2,converter(position_arr[1]));
    dxl_wb.goalPosition(DXL_ID3, converter(position_arr[2]));
    dxl_wb.goalPosition(DXL_ID4, converter(position_arr[3]));
    nh.spinOnce();
    delay(10);
}

코딩을 하면서 느낀점은 ROS에서 C++로 노드를 만들때와 매우 비슷하다고 느꼈다. 오히려 더 단순할지도 ??(복잡한 makefile을 작성해주지 않아도 되니...)

아 그리고 이 코드를 돌릴 때 알아두셔야 하는점은 4개의 다이나믹셀을 ID 1,2,3,4로 설정했고 bandrate는 10000000 이라는 점이다. 진짜 이거 세팅할 때 윈도우의 다이나믹셀 매니저였나??를 사용하면 GUI로 엄청편하게 할 수 있는데, 나는 윈도우 기기가없어서 일일히 아두이노 예제코드들을 활용해서 변경해 주었다. ㅠㅠ

Rosserial Python

ROS의 기본적인 원리는 TCP/IP통신이다.(ROS1 기준) 따라서 아두이노와 통신을 하기위해 USB를 통해 연결하고 Serial 통신을 한다.
다행히도 이 코드는 직접 짜지 않아도 괜찮다. 자세한 내용은 rosserial_python을 읽어보면 좋을 것 같다.

Install

 sudo apt-get install ros-melodic-rosserial

Run

 rosrun rosserial_python serial_node.py _port:=/dev/ttyACM0 _baud:=57600

여기서 port랑 band는 알아서 잘 설정해야한다.

Demo Video

 

따로 로봇팔을 돌려보는 프로그램은 사용하지 않고, 간단히 RQT의 Topic Publisher를 활용해서 한번 움직여 보았다.

Result

Motor Driver의 Ping등 여러 fiture들은 나중에 한번 확인해보도록 하겠다. 사실 이 방법은 조금 비효율적이라고 느껴지는 것이 사용하다 보니 굳이 OpenCR이 필요하지 않다고 생각이든다. 다음에는 컴퓨터와 직접 Dynamixel을 연결해서 제어해볼예정이다.

 

 

 

'Robot > Robot Arm 로봇팔' 카테고리의 다른 글

4axis Robot Arm Project - 2 Assemble  (0) 2021.05.22
4axis Robot Arm Project - 1 Design  (0) 2021.05.22
4axis Robot Arm Project - 0 Intro  (0) 2021.05.22