본문 바로가기

작업 일기

Arduino와 ROS로 IMU 센서 (MPU 9250 ) 사용하기

 

- 개발 환경 : Raspberry Pi 4B (Ubuntu 18.04 / ROS melodic)

- 준비물 : Arduino 보드, IMU 센서 (MPU 9250)

- 참조 : https://learning.oreilly.com/library/view/ros-robotics-projects/9781783554713/ch05s04.html

 

 

 

Step1. Raspberry Pi 4B에 Ubuntu 18.04 설치하기

https://do-9un6.tistory.com/2

 

Raspberry Pi 4B에 Ubuntu 18.04 설치하기

- 준비물 : Raspberry Pi 4B, SD Card, SD Card Reader - 참조 : https://www.youtube.com/watch?v=zasvSKaobVI&t=576s (유투브 구선생) Step1. SD Card 포맷 - SD 카드를 USB 리더기에 꽂아주고 PC에 연결합..

do-9un6.tistory.com

 

 

 

Step2. Ubuntu 18.04에 ROS melodic 설치하기

https://do-9un6.tistory.com/4

 

Ubuntu 18.04에 ROS melodic 설치하기

- 개발환경 : Raspberry Pi 4B (Ubuntu 18.04) - 참조 : http://wiki.ros.org/melodic/Installation/Ubuntu Step1. Ubuntu 18.04 설치 https://do-9un6.tistory.com/2 참고 Step2. ROS melodic 설치 - Ubuntu 18..

do-9un6.tistory.com

 

 

 

Step3. 아두이노와 ROS 인터페이스

- 아두이노 보드와 ROS를 인터페이싱한다는 것은 일반 ROS 노드처럼 발행/구독이 가능한 ROS 노드를 아두이노에서 실행하는 것을 의미합니다. PC (Raspberry Pi / Ubuntu 18.04 / ROS melodic)와 아두이노의 주요 통신은 UART를 통해 이루어지는데, ROS Serial이라는 전용 프로토콜이 있으며, ROS Serial message를 인코딩 및 디코딩 할 수 있는 ROS 메타패키지로서 구현됩니다. 즉, ROS Serial 프로토콜을 이용하여 UART를 통해 ROS 노드처럼 Arduino를 발행 및 구독할 수 있습니다. 흔히 말해 ROS Serial 통신을 하는 것 입니다.

 

- 먼저, PC (Raspberry Pi / Ubuntu 18.04 / ROS melodic)에서 rosserial 메타패키지/클라이언트 패키지를 설치합니다.

$ sudo apt-get install ros-melodic-rosserial
$ sudo apt-get install ros-melodic-rosserial-arduino

 

- 아래의 링크에서 Linux용 아두이노 IDE를 설치합니다.

https://www.arduino.cc/en/software

 

Software

Open-source electronic prototyping platform enabling users to create interactive electronic objects.

www.arduino.cc

$ cd /Downloads/arduino-1.8.18
$ sudo ./install.sh
$ sudo apt install fonts-nanurm-coding
$ sudo apt-get update

 

 

- 아두이노 IDE를 실행시켜 File - Preference에 들어가서 Sketchbook location을 설정해줍니다.

Arduino board preference

 

- sketchbook location으로 가서 libraries 폴더가 없다면 생성해줍니다. 모든 Arduino 라이브러리를 보관하는 곳입니다.

 

- 터미널 창을 열어 libraries 폴더로 들어가 Arduino용 ros_lib 라이브러리를 생성합니다.

$ cd libraries
$ rosrun rosserial_arduino make_libraries.py .

 

 

- 아두이노 IDE에서 File - Examples 에 보면 ros_lib을 확인하실 수 있습니다.

 

 

 

Step4. 아두이노에 IMU센서 (MPU-9250) 연결

- 아래의 사진과 같이 연결하시면 됩니다.

Interfacing MPU 9250/9150/6050 with Arduino

 

 

 

Step5. IMU센서 (MPU-9250) 라이브러리 다운로드

- ROS에서 IMU 값을 받아오기 위해서는 ROS-Arduino 노드를 생성하여 ROS topic으로 보내야합니다.

 

- 이를 위해 먼저 라이브러리를 다운로드 받아줍니다.

(참고로 현재 사용하는 IMU센서 MPU-9250은 MPU-9150 라이브러리를 사용합니다.)

$ git clone https://github.com/sparkfun/MPU-9150_Breakout/tree/master/firmware

 

(저는 해당 명령어가 먹질 않아서 https://github.com/sparkfun/MPU-9150_Breakout.git 링크에 접속하여 수동 다운로드 했습니다.)

 

- 다운로드 후, firmware안의 I2Cdev 폴더와 MPU6050 폴더를 arduino_sketch_location/libraries 폴더 안에 위치시킵니다.

 

 

Step6. IMU센서 (MPU-9250) 아두이노 코드 컴파일 및 업로드

 

- 아래에 코드 파일 첨부하였으니 다운로드하셔서 사용하시면 됩니다.

MPU9250_ROS_DMP_Debug.ino
0.01MB

 

 

- 먼저 컴파일을 통해 코드에 이상이 없는지 확인합니다.

저는 크게 총 2가지의 오류 및 경고가 발생하였습니다.

 

1. 첫번째는 Overflow 에러입니다.

해당 데이터와 Packet은 매개변수이며, 4byte (32bit)로 처리되기 때문에 Overflow 에러가 발생했습니다.

따라서 라이브러리 폴더의 MPU6050_6Axis_MotionApps20.h 파일에서 Overflow 에러가 발생한 부분에

Uint32_t{ } 를 추가하여 해결했습니다.

(참고 : https://stackoverflow.com/questions/52680479/i-am-trying-to-make-a-self-balancing-robot-but-there-is-an-error-in-compiling )

Overflow 에러

 

2. 두번째는 definition 경고입니다.

여러 개의 헤더파일에서 중복으로 class가 definition되어 발생하는 경고로 추측됩니다.

구조적인 문제가 아니기 때문에 무시해도 되는 경고입니다.

(경고를 해결하기 위해서는 해더파일에서 수정해야하는데 현재 공부 중입니다.)

definition 경고

- 컴파일 완료 후, 아두이노와 라즈베리 파이를 연결하고 코드를 업로드합니다.

 

 

 

Step6. ROS를 통한 아두이노 IMU센서 (MPU-9250) 작동

- 라즈베리파이에서 터미널 창을 열어 해당 명령어를 입력하여 ROS Serial 노드를 실행합니다.

$ roscore
$ rosrun rosserial_python serial_node.py /dev/ttyACM0

 

- rostopic list 명령어를 통해 imu_data topic이 실행되고 있는 것을 확인할 수 있으며,

  rostopic echo 명령어를 이용하여 imu 데이터 값을 확인할 수 있습니다.

$ rostopic list
$ rostopic echo imu_data

 

- Rviz에서 TF 데이터를 시각화할 수 있습니다. 다음 명령을 사용하여 Rviz를 실행할 수 있습니다.

(base_link는 고정 프레임을 나타냅니다.)

$ rosrun rviz rviz -f base_link

 

- Rviz 창이 나타나고, Rviz 왼쪽에 TF 옵션이 없으면 Add하여 추가합니다.
(IMU의 회전에 따라 imu_frame이 이동하는 다음과 같은 시각화를 얻을 수 있습니다.)

Visualizing IMU data in Rviz