아두이노 로봇팔 제어 - adu-ino lobospal jeeo

[ROS+Moveit!+아두이노 3]

이전에 발생했던 문제들을 해결해보자.

1. 아두이노의 메모리 부족이 뜨는 문제 해결 (지금 정도는 해결 안 하고 가도 되는지?) :

우선 내 코드에서 메모리 부족이 뜨는 이유는 include를 3개나 해서 그런 거 같다.(추정)

->(2022.09.15)나중에 rosserial로 프로젝트를 몇번 진행하다가 원인을 찾았다. 아두이노 UNO의 메모리 버퍼 크기가 작아서 이 정도 크기의 array도 전송이 힘든 것이었다. 해결법은 rosserial로 전송하는 메시지를 줄이거나 메모리 버퍼가 더 큰 MEGA를 사용하는 것 밖엔 없다...

하지만 구글링을 해도 이를 줄일 방법을 찾지 못했다.

혹시 파이썬 처럼 전부 from import로 일부분만 import 할 방법이 있나 찾아봤지만 없는 거 같다..

일단은 다행인지 모터 1개에는 작동에 이상이 없었으니 일단은 그대로 진행해보려고 한다.

만약 이후에 문제가 발생하면 그 때는 HCPCA9685를 빼고 진행해야 할 거 같다..

2. 서보모터의 속도 제어 :

몇개의 블로그와 유튜브 영상들을 찾아보니 99%는 모두 같은 방식으로 속도 제어를 하고 있었다.

바로 목표 각도를 입력하는 게 아닌 for문과 delay를 사용해 목표 각도까지 일정 단위만큼 나눠서 이동시키는 방식을 사용하고 있었다.

https://www.youtube.com/watch?v=xyOQ4J4BroE

아두이노 로봇팔 제어 - adu-ino lobospal jeeo


https://forum.arduino.cc/t/adjusting-servo-speed/6436

Adjusting servo speed

Hi! i’m almost done with my little project 😎 The only thing i need to figure out now, is that how i adjust the speed of a servo. Help me with the following code: ::slight_smile: int ledPin = 13; int inputPin1 = 2; int inputPin2 = 4; #include <Servo.h>

forum.arduino.cc

다른 방식도 있는 거 같지만 이 방식이 일단은 가장 쉬워보여서 이 방식을 이용해 모터 1개 코드를 바꿔봤다.

아두이노 로봇팔 제어 - adu-ino lobospal jeeo

+) 이유는 모르겠는데 usb포트도 그대로인데 갑자기 시리얼 포트가 ttyACM0에서 ttyACM1로 바뀌었다. 진짜 갑자기 바뀌었는데 왜 바뀌었는지 모르겠다... 추후 확인하니 rosserial 노드가 연결된 상태에서 노드를 종료하지 않고 아두이노를 끄면 이런 증상이 나타나는 것을 확인했다. 다행히 무작위로 바뀌지는 않고 ttyACM0와 ttyACM1을 왔다 갔다 하는 것으로 확인했다.

아두이노 로봇팔 제어 - adu-ino lobospal jeeo

확실히 느리게 움직인다.

하지만 약간 움직임이 뚝뚝 끊기면서 움직이는 듯한 느낌이 있다.

아무래도 delay를 사용한 방식의 한계인 것 같다.

그래도 큰 문제는 아니니 이대로 진행하고 추후에 더 좋은 방법이 있으면 바꿔야겠다.

문제점을 대충 해결 했으니 이제 모든 모터를 움직이게 하는 코드를 만들 차례이다.

Moveit! 이 보내는 각도 메시지가 어떤 형태에 어떤 내용으로 오는지는 아직 모르기에 일단은 코드를 Int8MultiArray를 받는 것으로 만들어 보았다.

역시 아래 블로그를 참고 했다.
https://m.blog.naver.com/chandong83/221070174213

아두이노 ROS - ROSSerial 다중 서보(Multiple Servo) 모터 제어

지난번에 다뤄본 ROS 시리얼을 이용한 단일 서보 제어 예제에 이어 다중 서보모터를 제어하는 방법을 알...

blog.naver.com

아두이노 로봇팔 제어 - adu-ino lobospal jeeo
아두이노 로봇팔 제어 - adu-ino lobospal jeeo

