Ubuntu 20.04 LTS 환경에서 패키지 빌드

 

지난번 Window환경에서 exe실행파일을 통해 IMU센서 정삭작동을 확인하였다.

Ubuntu에서 바로 테스트해보고자 하였으나 공식 Github 레포지토리에 AMD64 라이브러리가 잘못 올라와서 문의하고 수정된 걸 받고 하니 시간이 좀 걸렸다.

 

[10] 메카넘휠 로봇 IMU센서 작동 테스트(Window)

IMU센서 IMU센서는 엔티렉스에서 개발한 MW-AHRSv2를 사용하였다. MW-AHRSv1( 3축 가속도, 3축 자이로, 3축 지자기가 내장된 AHRS 모듈) 엔티렉스에서 2번째 선보이는 IMU 제품출시~!! 3축 가속도, 3축 자이로

merobot.tistory.com

Ntrex에서 제공하는 ROS2 패키지를 빌드해본다.

GitHub 레포지토리는 아래와 같다.

 

GitHub - ntrexlab/2th_NtrexAHRS_lib_ROS

Contribute to ntrexlab/2th_NtrexAHRS_lib_ROS development by creating an account on GitHub.

github.com

빌드환경은 다음과 같다.

  • Ubuntu 20.04 LTS AMD64
  • ROS2 Galactic

해당 패키지는 ROS2 Foxy를 위해 만들어진 패키지라 ROS2 Galactic에서 사용하려면 수정해주어야 할 곳이 있다.

여러 플랫폼에서 빌드가 가능하게끔 다양한 아키텍처의 라이브러리 파일도 제공하고 있었다.

젯슨나노에서 빌드할 때도 무리 없이 가능할 것으로 보인다.

 

사용 중인 플랫폼의 아키텍처에 맞추어 라이브러리 파일 교체하기

 

CPU의 아키텍처는 소형기기에 특화된 ARM,  현재 대다수의 랩탑에 탑재되는 AMD64, 오래전부터 사용되어 온 x86 등등 종류가 많다.

아키텍처의 종류에 따라 라이브러리의 호환성도 달라지기 때문에 알맞은 라이브러리를 패키지에 넣어줘야 한다.

 

터미널에 arch를 입력해서 아키텍처를 확인해 보자.

arch
# AMD64의 경우 x86_64
# JetsonNano B01의 경우 aarch64

x86_64가 나왔고 이는 AMD64 아키텍처를 의미한다.

 

위 레포지토리에서 Clone을 하면 폴더 구조는 다음과 같을 것이다.

.
├── lib_aarch64
│   └── MW_AHRS_aarch64.a
├── lib_amd64
│   └── MW_AHRS_amd64.a
├── lib_arm64
│   └── MW_AHRS_arm64.a
├── lib_armv7l
│   └── MW_AHRS_armv7l.a
├── README.md
└── ros2_example
    └── stella_ahrs

최상단에 각각의 아키텍처에 맞는 라이브러리 파일(.a)이 들어있고 ROS2 예제파일이 있다.

 

본인의 아키텍처에 맞는 라이브러리 파일(.a)를 복사해서 아래 표시한 폴더의 파일을 삭제 후 붙여 넣기 한다.

.
└── stella_ahrs
    ├── CMakeLists.txt
    ├── config
    │   └── config.yaml
    ├── include
    │   ├── mw
    │   └── serial
    ├── launch
    │   └── stella_ahrs_launch.py
    ├── lib
    │   └── MW_AHRS_aarch64.a #이 파일 삭제 후 붙여넣기!
    ├── mw
    │   └── mw_ahrs.cpp
    ├── package.xml
    ├── rviz
    │   └── imu_test.rviz
    ├── serial
    │   ├── list_ports_linux.cc
    │   ├── serial.cc
    │   └── unix.cc
    └── src
        └── listener.cpp

그리고 CMakeLists.txt 파일에서 라이브러리 변경한 내용을 수정해 준다.

target_link_libraries(${PROJECT_NAME}_node ${CMAKE_CURRENT_SOURCE_DIR}/lib/MW_AHRS_aarch64.a)
# 위 내용에서 변경한 라이브러리 이름으로 수정
target_link_libraries(${PROJECT_NAME}_node ${CMAKE_CURRENT_SOURCE_DIR}/lib/MW_AHRS_amd64.a)

 

ROS2 Galactic에 맞게 Launch파일 수정

 

만약 colcon build 후에 namespace, name, executable오류가 나지 않는다면 패스해도 좋다.

기존 Launch파일은 다음과 같다.

driver_node = LifecycleNode(package='stella_ahrs',
                            node_executable='stella_ahrs_node',	# 이 부분
                            node_name='stella_ahrs_node',# 이 부분
                            output='screen',
                            emulate_tty=True,
                            node_namespace='/',	# 이 부분
                            )

주석 넣은 부분을 다음과 같이 수정해 준다.

