Dynamixel이 ROS에서 활동하게 만들면(2) 서비스 통신을 통해 굴러가는 편

11448 단어 ROSROS1Dynamixel

개시하다


저번 보도에서 오픈CR을 통해 다이나믹스를 ROS 노드에서 가동시켜 환경 구축을 진행했다.
이번에 우리는 공식적으로 발표된 소프트웨어 패키지를 사용하여 서비스 통신을 통해 다이나믹스를 운행한다.

새.yaml 파일


ROS로 다이나믹스를 움직이기 위해yaml 파일을 rosparam으로 Dynamixel 정보를 읽어들여야 합니다.
우리는 즉시 이동할 수 있는yaml 파일을 만들 것이다.
dynamixel_workbench_controllers 패키지 내의 config 폴더에config.새로 만들기yaml.
// 長いので2行に分ける
$ cd ~/catkin_ws/my_dynamixel_pkgs/dynamixel-workbench
$ cd dynamixel_workbench_controllers/config
$ touch my_config.yaml
다음은 마이.config.yaml 파일을 기술합니다.
각 모터의 이름을 지정하고 모터 번호(ID)와 동작 모드(Operating Mode)를 지정합니다.
※ 최소한 이 두 개(ID와 Operating Mode)를 써야 합니다.
Operating Mode에 대한 숫자는 다음 링크를 참조하십시오.
https://emanual.robotis.com/docs/en/software/dynamixel/dynamixel_workbench/#bool-setoperatingmodeuint8_t-id-uint8_t-index-const-char-log--null
이번 예는 모터 3개를 사용했기 때문에 각각 모터0, 모터1, 모터2의 이름을 따서 3개 모두 위치 제어 하에 운행하도록 설정했다.
my_config.yaml
Motor0:
  ID: 0
  Return_Delay_Time: 0
  Operating_Mode: 4   # Extended Position Control Mode
  Profile_Acceleration: 0
  Profile_Velocity: 0

Motor1:
  ID: 1
  Return_Delay_Time: 0
  Operating_Mode: 4   # Extended Position Control Mode
  Profile_Acceleration: 0
  Profile_Velocity: 0

Motor2:
  ID: 2
  Return_Delay_Time: 0
  Operating_Mode: 4   # Extended Position Control Mode
  Profile_Acceleration: 0
  Profile_Velocity: 0
launch 파일로 이것을 읽습니다.

launch 파일 편집


다음,dynamixelworkbench_controllers/launch 내dynamixelcontrollers.launch 새 launch 파일을 복사합니다.
이름은'my dynamixel controllers.launch'입니다.
my_dynamixel_controllers.launch
<launch>
  <arg name="usb_port"                default="/dev/ttyACM0"/>
  <arg name="dxl_baud_rate"           default="2000000"/>
  <arg name="namespace"               default="dynamixel_workbench"/>

  <arg name="use_moveit"              default="false"/>
  <arg name="use_joint_state"         default="true"/>
  <arg name="use_cmd_vel"             default="false"/>

  <param name="dynamixel_info"          value="$(find dynamixel_workbench_controllers)/config/my_config.yaml"/>

  <node name="$(arg namespace)" pkg="dynamixel_workbench_controllers" type="dynamixel_workbench_controllers"
        required="true" output="screen" args="$(arg usb_port) $(arg dxl_baud_rate)">
    <param name="use_moveit"              value="$(arg use_moveit)"/>
    <param name="use_joint_states_topic"  value="$(arg use_joint_state)"/>
    <param name="use_cmd_vel_topic"       value="$(arg use_cmd_vel)"/>
    <rosparam>
      publish_period: 0.010
      dxl_read_period: 0.010
      dxl_write_period: 0.010
      mobile_robot_config:                <!--this values will be set when 'use_cmd_vel' is true-->
        seperation_between_wheels: 0.160  <!--default value is set by reference of TB3-->
        radius_of_wheel: 0.033            <!--default value is set by reference of TB3-->
    </rosparam>
  </node>
</launch>
변경점
・usbport를/dev/ttyACM0으로 설정
・dxlbaud_Dynamixel의 bandarate로 rate 설정
・dynamixel방금 info가 만들어진 "my config.yaml"에
3점.
그리고 로스파람 부분의
・publishperiod
・dxlread_period
・dxlwrite_period
의 수치가 작을수록 고속 통신이 가능하다.
(이번 환경에서는 모두 0.001이라도 문제가 발견되지 않았다.)

