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의 파라미터 기능과 복수노드 실행에 관해서 공부 후 적용해볼 계획이다.
'개인프로젝트 > 메카넘휠 로봇 제작' 카테고리의 다른 글
[9] 메카넘휠 로봇 SBC 전후좌우 제어 (0) | 2023.03.08 |
---|---|
[8] 메카넘휠 로봇의 파라미터 변경을 통한 통합 런치파일 구성 (0) | 2023.03.07 |
[4] YdLidar G4 라이다센서 데이터 받아오기 (8) | 2023.02.28 |
[6] 메카넘휠 로봇 SBC(single-board computer) 세팅 (0) | 2023.02.12 |
[5]메카넘휠 로봇 하드웨어 빌드업 (3) | 2023.02.12 |