driver_node = LifecycleNode(package='stella_ahrs',
                            executable='stella_ahrs_node',
                            name='stella_ahrs_node',
                            output='screen',
                            emulate_tty=True,
                            namespace='/',
                            )

 

포트 이름 수정

 

IMU센서를 RS-232 to USB로 데스크톱 혹은 SBC와 연결한다.

그렇다면 /dev 하위에 포트할당이 될 텐데 chmod로 권한을 주고 포트 이름을 정의해 주어야 한다.

ls /dev/tty*

위 명령어를 입력하여 USB포트 몇 번에 할당되었는지 확인한다.

본인은 ttyUSB0에 할당되었다고 표시된다.

sudo chmod 777 /dev/<IMU센서의 포트>

포트에 권한을 부여해 준다.

 

그리고 패키지 내부의 src폴더에 들어가서 listener.cpp 파일을 연다.

#include "mw_ahrs.hpp"

int main(int argc, char **argv)
{
    rclcpp::init(argc, argv);

    char *port = "/dev/AHRS"; #이 부분을 수정!

    /*
        <ntrex::MwAhrsRosDriver>(port_name, baudrate, sel)

        sel 0 - 기능사용하지 않음
        sel 1 - Z축 캘리브레이션
        sel 2 - 각도리셋
        sel 3 - Z축 캘리브레이션및 각도리셋
    
    */
    rclcpp::spin(std::make_shared<ntrex::MwAhrsRosDriver>(port,115200,3));
    rclcpp::shutdown();
    return 0;
}

위 부분에서 주석처리한 곳의 포트 이름을 본인의 것으로 수정해 준다.

 

빌드

 

본인의 워크스페이스에서 빌드를 진행한다.

빌드 중 경고가 뜨는데 무시해도 상관없다.

 

이후 Launch파일을 실행해 보면 CLI에 정상 작동한다고 올라온다.

[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [stella_ahrs_node-1]: process started with pid [18437]
[stella_ahrs_node-1] 
[stella_ahrs_node-1] PortName : /dev/ttyUSB0 Connect OK 
[stella_ahrs_node-1] 
[stella_ahrs_node-1] [AHRS INFO] AHRS_Calibration OK ....
[stella_ahrs_node-1] 
[stella_ahrs_node-1] [AHRS INFO] AHRS_Euler_RESET OK ....
[stella_ahrs_node-1] 
[stella_ahrs_node-1] [AHRS INFO] ACC, GYR, DEG, MAG / 10ms / binary 
[stella_ahrs_node-1] [AHRS INFO] RUN ....
[stella_ahrs_node-1]

출하 시 캘리브레이션이 완료되어 있고 보드레이트는 115200으로 세팅되어 있다.

 

Jetson Nano에서 빌드

 

젯슨나노에서 빌드를 할 경우 Github 레포지토리 디폴트가 aarch64 아키텍처에 맞춰져 있기 때문에 젯슨나노에서 빌드를 할 경우 라이브러리 경로 및 이름 수정은 생략해도 된다.

 

결과 확인

 

우분투에서 레포지토리를 체크하고 빌드를 성공하여 젯슨나노에도 빌드하였다.

그리고 노트북과 SSH통신하여 ROS2 토픽을 확인해보았다.

 

[Topic List]

/imu/data
/imu/data_raw
/imu/mag
/imu/yaw

 

- /imu/data 토픽 

header:
  stamp:
    sec: 1678905590
    nanosec: 355329601
  frame_id: ''
orientation:
  x: -0.0022650316823273897
  y: 0.008727502077817917
  z: -0.00041651472565717995
  w: 0.9999592304229736
orientation_covariance:
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
angular_velocity:
  x: 0.0
  y: -0.0017453292780017621
  z: -0.0017453292780017621
angular_velocity_covariance:
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
linear_acceleration:
  x: 0.0
  y: 0.0
  z: 9.767423320505022
linear_acceleration_covariance:
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0

 

- /imu/data_raw 토픽

header:
  stamp:
    sec: 1678905686
    nanosec: 766772919
  frame_id: ''
orientation:
  x: 0.0
  y: 0.0
  z: 0.0
  w: 1.0
orientation_covariance:
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
angular_velocity:
  x: -0.0017453292780017621
  y: 0.0017453292780017621
  z: -0.0017453292780017621
angular_velocity_covariance:
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
linear_acceleration:
  x: -0.029419950255728324
  y: -0.05883990051145665
  z: 9.80665
linear_acceleration_covariance:
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0

 

- /imu/mag 토픽

header:
  stamp:
    sec: 1678905788
    nanosec: 136699912
  frame_id: ''
magnetic_field:
  x: 1.0300000212737359e-05
  y: -1.06999996205559e-05
  z: -2.5800000003073364e-05
magnetic_field_covariance:
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0

 

- /imu/yaw 토픽

data: 18.940000534057617