개요
ADI 트라이나믹 모터 컨트롤러(Trinamic motor controller, TMC) ROS1 드라이버는 로봇 운영체제(robot operating system, ROS) 프레임워크 내에서 TMC의 드라이버 계층과 애플리케이션 계층 간에 통신을 매끄럽고 손쉽게 구현할 수 있게 해준다. 이러한 장점은 다양한 TMC 보드에 적용된다. 이 글에서는 모터 제어, 정보 검색, 명령 실행, 파라미터 수집, 다중 구성 지원을 포함하여 TMC ROS1 드라이버의 기능에 대해 자세히 설명한다. 또한 이 모터 컨트롤러를 임베디드 시스템 및 애플리케이션에 통합함으로써 ROS 프레임워크 내에서 어떠한 이점들을 누릴 수 있는지도 함께 알아본다.
ADI 트라이나믹 모터 컨트롤러 ROS1 드라이버
ROS는 로봇 시스템 또는 애플리케이션을 개발할 수 있게 도와주는 드라이버에서부터 첨단 알고리즘에 이르기까지 소프트웨어 라이브러리와 강력한 개발자 도구를 모두 포함하는 로봇 미들웨어다. ADI 트라이나믹 모터 컨트롤러는 새로운 종류의 지능형 액추에이터를 구현할 수 있게 해주며, ROS가 특히 로봇 공학을 비롯해 광범위하게 활용됨에 따라 제조 및 산업 자동화 애플리케이션에서의 활용성을 넓히기 위해 ROS 드라이버와 같은 추가적인 모듈 지원도 지원한다. 아나로그디바이스의 TMC ROS1 드라이버는 ADI의 트라이나믹 모터 제어 언어 통합 개발 환경(TMCL-IDE)과 유사한 기능을 제공하지만, 주요한 차이점이 있다.
즉, ROS 지원 시스템 내의 노드가 추가적인 드라이버 설치 없이도 TMC를 사용할 수 있도록 한다는 점이다. 또한 adi_tmcl은 자체 TMCL 프로토콜 해석기를 통합하고 있으므로, TMCL 표준을 준수하는 사용자 요청 명령을 해석할 수 있다. 최종 계층인 tmcl_ros_node는 ROS 시스템과 직접적인 인터페이스를 구축하여 발행자, 구독자, 서비스와 같은 기능을 제공한다. 이들 각각의 기능은 일련의 파라미터를 활용해 사용자가 맞춤화할 수 있는데, 이 부분은 다음 섹션에서 자세히 설명할 것이다.
특징
1. 다양한 TMC 보드 지원
TMC ROS 드라이버 또는 adi_tmcl은 TMCL 프로토콜을 준수하는 모든 상용 TMC를 지원하도록 설계됐다. 이 글의 작성일을 기준으로 현재는 CAN 인터페이스(특히 SocketCAN)를 지원하지만, 조만간 다른 인터페이스에 대한 지원을 포함하기 위한 개발이 진행 중이다. 이러한 TMC에는 ADI 트라이나믹 PANdriveTM 스마트 모터 및 모듈이 포함되며, 이는 다시 스테퍼 모터와 브러시리스 DC(BLDC) 모터용으로 세분화될 수 있다.
ROS 파라미터를 사용하면 adi_tmcl이 다양한 TMC 보드를 원활하게 지원할 수 있으므로 전체 패키지를 다시 구축하지 않고도 tmcl_ros_node를 구성할 수 있다. adi_tmcl/config 디렉토리 내에서, 각 ADI 트라이나믹 모터 컨트롤러 모듈은 2개의 YAML 파일과 연관된다. 사람이 읽을 수 있는 데이터 직렬화 언어로 작성된 이 파일은 ROS 파라미터를 포함하며, 다음 실행 중에 로드돼야 한다.
▶adi_tmcl/config/autogenerated/TMCM-XXXX.yaml
이 YAML 파일은 자동 생성되며 모듈에 특화된 파라미터를 포함하므로, 수정할 경우 노드가 다르게 작동할 수 있기 때문에 수정하지 않는 것이 좋다.
▶adi_tmcl/config/TMCM-XXXX_Ext.yaml
이 YAML 파일에는 사용자가 (1) 보드와 통신하고(예 : 인터페이스 이름), (2) 모터 제어를 활성화하고, (3) ROS 토픽 이름을 변경하기 위해 수정할 수 있는 모든 파라미터가 포함되어 있다. 예를 들어 TMCM-1636(그림 3)을 사용하고자 한다면, 간단히 그림 1에 보이는 코드를 불러오면 된다.