일단은 작동 여부 확인과 2차 모터 영점 조절을 위해 속도 조절을 하지 않은 코드를 업로드했다.

모터 1개 코드와 크게 다른 것은 없고 각도들을 array의 형태(Int8MultiArray)로 받는다는 것이다.

아두이노 로봇팔 제어 - adu-ino lobospal jeeo
아두이노 로봇팔 제어 - adu-ino lobospal jeeo

잘 작동했다. 다만 2번 모터(팔 중간)가 영점이 안 맞아 조금 조정해줘야 할 거 같다.

+) 영점을 조정 과정에서 내가 짠 코드의 문제점을 하나 찾았다. 메모리 부족이 떠서 조금이나마 줄여보려고 메시지 타입을 Int8을 사용했는데 Int8은 -128 ~ 127만 가능했다. 2번 모터의 의도한 범위인 -45 ~ 135에서 135를 넣을 수 없었다. 다행히 각도 범위가 -60 ~ 120으로 해도 문제가 없었기에 각도 범위를 바꾸는 방향으로 해결했다.

영점 2차 조정 결과 :

motor_3 : -60 ~ 120으로 변경
motor_3 : 435 ~ 5로 변경

2차 조정 후 감속 부분을 추가한 모든 모터 작동 코드를 업로드했다.

아두이노 로봇팔 제어 - adu-ino lobospal jeeo

이렇게 하니까 작동을 잘 되었는데 코드를 작성하면서부터 생각했었던 문제가 발생했다.

메시지를 받으면 0~3 모터의 동작이 동시에 이뤄 저야 하는데 0번부터 3번까지 코드 순서대로 따로 동작했다.

+) 속도 감소 부분의 delay(15)때문에 이런 문제가 발생하는 것 같다. 사실 속도 감소가 없는 코드도 순차적으로 동작하는 거지만 delay 없이 빠르게 지나가서 동시에 움직이는 것처럼 보이는 것이다.

이와 관련해서 해결책을 찾아보니 멀티태스킹, c++의 멀티쓰레딩 개념을 알아야 했다. 앞으로 로봇 프로그래밍을 하는데에 있어서 정말 중요한 기술인 거 같은데 지금 하기엔 많이 복잡해 보였다.

https://honeycomb-makers.tistory.com/11

무이메이커스_[arduino]아두이노에서 멀티태스킹 사용하기 / FreeRTOS를 이용한 멀티태스킹 (2/2)

안녕하세요 허니컴의 무이메이커스입니다. 저번시간은 아두이노를 사용하면서 Delay()로 인해 발생할 수 있는 문제점과 해결책을 알아보았습니다. 오늘은 FreeRTOS헤더파일 없이 멀티태스킹을 진

honeycomb-makers.tistory.com

아두이노 로봇팔 제어 - adu-ino lobospal jeeo


https://blog.danggun.net/2088

[Arduino] 아두이노에서 멀티쓰래드사용하기

아두이노는 자체적으로 멀티쓰래드를 지원하지 않습니다. 그러다 보니 쓰래드 작업을 하고 싶으면 방법이 없죠. 결론부터 이야기하자면 아두이노에서 다른 언어의 쓰래드와 같은 동작을 하는

blog.danggun.net

아두이노 로봇팔 제어 - adu-ino lobospal jeeo


https://modoocode.com/269

씹어먹는 C ++ - <15 - 1. 동시에 실행을 시킨다고? - C++ 쓰레드(thread)>

modoocode.com


일단은 이런 개념이 있구나 하고 넘어가고 다음에 멀티스레딩만 집중적으로 공부해야겠다.

+) 2022.05월에 c++은 아니고 파이썬에서 멀티스레딩, 프로세싱, 동기, 비동기 개념과 기초적인 코딩을 배웠다.

아두이노 로봇팔 제어 - adu-ino lobospal jeeo

결론적으로 일단은 속도 감소 없는 코드(본문 2번째 코드)를 사용한다.

========================================================================
정확한 정보 전달보단 공부 겸 기록에 초점을 둔 글입니다.
틀린 내용이 있을 수 있습니다.
틀린 내용이나 다른 문제가 있으면 댓글에 남겨주시면 감사하겠습니다. : )
========================================================================