본문 바로가기

개인 프로젝트

2022-1 PID제어를 이용한 밸런싱 로봇 만들기 #5

반응형

+)디지스트 인턴 끝나고서야 재개
++)인턴 때 IMU를 다뤘는데 내 수준의 제작에서는 rawdata를 가져와 ros의 상보필터/칼만필터 패키지를 사용하는 것보다, 아두이노 라이브러리나 dmp를 이용해 각도 자체를 publish 하는 것이 더 효율적이고 충분하다는 것을 배웠다..


[Prototype제작 및 테스트]

IMU data를 ros로 다루는 것은 #4때 일부 했었고, 디지스트 인턴 때 Cylindrical rolling robot을 만들면서 충분히 다뤘다고 생각해서 바로 로봇 제작으로 들어갔다.


우선 사용할 모터와 모터 드라이버를 대충 연결하여 작동 여부를 테스트했다.

모터 드라이버 외부전원 = 아두이노 5V 사용

모터 드라이버 외부전원 = LiFe 2S(6.6V) 사용


일단 갖고 있는 모터 드라이버 L9110s는 잘 작동했고 dc모터도 잘 작동했다.


모터 외부 전원은 아두이노에서 끌어서 쓸까 했지만 테스트해보니 너무 느리고 약해서(손으로 살짝 잡으면 멈춤) LiFe나 6~9V 건전지를 쓰는 것으로 결정했다.


그리고 최초에 생각했던 것에서 또 바뀐 것은 rosserial을 usb가 아닌 블루투스를 사용할 거라는 점이다. balancing robot에서 usb를 써서 rosserial을 하려고 했더니 usb선이 많이 두꺼워서 로봇을 지탱하는 문제점이 생겼었고 그래서 무선으로 rosserial을 하는 게 낫다고 생각했다.


balancing robot에서 굳이 필요한가 싶지만 프로젝트 목표인 ros 연습도 할 겸(디지스트에서 ros를 엄청 하고 와서 목표가 의미가 없어지긴 했지만 그래도 프로젝트는 끝내고 싶다.), 무선으로 pid 제어를 통해 나오는 데이터, 그래프를 보고 싶기 때문에 블루투스를 넣었다.

Schematic diagram of Balancing robot

어느 정도 부품이 정해진 후 정말 대충 prototype을 만들어 봤다.


Protoptype의 경우 주문한 블루투스 모듈이 아직 안 와서 usb를 이용했다.


+) tray부품들은 아래 모델링을 변형시켜서 만들었다.
https://www.thingiverse.com/thing:26237

Arduino Bumper by Chu

Inspired by Arduino design and the iPhone Bumper, I present to you the Arduino Bumper! By installing this minimalist case, it allows the Arduino to be placed onto a flat conductive surface without shorting it out. The bumper press fits onto the Arduino Uno

www.thingiverse.com

arduino_tray
tray2
wheel
prototype


진짜 대충 만들었다....


배터리도 최대한 아래쪽에 두는 게 좋은데, 사실 배터리를 사용하기로 결정한 게 prototype을 만들고 결정한 거라 위쪽에 불안 불안하게 올렸다...


이렇게 만든 prototype으로 rosserial, imu, 모터 등의 정상 작동 여부와 1차적으로 만든 노드와 pid코드가 작동하는지(작동 여부만 확인)를 확인해봤다.


코드 구성은 아래와 같이 구성했다.

아두이노 : IMU로 얻은 angle[deg]를 publish, /move_wheel topic을 subscribe 해서 그 값으로 dc모터를 pwm제어

ard_br.ino




PC(Balancing1 node) : 아두이노에서 온 /imu_ang를 subscribe 한 후 PID control로 나온 값을 /move_wheel로 publish

+)디지스트에서 배운 대로 subscribe와 publish는 각각 다른 스레드로 만들어 실행시켰다.
++) 테스트용으로 만들어서 변수 이름이 뒤죽박죽이다.
+++) PID 부분도 라이브러리를 쓰지 않고 직접 작성해서 넣어봤다. 아래 블로그를 참고했다.

https://alnova2.tistory.com/1212

[벨런싱 로봇] PID 제어기 적용

벨런싱 로봇이 서 있는 상태를 유지하기 위해서는 MPU6050 에서 측정되는 값이 어떤 목표치에 근접하도록 모터를 움직여 줘야 한다. 즉 다음 그림에서 목표 각도와 현재 각도의 차이인 error를 해소

alnova2.tistory.com


balancing1.py



일단 위와 같이 작성해서 테스트를 해보았다.


test1


test2


test3


당연히 스스로 완벽하게 중심을 잡는 것은 실패했다.


그래도 topic을 정상적으로 publish, subscribe 하는 것을 확인했고, 모터, imu도 잘 작동하는 것을 확인했다


이제 prototype과 테스트 내용을 기반으로 최종본을 제작하고 코드도 새로 짤 예정이다.


그 과정에서 pid라이브러리와 pid tuning에 대해서도 공부를 해야할 거 같다.




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

반응형