여기서 adi_tmcl/launch/tmcm_1636.launch는 TMCM-1636 전용 YAML 파일을 로드한다.


TMCM-1260(그림 6)을 사용하려면 다음을 불러온다.

여기서 adi_tmcl/launch/tmcm_1260.launch는 TMCM-1260 전용 YAML 파일을 로드한다.


launch 디렉토리는 지원되는 모든 TMC 보드를 포함하고 있다.
2. TMCL-IDE를 사용한 TMC 모듈의 1회 구성 설정
ROS를 통해 TMC 보드를 사용하기 전에, 해당 보드를 사용 중인 모터로 보정해야 한다. 모든 보정 작업은 TMCL-IDE를 사용해 수행돼야 하며 EEPROM에 저장돼야 한다(그렇게 하지 않으면 모터가 정확하게 제어되지 않을 수 있다). 보정 및 튜닝 후에는 모든 파라미터를 보드의 EEPROM에 저장해야 한다. 이 작업은 (1) 파라미터 저장, (2) STAP 명령, 및/또는 (3) TMCL 프로그램 생성 및 업로드, 자동 시작 모드 활성화를 통해 수행할 수 있다. 일부 보드는 이들 옵션 중 일부만 지원한다. TMC와 모터의 구성 설정/튜닝을 마치면, TMC ROS 드라이버 설계는 TMCL-IDE를 사용한 1회 구성 설정에 기반해 모터를 제어하도록 간소화된다.
3. 모터 작동/중지
TMC ROS 드라이버는 다음 토픽 중 하나로 발행하여 모터를 작동/중지시킨다.
▶/cmd_vel (geometry_msgs/Twist)—모터의 속도 설정
▶/cmd_abspos (std_msgs/Int32)—모터의 절대 위치 설정
▶/cmd_relpos (std_msgs/Int32)—모터의 상대 위치 설정
▶/cmd_trq (std_msgs/Int32)—모터의 토크 설정
참고 : 다축 TMC 구성에서는 다양한 모터에 대한 개별적인 토픽이 있다.
사용자는 자신의 ROS 시스템을 연결해 이러한 특정 토픽을 발행함으로써 모터의 동작을 제어할 수 있다. 토픽의 선택은 특정 애플리케이션, TMC 설정, 그리고 사용 중인 모터의 종류에 따라 달라진다. 예를 들어 바퀴 달린 로봇의 경우에는 사용자가 속도를 설정하는 것을 선택할 수 있지만, 그리퍼의 경우에는 위치를 설정하는 것이 더 적절할 수 있다.
이해를 돕기 위해 adi_tmcl/scripts/fake_cmd_vel.sh 스크립트를 예로 들어 보면, 이 간단한 스크립트는 시계 방향과 반시계 방향으로 모두 모터의 회전을 조정하여 속도를 점점 더 높인다. 이를 실행하려면 그림 7에 보이는 명령을 수행하면 된다.

참고 :
▶터미널 2와 3은 나란히 보는 것이 가장 좋다.
▶터미널 1에서 명령을 복사(Ctrl-C)한 다음, 완료되면 터미널 2에서 실행한다.
▶터미널 3의 명령은 자동으로 중지된다.
모터가 작동했는지 확인할 수 있도록, 그림 8은 TMC로부터 읽어온 실제 속도의 그래프를 보여준다(/tmc_info_0).

4. TMC/모터 정보 검색
시스템은 다음 토픽을 구독함으로써 TMC ROS 드라이버에서 정보를 가져와 확인할 수 있다.
▶/tmc_info (adi_tmcl/TmcInfo)—전압, TMC 상태, 실제 속도, 실제 위치 및 실제 토크 정보를 제공한다.
참고 : 다축 TMC 구성에서는 다양한 모터에 대한 개별적인 토픽이 있다.
사용자는 자신의 ROS 시스템들을 연결하여 이러한 지정된 토픽을 구독할 수 있다. 이를 통해 사용자는 파라미터 값을 바탕으로 모니터링하고 필요한 조치를 취할 수 있다. 예를 들어, 특정 애플리케이션 환경에서 TMC 상태에 오류가 탐지되면 시스템을 중지할 수 있고, 또는 모터가 특정 위치에 도달하면 사전 프로그래밍된 조치를 실행하도록 선택할 수 있다. 일례로 adi_tmcl/scripts/fake_cmd_pos.sh는 모터를 시계 방향으로 회전시킨 다음, 위치의 크기가 증가하면 다시 반시계 방향으로 회전시키는 간단한 스크립트다. 그림 9에 보이는 명령을 실행하면 된다.

