본문 바로가기

개인 프로젝트

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

반응형

[노드 제작2]

 

이전에 sensor_msgs/Imu메시지로 보내는 것에 실패해서 이번에는 그냥 Float32MultiArray로 값만 보낸 후 노드를 하나 더 거쳐서 sensor_msgs/Imu에 data를 채우는 방식으로 코딩을 했다.

 

 

이 과정에서도 좀 헤매었고 아래 글들을 참고해서 아두이노 코드를 완성했다.

 

 

https://stackoverflow.com/questions/69649792/how-to-publish-int16multiarray-from-rosserial-arduino

 

How to publish Int16MultiArray from rosserial arduino

I am trying to publish an Int16MultiArray for the ros package mecanum_drive: https://github.com/dudasdavid/mecanum_drive My issue is that I cant seem to publish the array from my arduino. (I am using

stackoverflow.com

 

https://answers.ros.org/question/10988/use-multiarray-in-rosserial/

 

use MultiArray in rosserial - ROS Answers: Open Source Q&A Forum

use MultiArray in rosserial edit Hi All Can we use std_msgs MultiArray in rosserial? I'm trying following code, but it doesn't work. The topic has no data. We are using rosserial of revision 133:db62c6309a50 tip. Does anyone have suggestion? #include #incl

answers.ros.org

 

 

 

 

 

성공적으로 아두이노에서 보낸 가속도값(0,1번), 각속도값(2,3번)을 subscribe했다.

 

 

다만 첫 연결 때는 실패하고 이후 재시도에서 rosserial이 연결되는 현상은 해결하지 못했다.

 

 

이는 일단 기능에는 큰 지장을 주지 않으니 추후에 해결할 예정이다.

+)추측 : 

mpu.begin()후 mpu가 initialize 하는 단계에서 아무런 데이터를 내보내지 않기에 ros가 이때는 연결이 안 되었다고 판단하는 게 아닌가? 이후 initialize가 끝나면 ros가 재연결 시도할 때 성공하는 것으로 추정

 

 

 

 

이후 Float32MultiArray로 전달된 가속도와 각속도 값을 sensor_msgs/Imu 형태로 변환해서 publish하는 노드를 파이썬으로 만들었다.

 

 

 

성공했다.

sensor_msgs/Imu에 담긴 가속도, 각속도 값

 

 

rqt_graph

 

 

+)★중요 : 

위의 코드를 보면 가속도, 각속도 외에도 header에 현재 시각과 frame_id를 넣어줬는데 처음에 시도할 때는 이들을 넣지 않았었다.

 

이렇게 하니 여러 아래의 문제가 생겼었다.

 

1. 이후 사용할 imu_complementary_filter 노드가 orientation을 publish 할 때 값이 계속 변하는 게 아닌 같은 값만 계속 출력했다,

 

2. rqt의 plot으로 가속도와 각속도를 시각화해도 시간축이 멈춘 상태로 하나의 세로 직선만 나타났다.

 

3. 이후 사용할 imu_tools의 rviz_plugin을 사용해도 정상적으로 작동하지 않았다.

 

 

'노드를 만들 때는 꼭 해더를 넣어줘야 한다'는 것을 배웠다....

 

 

 

 

 

 

이제 마지막으로 mpu6050에서 받은 값을 complementary filter 노드를 통과시켜서 우리가 필요로 하는 기울기(orientation)를 얻었다.

 

imu_complementary_filter 를 통과해 orientation을 포함한 sensor_msgs/Imu

 

 

추가로 imu_tools를 이용해 시각화된 데이터도 보았다.

 

 

움직임은 잘 잡아내지만 처음에 기울어진 상태로 나오므로 조정이 이후 필요할 것 같다.

 

 

 rviz에서 보는 방법은 처음에 설치한 imu_tools의 rviz_plugin을 이용하면 된다.

 

 

1. rviz를 실행 후 Fixed Frame을 sensor_msgs/Imu의 헤더에 입력한 frame으로 바꿔준다. (나는 imu라고 했다.)

 

2. Add -> rviz_imu_plugin -> Imu를 추가해준다,

 

3. Imu에서 Topic을 complementary_filter를 통과한 topic으로 바꿔준다. (따로 바꾸지 않았다면 /imu/data 일 것이다.)

 

 

 

 

 

일단 이렇게 imu의 데이터를 성공적으로 ros로 가져왔다. 

 

 

 

 

 

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

반응형