2015년 8월 29일 토요일

ROS기반 액추에이터 제어

ROS기반으로 객체를 추적하기 위해서는 액추에이터에 적절한 속도를 전달해 줄 수 있어야 한다. 이와 관련된 내용을 정리해 본다. 본 글에서는 많이 활용되는 다이나믹셀을 활용한다.

1. 개요
이 글은 다음 글을 참고하였다.
1. 액추에이터
본 글에서 사용하는 액추에이터는 다이나믹셀(dynamixel) AX-12W이다. 이에 대한 상세한 설명은 아래 링크를 참고 하길 바란다.
간단히 말해, AX-12W는 저렴한 감속기, 제어기 및 네트워크 기능을 하나로 패키징한 액추에이터이다. 보통, 서보 모터로 감속기, 제어기 및 네트워크 기능을 포함하려면, 아두이노와 같은 별도의 보드를 붙여, 이런 것들을 구현해야 한다. 이를 패키징했다고 생각하면 된다. 

무게는 52.9g, 사용 전압은 9~12V (11.1V 권장), 프로토콜은 시리얼 통신을 사용하며, 위치센서로 Potentiometer가 사용된다. 

2. OpenCM
AX-12W를 구동하기 위해서, OpenCM 보드를 사용한다. 이 보드는 로보티즈에서 개발된 아두이노와 유사한 보드이며, 개발 IDE역시, 아두이노 IDE와 매우 유사하다.


2. ROS 패키지 설명
ROS Robotis Dynamixel 패키지는 AX-12, AX-18, RS-24, RX-28, MX-28, RX-64, MX-64, EX-106, MX-106 모델을 지원한다.

소스는 github에서 다운로드 가능하다.
https://github.com/arebgun/dynamixel_motor.git

설치는 다음과 같다.
sudo apt-get install ros-indigo-dynamixel-motor

최신버전 체크는 다음과 같다.
git clone https://github.com/arebgun/dynamixel_motor.git

이 패키지의 노드에서 지원하는 서비스는 다음과 같다. 상세 내용은 wikiAPI 를 참고한다.

2. 튜토리얼
1. 패키지를 생성한다.

cd ~/catkin_ws/src
catkin_create_pkg my_dynamixel_tutorial dynamixel_controllers std_msgs rospy roscpp

다이나믹셀은 /dev/ttyUSB0 시리얼포트에 연결되었다고 가정한다.

2. 먼저, 모터 연결 및 피드백 데이터(예 - 현재 위치, 목표 위치, 에러 등등)를 publish하기 위해, 제어기 관리자(controller manager)를 시작할 필요가 있다. 간단한 방법은 launch 파일에 관련 파라메터를 설정하는 것이다. controller_manager.launch 파일에 다음 텍스트를 붙여 넣는다.

https://ua-ros-pkg.googlecode.com/svn/stacks/dynamixel_motor/tags/fuerte/dynamixel_tutorials/launch/controller_manager.launch
<!-- -*- mode: XML -*- -->

<launch>
    <node name="dynamixel_manager" pkg="dynamixel_controllers" type="controller_manager.py" required="true" output="screen">
        <rosparam>
            namespace: dxl_manager
            serial_ports:
                pan_tilt_port:
                    port_name: "/dev/ttyUSB0"
                    baud_rate: 1000000
                    min_motor_id: 1
                    max_motor_id: 25
                    update_rate: 20
        </rosparam>
    </node>
</launch>

baud rate 등을 정확히 설정한다. 만약 RX-28 모터라면, 57142로 설정해야 한다.

이제 다음과 같은 출력을 볼 수 있다.
[INFO] [WallTime: 1295282870.051953] pan_tilt_port: Pinging motor IDs 1 through 25...
[INFO] [WallTime: 1295282870.103676] pan_tilt_port: Found 4 motors - 4 AX-12 [4, 5, 6, 13], initialization complete. 

3. 모터 피드백 확인
토픽을 확인한다.
rostopic list

그럼 다음과 같이 출력될 것이다.
/motor_states/pan_tilt_port
/rosout
/rosout_agg

다음과 같이 입력한다.
rostopic echo /motor_states/pan_tilt_port

