아두이노 환경에서는 아두이노 IDE를 통해, 다양한 센서를 손쉽게 다룰 수 있는 라이브러리들이 많으나, 라즈베리파이에서는 이런 편의성이 부족하여, 센서 관련 제어가 난해한 면이 있다. 이글에서는 IMU를 제어하는 RTIMULib를 사용한다. 아울러, 만보게, 나침반 및 AHRS 만들기 내용을 참고하였다.
RPi와 ROS의 연동을 위해서는 다음 설명을 참고한다.
1. RPi 테스트
RPi를 테스트하기 위해, 간단한 LED Blink 예제를 실행해 본다.
RPi-1의 GPio 핀아웃(Pinout)은 다음과 같다.
RPi-2의 GPio 핀아웃은 다음과 같다
2. 회로 연결, I2C 주소 확인 및 소스 수정
회로를 다음과 같이 연결한다 .
RTIMULib는 I2C 프로토콜을 사용한다. 그러므로, 아래와 같이 I2C에 연결된 장치를 확인할 수 있는 소프트웨어를 설치하고, I2C 모듈을 부팅시 실행해 주도록 설정해야 한다.
$ sudo apt-get install i2c-tools
다음과 같이 파일을 편집한다.
$ sudo nano /boot/config.txt
...
dtparam=i2c_arm=on
I2C 모듈을 활성화한다.
$ sudo raspi-config
부팅시 I2C 모듈을 추가한다.
$ sudo /etc/modules
재부팅하고, 다음 명령을 통해 I2C 모듈이 실행된 것을 확인한다.
$ lsmod
연결된 I2C장치를 확인한다.
$ sudo i2cdetect -y 1
그럼 다음과 같이, 연결된 장치의 주소를 확인할 수 있다.
여기서 19와 1e는 LSM303DLHC(가속도, 지자기), 6b는 L3GD20H(자이로), 77은 BMP180(Temp / Baro)이다.
이렇게 나오면, 제대로 센서들이 연결된 것이고, I2C 방식으로 데이터를 획득할 수 있다.
3. 빌드
RTIMULib 의존 패키지를 먼저 설치한다.
$ sudo apt-get install cmake libqt4-dev
RTIMULib 소스를 다운로드한다.
$ git clone https://github.com/richards-tech/RTIMULib
RTIMULib를 빌드하고, 설치한다.
$ cd ~/RTIMULib/Linux
$ mkdir build
$ cd build
$ cmake ..
$ make
$ sudo make install
RTIMULib 파이썬 모듈을 설치한다.
$ cd ~/RTIMULib/Linux/python
$ sudo python setup.py install
$ mkdir build
$ cd build
$ cmake ..
$ make
$ sudo make install
RTIMULib 파이썬 모듈을 설치한다.
$ cd ~/RTIMULib/Linux/python
$ sudo python setup.py install
4. 실행
RTIMULib 데모 프로그램을 실행해 본다.
$ cd ~/RTIMULib/Linux/build/RTIMULibDemo
$ sudo ./RTIMUDemo
센서 값 확인 윈도우 화면이 나오는 데, Select IMU 버튼을 선택해, 다음 종류 센서를 선택한다. 그리고, I2C bus 0을 선택한 후, 앞에서 확인한 센서 주소인 6b로 설정한다. 그리고, 확인한다.
L3GD20H(자이로), LSM303DLHC(가속도, 지자기)
그럼, 다음과 같이 정상적으로 센서값이 출력되는 것을 확인할 수 있다.
이제 OpenGL 데모를 실행해 본다.
$ cd ~/RTIMULib/Linux/build/RTIMULibDemoGL
$ sudo ./RTIMUDemoGL
다음과 같이 잘 실행된다.
각 값의 의미는 다음과 같다.
이제 칼만필터로 센서값을 보정해 본다. 이를 위해, 다음 패키지를 설치한다.
$ sudo apt-get install python-opengl
$ sudo apt-get install python-pygame
그리고, 다음 링크의 AHRS 프로그램을 작성하고, 실행해 본다.
$ sudo python ahrs.py
이를 ROS node로 구현해 보았다. 다음과 같이 IMU 센서값이 잘 처리된다.
구현 환경은 라즈베리파이2의 Raspbian, ROS indigo 환경이다.
5. 결론
빌드에 큰 문제가 없고, 잘 실행된다. 다만, ROS node 개발 시 catkin 환경이 갑자기 안되는 바람에, 다시 catkin 환경 초기화하는 문제가 발생했었고, 라즈비안의 환경이 워낙 열악하다 보니, std_msgs로만 메시지 토픽을 발생했다. 다른 이야기지만, 더불어, 라즈비안에서는 PCL 등 고급 센서를 쓰기 어려웠다는 문제가 있었다. 물론, 몇몇 사례에서, PCL을 사용한 사례가 있었지만, 이 경우에는 ROS 패키지 모듈간의 의존성이 잘 맞아 떨어진 때 였던 것으로 보인다. 지금 라즈베리파이2의 ubuntu 14.04에 ROS Indigo desktop 버전은 PCL 설치가 잘 되지 않았다.
6. 레퍼런스
이 글의 관련 레퍼런스는 다음과 같다.
- Adafruit 10-DOF IMU Breakout
- MinIMU-9 v2 Gyro, Accelerometer, and Compass (L3GD20 and LSM303DLHC Carrier)
- Adafruit WebIDE
- RTIMULib - a versatile 9-dof IMU library for embedded Linux systems
- BNO055 Absolute Orientation Sensor with Raspberry Pi & BeagleBone Black
- I2C 통신
- 라즈베리파이 활용법 주요 포스트
- 만보게, 나침반 및 AHRS 만들기
- 라즈베리파이 기반 MPU6050
- Building a Raspberry Pi datalogger for my Triumph Daytona
- 3D OpenGL visualization of the data from an MPU-6050 connected to a Raspberry Pi
안녕하세요 혹시 마지막 robot_sensor_imu.cpp 파일은 직접 만드신건가요? 아니면 따로 다운받을수있는곳이 있나요??
답글삭제오래전이라,.. github 코드 업로드했으니 참고 하세요. https://github.com/mac999/ROS/tree/master/reschy_sensor/src
삭제