ROS2를 이용하여 모터를 제어해보자

모터를 제어하기 위해서 다음과 같은 과정을 생각했다.

 

1. 사용자로부터 로봇의 원하는 선속도와 각속도를 받는다.

2. 메카넘휠 역기구학 계산을 적용하여 선속도와 각속도를 모터의 각속도로 받는다.

3. 각 모터의 각속도를 임베디드보드(아두이노)로 전송한다.

4. (현재속도/최대속도)*255 를 계산하여 PWM제어의 255에 대한 비로 변환해주고 구동한다.

 

구동 사양은 다음과 같다.

 

Laptop : 테스트할 때 사용

Jetson Nano(SBC) : 실제 적용

Arduino MEGA 2560 : 모터 구동

 

Laptop 혹은 SBC와 임베디드보드의 통신

사실 이 부분이 제일 힘들었다.

나름의 시행착오도 겪어가며 여러가지 방법을 고민했다.

보통 센서데이터 전송에는 Serial통신을 이용한다.

 

Serial통신에는 대표적으로 세 가지를 꼽는다.

1. UART

2. SPI

3. I2C

 

구현이 쉬운 순으로 따지면 ( 1 > 2 > 3 ) 이되고 속도로 따져보면 ( 2 > 3 > 1 )이다.

우선 가장 구현이 쉬울것으로 예상되는 UART통신을 시도해보았다.

 

방법 1

첫 번째로 시도한 방법이다. 각속도 데이터를 구분자 " , "로 구분하여 String타입의 데이터를 만들었다.

예를들어 전송하는 데이터는 다음과 같다.

"1.2,10.3,-20.5,30.5"

[1번모터 : 1.2, 2번모터 : 10.3, 3번모터 : -20.5, 4번모터 : 30.5] [rad/s]

이후 첫 번째 아두이노에서 데이터를 받아서 구분자의 인덱스로 1번과 2번모터의 각속도 데이터를 뽑아온다.

남은 두개의 각속도 데이터는 두 번째 아두이노로 넘겨준다.

이후 두 번째 아두이노에서 3번과 4번모터의 각속도 데이터를 뽑는다.

 

인터럽트I/O핀의 한계로 아두이노를 두 개씩이나 사용하게 되었다.

SBC보드의 USB포트를 하나만 쓰기 위해서 위와같은 방법을 고안했다.

 

하지만 데이터를 String 타입으로 받고 통신을 두 번이나 거치면서 딜레이가 어느정도 있는 것 같아 SPI통신을 적용해보고자 했다.

 

방법 2

두 번째로 시도한 방법은 SPI통신을 이용한 방법이다.

통신속도에서 이점이 있기 때문에 앞서 발생하는 딜레이를 조금이나마 줄일 수 있지 않을까 싶었다.

 

가장 어려웠던 점은 정보가 너무도 없었다는 것이다.

Google에 서칭하면 왠만해서는 다 해결가능하지만 이 SPI통신 관련한 예제는 찾기 정말 어려웠다.

그래도 어떻게든 적용은 해보자 싶어서 관련 내용을 찾아가며 하나 둘 해결해나갔다.

프로토 타입을 위한 시간이 너무 부족했고 계속되는 시행착오에 어려움을 겪으며 세 번째 방법을 생각했다.

 

덕분에 SPI에 대한 공부는 빠삭하게 한 것 같다.

 

방법 3

이 방법은 불필요하게 포트를 하나 더 사용해서 비추천하는 방법이다.

하지만 빠른 프로토타입을 위해서는 고려해볼만한 방법이였다.

포트 두 개를 열어주고 방법1과 비슷하게 데이터를 String타입으로 둘씩 쪼개서 전송해준다.

 

테스트 해본 결과 반응속도는 나쁘지 않았다.

노드 또한 각 시리얼 포트 이름을 달리하여 실행해주어야 한다.

이는 ROS2의 파라미터 기능과 복수노드 실행에 관해서 공부 후 적용해볼 계획이다.