모터가 작동했는지 확인할 수 있도록, 그림 10은 TMC에서 읽어온 실제 위치의 그래프를 보여준다(/tmc_info_0).

5. 사용자 맞춤형 TMC 명령 실행
시스템은 다음 기능을 실행하여 TMC 파라미터에 액세스하고 조정할 수 있다.
▶tmcl_custom_cmd (adi_tmcl/TmcCustomCmd)—TMC의 축 파라미터(AP) 및 글로벌 파라미터(GP)의 값을 가져오거나 설정한다.
사용자는 특정 애플리케이션 요구사항을 충족하기 위해 이 서비스를 ROS 시스템에 통합하는 옵션을 사용할 수 있다. 이 기능은 사용자가 ROS 드라이버로부터 TMC 보드를 직접 설정할 수 있게 해준다. 예를 들어, 사용자는 최대 전류에 대한 축 파라미터 설정(set the axis parameter, SAP)을 선택함으로써, 허용되는 절대 전류 레벨을 조정할 수 있다.
그러나 잘못 설정하면 TMC ROS 드라이버 오류로 이어질 수 있으므로, 사용자는 이 기능을 통해 수정하는 파라미터를 철저히 이해하고 있어야 한다. 이러한 이유로, 모든 구성 설정은 TMCL-IDE를 통해 수행할 것을 강력히 권장한다. 그림 11은 이 서비스를 호출하는 예제로서, 명령어 유형이 208인 DrvStatusFlags에 대한 GAP(get axis parameter) 동작을 보여준다.

6. 모든 축 파라미터 값에 액세스
시스템은 다음을 통해 TMC 축 파라미터(AP)의 값에 액세스할 수 있다.
▶tmcl_gap (adi_tmcl/TmcGapGgpAll)—지정된 모터/축의 모든 TMC의 축 파라미터(AP) 값을 가져온다.
사용자는 ROS 시스템과 이 기능을 통합해 특정 애플리케이션의 요구를 충족할 수 있다. 예를 들어, 이 서비스는 엔코더 스텝, PI 튜닝, 정류 모드 등과 같은 AP를 포함해 TMC 보드의 현재 설정 및 상태를 캡처할 수 있다. 그림 12는 부분적인 출력의 예제를 나타낸다. 사용자는 이 결과를 분석해 1회 구성 설정이 보드의 EEPROM에 올바로 저장되었는지 확인할 수 있다. 그림 13은 이 서비스를 실행한 후 얻은 출력의 일부를 나타낸다. 사용자는 이 결과를 통해 1회 구성 설정이 보드의 EEPROM에 정확하게 저장됐는지 확인할 수 있다.

7. 모든 글로벌 파라미터 값 액세스
시스템은 다음을 통해 TMC 글로벌 파라미터(GP)의 값에 액세스할 수 있다.
▶tmcl_ggp (adi_tmcl/TmcGapGgpAll)—모든 TMC의 글로벌 파라미터(GP)의 값을 가져온다.
이 기능을 활용하면 TMC 보드의 현재 구성 설정과 상태를 확인할 수 있다. 액세스할 수 있는 일부 GP에는 CAN 비트 레이트, 직렬 보 레이트(baud rate), 자동 시작 모드 등이 포함된다.

8. 다중 TMC 보드 구성
여러 개의 TMC 보드가 필요할 수 있는 대형 시스템(예 : 로봇 팔)의 경우, TMC ROS 드라이버를 사용하면 여러 장치들을 구성할 수 있다.
a. 다중 CAN 채널을 사용하는 다중 TMC 보드
그림 14처럼 사용자가 TMC 보드당 1개의 CAN-USB를 갖는 경우, namespaces를 추가해 각 노드의 인스턴스를 구분한다. 이 특정 활용 사례에서 comm_interface_name 파라미터는 보드와 정확한 통신을 보장할 수 있도록 업데이트돼야 한다.


