1. 개요
이 글은 다음 글을 참고하였다.
이 글은 다음 글을 참고하였다.
1. 액추에이터
본 글에서 사용하는 액추에이터는 다이나믹셀(dynamixel) AX-12W이다. 이에 대한 상세한 설명은 아래 링크를 참고 하길 바란다.
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
본 글에서 사용하는 액추에이터는 다이나믹셀(dynamixel) AX-12W이다. 이에 대한 상세한 설명은 아래 링크를 참고 하길 바란다.
간단히 말해, AX-12W는 저렴한 감속기, 제어기 및 네트워크 기능을 하나로 패키징한 액추에이터이다. 보통, 서보 모터로 감속기, 제어기 및 네트워크 기능을 포함하려면, 아두이노와 같은 별도의 보드를 붙여, 이런 것들을 구현해야 한다. 이를 패키징했다고 생각하면 된다.
무게는 52.9g, 사용 전압은 9~12V (11.1V 권장), 프로토콜은 시리얼 통신을 사용하며, 위치센서로 Potentiometer가 사용된다.
2. OpenCM
AX-12W를 구동하기 위해서, OpenCM 보드를 사용한다. 이 보드는 로보티즈에서 개발된 아두이노와 유사한 보드이며, 개발 IDE역시, 아두이노 IDE와 매우 유사하다.
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
이 패키지의 노드에서 지원하는 서비스는 다음과 같다. 상세 내용은 wiki와 API 를 참고한다.
- RestartController
- SetComplianceMargin
- SetCompliancePunch
- SetComplianceSlope
- SetSpeed
- SetTorqueLimit
- StartController
- StopController
- TorqueEnable
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
다음 튜토리얼도 시도해 본다.
- Creating a joint controllerThis tutorial describes how to create a joint controller with one or more Robotis Dynamixel motors.
- Creating a dual joint position controllerThis tutorial describes how to create a dual joint position controller with a Robotis Dynamixel motors.
- Creating a joint torque controllerThis tutorial describes how to create a joint torque controller with a Robotis Dynamixel motor.
- Creating a dual joint torque controllerThis tutorial describes how to create a dual joint torque controller with a Robotis Dynamixel motors.
- Creating a dynamixel action client controllerThis tutorial describes how to create a joint controller with one or more Robotis Dynamixel motors.
2. Dynamixel for Arduino기반 다이나믹셀 제어
상세 내용은 여기를 참고한다.
라이브러리 함수 설명은 여기를 참고한다.
아두이노와 다이나믹셀 연결 방법은 여기를 참고한다.
74LS241칩을 이용한 RX, TX연결 방법은 여기를 참고한다.
다이나믹셀 구조는 여기를 참고한다.
예제를 실행해 본다.
기타 예제는 다음을 참고한다.
- AX-12 and Flex force sensor & library download
- Dynamixel serial library download#1 or #2
- Dynamixel AX-12A and Arduino: how to use the Serial Port
3. 결론
OpenCM은 가끔 드라이버가 제대로 설치안된다던지 하는 문제가 있을 수 있다. 이 경우, 가지고 있는 아두이노 보드를 이용해, 다이나믹셀을 제어해 볼 수 있다.
블로그를 보면서 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
ㅎ 사실 예전에 해서, 기억이 가물가물합니다. 로그를 보니,
삭제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
에 에러가 있네요. 혹시 모터 디바이스 포트 제대로 설정해 주셨는지요?
잘 안되면, 기본적인 부분부터 하나씩 하나씩 체크해 나가면 잘 될때가 있더라고요..
다이나믹셀 컨트롤 튜토리얼을 진행해 보았습니다.
답글삭제모터 한개를 세팅해서 구동시키는데는 성공하였는데 모터 두개를 연결해서는 구동시키지 못하였습니다.
컨트롤 관련 노드도 전부 실행한거 같은데 마지막 단락에 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...
질문을 못봐서 답변이 너무 늦었습니다. 여러가지 문제가 있을 수 있는 데, 제일 빠르게 해결하시려면 로보티즈 기술서비스에 연락하시거나 오로카 동호회 참여하시면 표윤석 박사님과 같은 전문가 분들이 있어 기술적인 문제 쉽게 해결 가능하실 겁니다.
삭제