모터 및 ROS 연결


설정이 끝난 후 로즈런치 모터를 실제로 읽습니다.
$ roslaunch dynamixel_workbench_controllers my_dynamixel_controllers.launch
오류가 발생하면 baudate, ID가 일치하는지 확인하십시오.
launch 파일을 찾을 수 없을 때 다음 동작을 실행합니다.
$ source ~/catkin_ws/devel/setup.bash
그림에서 보듯이 연결이 정상적이다.

모터를 시운전하다


지령 발송 방법 확인


다이나믹스를 시작하기 위해서는 어떤 지령이 필요할까요?
다음 명령을 실행하여 어떤 테마 서비스를 받아들일지 확인하세요.
$ rostopic list
$ rosservice list

그중에서 지령을 받은 것은
・"/dynamixel workbench/joint trajectory"화제
・"/dynamixel workbench/dynamixel command"서비스
의 두 개.
따라서 이 컨트롤러는 상술한 두 가지 방법을 통해 작동할 수 있다.
(상기 이외의 이동 방법은 아는 사람이 있으면 알려주세요...)

"/dynamixel command" 서비스 시작


이번 회의에서 나는 간단한 이동 방식인 서비스 통신 방법을 설명해 드리겠습니다.
사용할 서비스 파일은
dynamixel-workbench-msgs/dynamixel_workbench_msgs/srv/DynamixelCommand.srv
예.
실제로 안을 보세요.
DynamixelCommand.srv
string command
uint8 id
string addr_name
int32 value
---
bool comm_result
Request
・command (명령의 이름. 공백에도 문제 없음)
· id (이동하려는 모터 ID)
・addrname(쓰려는 데이터의 발송 주소 ※ 1)
·value (작성된 데이터 ※ 2)
네 개의 파라미터가 있기 때문에 그것들을 파라미터로 주면 모터가 작동할 것이다.
※1
addr_name의 쓰기 방법은 다음과 같습니다.
dynamixel_workbench_toolbox/src/dynamixel_workbench_toolbox/dynamixel_item.cpp
맨 윗부분.
※2
대응하는ddrname,value, 각 모터의 Control Table 참조.
(XM540-W270-R시https://emanual.robotis.com/docs/en/dxl/x/xm540-w270/#control-table-of-ram-area
다음 명령을 수행해 보세요.
$ rosservice call /dynamixel_workbench/dynamixel_command '' 0 'Goal_Position' 1000
위의 명령은
・commond의 이름은 ""입니다(공백)
/ID 0
· 발송 목적지를 "Goal"으로 설정Position'
• 값 1000
이런 지령을 보내고 있다.
ID 0의 모터 위치를 1000으로 설정하라는 명령을 내린 것이다.
실행해 보면 Motor0은 숫자값으로 1000에 대응하는 각도로 회전한다.
ID를 바꾸면 다른 모터도 똑같이 제어할 수 있다.
ROS 서비스 커뮤니케이션(/dynamixel command)에서 dynamixel이 이동pic.twitter.com/SrCAiQBuQH-F@L (@hayabusa_f) March 31, 2021

참고로 속도 제어를 위한 모터 명령 목표 속도는 다음과 같습니다.

$ rosservice call /dynamixel_workbench/dynamixel_command '' 0 'Goal_Velocity' 100

여기서yaml 파일로 모터 열기
・위치 제어 모드를 선택한 경우 위치 명령(Goal Position)만

· 속도 제어 모드를 선택한 경우 속도 명령어(Goal Velocity)만

만 받습니다.

음수를 쓰려는 경우


value call 마이너스 숫자 값을 원하면 테마 서비스 이름 뒤에 "-"를 붙이십시오

$ rosservice call /dynamixel_workbench/dynamixel_command -- '' 1 'Goal_Position' -1000

참조: http://wiki.ros.org/ROS/YAMLCommandLine


최후


이 글에서 서비스 통신을 사용하면 모터를 간단하게 구동할 수 있습니다.


하지만,

· 여러 모터를 동시에 구동할 수 없음

• 제공된 데이터는 숫자값이기 때문에 변환이 번거롭다
이런 문제점도 있어요.

다음 글에서는 다른 방법("/joint trajectry"테마 제어)을 소개합니다.

좋은 웹페이지 즐겨찾기