AX-12라면, 다음과 같이 출력된다.
motor_states:
motor_states:
  -
    timestamp: 1351555461.28
    id: 4
    goal: 517
    position: 527
    error: 10
    speed: 0
    load: 0.3125
    voltage: 12.4
    temperature: 39
    moving: False
  -
    timestamp: 1351555461.28
    id: 5
    goal: 512
    position: 483
    error: -29
    speed: 0
    load: 0.0
    voltage: 12.6
    temperature: 40
    moving: False

다음 튜토리얼도 시도해 본다.

  1. Creating a joint controller
    This tutorial describes how to create a joint controller with one or more Robotis Dynamixel motors.
  2. Creating a dual joint position controller
    This tutorial describes how to create a dual joint position controller with a Robotis Dynamixel motors.
  3. Creating a joint torque controller
    This tutorial describes how to create a joint torque controller with a Robotis Dynamixel motor.
  4. Creating a dual joint torque controller
    This tutorial describes how to create a dual joint torque controller with a Robotis Dynamixel motors.
  5. Creating a dynamixel action client controller
    This tutorial describes how to create a joint controller with one or more Robotis Dynamixel motors.

2. Dynamixel for Arduino기반 다이나믹셀 제어
다음 링크에서 라이브러리를 다운로드 받고, 아두이노 라이브러리에 설치한다.

상세 내용은 여기를 참고한다.
라이브러리 함수 설명은 여기를 참고한다.
아두이노와 다이나믹셀 연결 방법은 여기를 참고한다.
74LS241칩을 이용한 RX, TX연결 방법은 여기를 참고한다.
다이나믹셀 구조는 여기를 참고한다.

예제를 실행해 본다.


기타 예제는 다음을 참고한다.


3. 결론
OpenCM은 가끔 드라이버가 제대로 설치안된다던지 하는 문제가 있을 수 있다. 이 경우, 가지고 있는 아두이노 보드를 이용해, 다이나믹셀을 제어해 볼 수 있다.