그림 15의 코드는 이 활용 사례를 구성하기 위한 샘플 실행 파일이다. 이 예제에서 모터 A는 /tmcm1/cmd_abspos에 발행하고, 모터 B는 /tmcm2/cmd_abspos에 발행하고, 모터 C는 /tmcm3/cmd_abspos에 발행하여 제어할 수 있다.
b. 단일 CAN 채널을 사용하는 다중 TMC 보드
TMC ROS 드라이버에 의해 지원되는 또 다른 구성은 그림 16에서 보는 바와 같이 단일 CAN 채널을 사용하는 다중 TMC 보드다. 앞서 설명한 다중 TMC 보드 지원과 마찬가지로 각 노드 인스턴스를 구분하기 위해 namespaces가 도입됐다. 모든 보드에 대해 comm_interface_name을 일관되게 유지한다.
각 보드와 정확한 통신을 보장하도록 comm_tx_id 및 comm_rx_id를 조정한다. 그림 17은 이 활용 사례를 구성하기 위한 샘플 실행 파일을 보여준다. 이 예제에서 모터 A는 /tmcm1/cmd_abspos에 발행하고, 모터 B는 /tmcm2/cmd_abspos에 발행하고, 모터 C는 /tmcm3/cmd_abspos에 발행하여 제어할 수 있다.
9. ROS 시스템/애플리케이션에 손쉽게 통합
ROS가 제공하는 메시지 전달 시스템을 통해 대형 시스템은 노드의 상호 교환을 손쉽게 할 수 있다(드라이버, 알고리즘 등). TMC ROS 드라이버의 개발은 이러한 이점을 TMC 보드에까지 확장함으로써 ROS 시스템/애플리케이션에 매끄럽게 통합할 수 있게 해준다.


a. AGV/AMR에 통합
그림 18은 navigation_node가 geometry_msg/Twist 형식으로 /cmd_vel을 전송하여 모바일 로봇을 어떻게 제어하는지 보여준다. 다음으로 motor_controller가 geometry_msg/Twist 형식으로 /wheel_velocity를 통해 피드백을 전송하므로 navigation_node가 그에 따라 재보정을 할 수 있다.

navigation_node가 발행하고 구독하는 위치를 확인함으로써 motor_controller는 tmcl_ros_node에 의해 쉽게 변경될 수 있다(그림 19). TMC 정보 검색 기능과 유사하게, adi_tmcl은 휠 속도에 대한 실시간 정보를 발행하고, wheel_velocity_node는 휠 속도 정보를 adi_tmcl/TmcInfo에서 geometry_msg/Twist로 변환한다. 새로운 아키텍처와 통합 TMC 보드가 정확한 데이터 형식을 따르므로 모바일 로봇이 동일하게 작동할 것으로 예상할 수 있다.

b. 로봇 팔에 통합
그림 20은 TMC 보드를 로봇 팔의 픽-앤-플레이스 애플리케이션에 통합하려면 로봇 팔을 제어하는 데 여러 개의 모터가 필요하다는 것을 보여준다. 앞서의 사례와 유사하게, 사용자는 pick_and_place_node가 예상되는 데이터 형식을 구독·발행하도록 보장해야 한다.

결론
ADI의 TMC ROS1 드라이버는 ROS 관리 시스템 내에서 기본 TMC 드라이버 계층과 애플리케이션 계층 간에 원활한 통신을 손쉽게 구현할 수 있게 한다. 이러한 장점은 다양한 TMC 보드에 적용된다. 지금까지 다음을 포함하여 ADI 트라이나믹 모터 컨트롤러 ROS1 드라이버가 제공하는 특징을 자세히 살펴봤다.
▶모터 동작 제어
▶모터 및 컨트롤러 정보 검색
▶TMC 명령 실행
▶축 및 글로벌 파라미터 값 가져오기
▶다중 TMC 보드 구성 지원
이러한 모든 기능은 ROS의 메시지 전달 시스템을 활용하여 구현되므로 이들 모터 컨트롤러를 ROS 기반 시스템 및 애플리케이션에 손쉽게 통합할 수 있다.
헬로티 서재창 기자 |