댓글 4개:

  1. 블로그를 보면서 ROS를 공부하고 있습니다. 너무 친절한 설명 도움이 많이 되고 있습니다. ㅎㅎ
    해당 페이지를 보면서 따라하고 있는데 roslaunch 실행하면 위와 같은 출력이 안나오고 아래와 같은 에러페이지가 뜹니다 ㅠㅠㅠ 해결 방법 쫌 알 수 있을까요??

    doyeon@doyeon-ThinkPad-X1-Carbon-4th:~/catkin_ws/src$ roslaunch my_dynamixel_tutorial controller_manager.launch
    ... logging to /home/doyeon/.ros/log/4bde54e0-2a56-11e7-8c96-f48c50523941/roslaunch-doyeon-ThinkPad-X1-Carbon-4th-15269.log
    Checking log directory for disk usage. This may take awhile.
    Press Ctrl-C to interrupt
    Done checking log file disk usage. Usage is <1GB.

    started roslaunch server http://172.20.10.7:33829/

    SUMMARY
    ========

    PARAMETERS
    * /dynamixel_manager/namespace: dxl_manager
    * /dynamixel_manager/serial_ports/pan_tilt_port/baud_rate: 1000000
    * /dynamixel_manager/serial_ports/pan_tilt_port/max_motor_id: 25
    * /dynamixel_manager/serial_ports/pan_tilt_port/min_motor_id: 1
    * /dynamixel_manager/serial_ports/pan_tilt_port/port_name: /dev/ttyUSB0
    * /dynamixel_manager/serial_ports/pan_tilt_port/update_rate: 20
    * /rosdistro: kinetic
    * /rosversion: 1.12.7

    NODES
    /
    dynamixel_manager (dynamixel_controllers/controller_manager.py)

    ROS_MASTER_URI=http://localhost:11311/

    core service [/rosout] found
    process[dynamixel_manager-1]: started with pid [15287]
    Traceback (most recent call last):
    File "/opt/ros/kinetic/lib/dynamixel_controllers/controller_manager.py", line 266, in
    manager = ControllerManager()
    File "/opt/ros/kinetic/lib/dynamixel_controllers/controller_manager.py", line 107, in __init__
    serial_proxy.connect()
    File "/opt/ros/kinetic/lib/python2.7/dist-packages/dynamixel_driver/dynamixel_serial_proxy.py", line 99, in connect
    self.dxl_io = dynamixel_io.DynamixelIO(self.port_name, self.baud_rate, self.readback_echo)
    File "/opt/ros/kinetic/lib/python2.7/dist-packages/dynamixel_driver/dynamixel_io.py", line 67, in __init__
    self.ser = serial.Serial(port, baudrate, timeout=0.015)
    File "/usr/lib/python2.7/dist-packages/serial/serialutil.py", line 180, in __init__
    self.open()
    File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 294, in open
    raise SerialException(msg.errno, "could not open port %s: %s" % (self._port, msg))
    serial.serialutil.SerialException: [Errno 2] could not open port /dev/ttyUSB0: [Errno 2] No such file or directory: '/dev/ttyUSB0'
    ================================================================================REQUIRED process [dynamixel_manager-1] has died!
    process has died [pid 15287, exit code 1, cmd /opt/ros/kinetic/lib/dynamixel_controllers/controller_manager.py __name:=dynamixel_manager __log:=/home/doyeon/.ros/log/4bde54e0-2a56-11e7-8c96-f48c50523941/dynamixel_manager-1.log].
    log file: /home/doyeon/.ros/log/4bde54e0-2a56-11e7-8c96-f48c50523941/dynamixel_manager-1*.log
    Initiating shutdown!
    ================================================================================
    [dynamixel_manager-1] killing on exit
    shutting down processing monitor...
    ... shutting down processing monitor complete
    done

    답글삭제
    답글
    1. ㅎ 사실 예전에 해서, 기억이 가물가물합니다. 로그를 보니,
      File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 294, in open
      raise SerialException(msg.errno, "could not open port %s: %s" % (self._port, msg))
      serial.serialutil.SerialException: [Errno 2] could not open port /dev/ttyUSB0: [Errno 2] No such file or directory: '/dev/ttyUSB0

      에 에러가 있네요. 혹시 모터 디바이스 포트 제대로 설정해 주셨는지요?
      잘 안되면, 기본적인 부분부터 하나씩 하나씩 체크해 나가면 잘 될때가 있더라고요..

      삭제
  2. 다이나믹셀 컨트롤 튜토리얼을 진행해 보았습니다.
    모터 한개를 세팅해서 구동시키는데는 성공하였는데 모터 두개를 연결해서는 구동시키지 못하였습니다.
    컨트롤 관련 노드도 전부 실행한거 같은데 마지막 단락에 waiting for control부분에서 더 진행이 되지않고 멈춰있습니다...tilt.yaml 파일부분에서 오류가 난거 같은데 이 오류를 어떻게 해야할지 잘 모르겠습니다.
    park@park-900X5L:~$ roslaunch my_dynamixel_tutorial start_dual_motor_controller.launch
    ... logging to /home/park/.ros/log/5804ce00-0ff4-11e8-aeb0-a0c5895e47eb/roslaunch-park-900X5L-25537.log
    Checking log directory for disk usage. This may take awhile.
    Press Ctrl-C to interrupt
    Done checking log file disk usage. Usage is <1GB.

    started roslaunch server http://localhost:46193/

    SUMMARY
    ========

    PARAMETERS
    * /dual_motor_controller/controller/module: joint_position_co...
    * /dual_motor_controller/controller/package: dynamixel_control...
    * /dual_motor_controller/controller/type: JointPositionCont...
    * /dual_motor_controller/joint_name: dual_motor
    * /dual_motor_controller/joint_speed: 1.17
    * /dual_motor_controller/motor_master/id: 1
    * /dual_motor_controller/motor_master/init: 0
    * /dual_motor_controller/motor_master/max: 2047
    * /dual_motor_controller/motor_master/min: -2047
    * /dual_motor_controller/motor_slave/id: 2
    * /rosdistro: kinetic
    * /rosversion: 1.12.12

    NODES
    /
    dual_motor_controller_spawner (dynamixel_controllers/controller_spawner.py)

    ROS_MASTER_URI=http://localhost:11311

    process[dual_motor_controller_spawner-1]: started with pid [25557]
    [INFO] [1518442156.426050]: your_dynamixel_usb_port controller_spawner: waiting for controller_manager dxl_manager to startup in global namespace...

    답글삭제
    답글
    1. 질문을 못봐서 답변이 너무 늦었습니다. 여러가지 문제가 있을 수 있는 데, 제일 빠르게 해결하시려면 로보티즈 기술서비스에 연락하시거나 오로카 동호회 참여하시면 표윤석 박사님과 같은 전문가 분들이 있어 기술적인 문제 쉽게 해결 가능하실 겁니다.

      삭제