Pixhawk 2 Cube Orange와 Companion Board(Raspberry Pi 4) 연결하기 4- Pixhawk와의 통신 테스트하기

2023. 1. 4. 17:05UAV/Software

이전 포스팅에서 이어집니다.

 

2022.07.27 - [UAV/Software] - Pixhawk 2 Cube Orange와 Companion Board(Raspberry Pi 4) 연결하기 1- Raspberry Pi 4 환경 구성

 

Pixhawk 2 Cube Orange와 Companion Board(Raspberry Pi 4) 연결하기 1 - Raspberry Pi 4 환경 구성

라즈베리파이에 Ubuntu 20.04 설치 이 내용은 참고 자료가 너무 많아 자세히는 다루지 않고, 링크 첨부로 대신합니다. https://linuxhint.com/install-ubuntu-desktop-20-04-lts-on-raspberry-pi-4/ Install Ubuntu Desktop 20.04 L

mkdrone.tistory.com

2022.11.06 - [UAV/Software] - Pixhawk 2 Cube Orange와 Companion Board(Raspberry Pi 4) 연결하기 2- Raspberry Pi 4 하드웨어 구성

 

Pixhawk 2 Cube Orange와 Companion Board(Raspberry Pi 4) 연결하기 2- Raspberry Pi 4 하드웨어 구성

이전 포스팅에서 이어집니다. 2022.07.27 - [UAV/Software] - Pixhawk 2 Cube Orange와 Companion Board(Raspberry Pi 4) 연결하기 1- Raspberry Pi 4 환경 구성 Pixhawk 2 Cube Orange와 Companion Board(Raspberry Pi 4) 연결하기 1 - Raspberry

mkdrone.tistory.com

2022.12.26 - [UAV/Software] - Pixhawk 2 Cube Orange와 Companion Board(Raspberry Pi 4) 연결하기 3- SSH를 이용한 Raspberry Pi 원격 접속

 

Pixhawk 2 Cube Orange와 Companion Board(Raspberry Pi 4) 연결하기 3- SSH를 이용한 Raspberry Pi 원격 접속

이전 포스팅에서 이어집니다. 2022.07.27 - [UAV/Software] - Pixhawk 2 Cube Orange와 Companion Board(Raspberry Pi 4) 연결하기 1- Raspberry Pi 4 환경 구성 Pixhawk 2 Cube Orange와 Companion Board(Raspberry Pi 4) 연결하기 1 - Raspberry

mkdrone.tistory.com

 

이번 포스팅에서는 앞서 거쳐온 과정들을 바탕으로 픽스호크와 연결된 라즈베리파이 상에서 연결을 테스트하는 과정을 다뤄보고자 합니다.

 

Raspberry Pi 4 연결 설정


우선, 라즈베리파이에서의 시리얼 포트 활성화, mavros launch 파라미터 수정 등을 해주어야 합니다. 두 번째 포스팅의 하드웨어 구성에서 진행한 두 보드간의 연결에 필요한 전원부 구성, usb  ttl 커넥터 제작 등을 완료했다는 가정하에 진행하도록 하겠습니다. 또한 초기 설정 등을 포함하므로 ssh 접속이 아닌 모니터를 연결하여 진행하겠습니다.

 

드론에 전원을 넣어 라즈베리파이와 픽스호크에 전원이 모두 인가되도록 합니다. 안전상의 문제가 있으므로 송신기(조종기) 전원은 켜고, 프로펠러는 제거 후 진행하시는 것을 추천드립니다.

 


Serial Port 확인

터미널을 열어 다음 커맨드를 입력합니다.

 

ls -l /dev/ttyUSB*

 

USB 시리얼 포트를 확인하는 명령어이며, 기본적으로 ttl 컨버터를 연결했을 때, ttyUSB0라는 포트명으로 포트가 잡히게 됩니다. 아래 사진은 해당 명령어를 입력한 결과이며, ttl 컨버터를 꽂은 채로 부팅했으므로 부팅 시간(15:35)에 포트가 연결 되었음을 보실 수 있습니다.

 

 

시리얼 포트 확인

 


권한 부여

이제 해당 포트에 연결되는 픽스호크가 companion computer(Raspberry Pi)에 읽기/쓰기 권한을 가질 수 있도록 아래 명령어를 통해 접근 권한을 부여합니다.

 

sudo chmod 666 /deb/ttyUSB0

 


mavros launch 파일 수정

다음으로는 mavros 런치 파일의 기본 파라미터를 수정하는 작업을 진행합니다. 현재 ArduPilot을 이용하므로, apm.launch 파일을 통해 mavros를 실행하게 됩니다.

 

<launch>
	<!-- vim: set ft=xml noet : -->
	<!-- example launch script for ArduPilot based FCU's -->

	<arg name="fcu_url" default="/dev/ttyACM0:57600" />
	<arg name="gcs_url" default="" />
	<arg name="tgt_system" default="1" />
	<arg name="tgt_component" default="1" />
	<arg name="log_output" default="screen" />
	<arg name="fcu_protocol" default="v2.0" />
	<arg name="respawn_mavros" default="false" />

	<include file="$(find mavros)/launch/node.launch">
		<arg name="pluginlists_yaml" value="$(find mavros)/launch/apm_pluginlists.yaml" />
		<arg name="config_yaml" value="$(find mavros)/launch/apm_config.yaml" />

		<arg name="fcu_url" value="$(arg fcu_url)" />
		<arg name="gcs_url" value="$(arg gcs_url)" />
		<arg name="tgt_system" value="$(arg tgt_system)" />
		<arg name="tgt_component" value="$(arg tgt_component)" />
		<arg name="log_output" value="$(arg log_output)" />
		<arg name="fcu_protocol" value="$(arg fcu_protocol)" />
		<arg name="respawn_mavros" value="$(arg respawn_mavros)" />
	</include>
</launch>

 

위 코드블록은 기본적으로 제공되는 apm.launch 파일입니다.

fcu_url 부터 respawn_mavros까지 실행에 필요한 여러가지 파라미터들이 존재합니다.

이 때, fcu_url이라는 부분이 mavros를 연결할 autopilot의 주소라고 생각하시면 됩니다.

 

지난 포스팅에서는 SITL상의 ArduPilot과 연결하기 위해, UDP 프로토콜을 이용하였고, 다음과 같은 방식으로 런치 파일을 실행했었습니다.

 

 roslaunch mavros apm.launch fcu_url:=udp://:14550@

 

이 때는 ArduPilot SITL과 UDP 프로토콜로 연결되므로, fcu_url을 udp://:14550@로 지정하였습니다.

 

하지만 실제 기체에 탑재된 픽스호크와 라즈베리파이를 연결할 때에는, 위에서 언급한 시리얼 포트(/dev/ttyUSB0)를 이용해야 하므로, 다음과 같이 입력해야 합니다.

 

roslaunch mavros apm.launch fcu_url:="/dev/ttyUSB0:921600"

 

해당 커맨드의 의미는 시리얼 포트 /dev/ttyUSB0 를 이용할 것이며, baud rate를 921,600으로 설정하겠다는 의미입니다. 이를 위해 ArduCopter 매개 변수 중, SERIAL2_BAUD 매개변수를 921로 설정했던 것입니다. (2번째 포스팅 참고)

 

 

하지만 매번 실행때마다 이런 식으로 같은 시리얼 포트와 baud rate를 입력하는 것은 매우 번거로우므로, 위의 기본 launch파일에서 fcu_url의 디폴트값을 해당 주소로 변경해주는 과정을 수행한다면 훨씬 간편할 것입니다.

 

roscd mavros/launch/
sudo gedit apm.launch

 

roscd 커맨드는 ROS 패키지의 경로를 자동으로 찾아주며, 해당 경로로 이동합니다. (line 1)

 

mavros는 opt 디렉토리에 설치되어 있어, 해당 디렉토리 하위 파일들을 편집하고자 할 때 관리자 권한이 필요합니다. 따라서 sudo gedit ~ 형태로 명령어를 입력해 주어야 합니다. (line 2)

 

 

launch 파일 편집 화면

 

위 사진과 같이, fcu_url의 default값에 해당하는 부분을 "/dev/ttyUSB0:921600"  으로 변경해줍니다.

 

위 과정을 통해 이후에는  간단하게 별도의 fcu_url 입력 없이도 런치 파일을 실행시킬 수 있게 됩니다.

 

roslaunch mavros apm.launch

 

수행 결과는 다음과 같습니다. 하트비트, 펌웨어 버전, EKF 값 등 전부 정상적으로 출력됨을 확인할 수 있습니다. 

 

roslaunch mavros apm.launch 수행 결과

 


Connection Test 1 - topic subscribe test

rostopic list

 

 

rostopic list

 

위 커맨드를 이용하면, 현재 mavros 노드가 발행중인 토픽들을 확인할 수 있습니다. 우선 가장 간단하게 현재 기체 상태를 받아 오는 /mavros/state 토픽을 구독해보겠습니다. 토픽을 구독할 때는 rostopic echo '토픽명' 으로 진행합니다.

 

rostopic echo /mavros/state

 

 

rostopic echo /mavros/state

 

수행 결과로, 1초마다 기체의 현재 모드, 아밍 상태 등을 출력함을 보실 수 있습니다.

또한 송신기의 모드 변환 스위치를 움직였을 때, 모드가 변하는 것을 아래 영상으로 확인해 보실 수 있습니다. 

 

https://youtu.be/R8mCeVPsjZ0

 

※Sensor Data Communication Exception

기체의 GPS 데이터, IMU 센서 데이터 등 별도의 센서 데이터들이 받아와지지 않는 경우가 있습니다. 저도 원인은 파악하지 못했으나, 아래 커맨드를 이용하여 센서 데이터 송수신 주기를 맞춰주어야 한다고 합니다.

 

rosrun mavros mavsys rate --all 10

 


Connection Test 2 - 실제 예제 수행

 

이외에도, 앞선 포스팅에서 한 것 처럼 직접 예제를 실행할 수도 있습니다.

 

2022.07.20 - [UAV/Software] - ArduPilot SITL - MAVROS 연결하기

 

ArduPilot SITL - MAVROS 연결하기

환경: Ubuntu 20.04 / ROS Noetic / Gazebo 11 ROS는 정상적으로 설치되어 있다고 가정하고 이후 과정부터 진행하겠습니다. 혹시 해당 과정들이 궁금하신 분들은 아래 링크를 참고하셔서 진행하시면 됩니다

mkdrone.tistory.com

 

cd ~/catkin_ws/src
git clone https://github.com/dk5824/guided_py

# grant execute permission
cd ~/catkin_ws/src/guided_py/scripts
chmod +x test_callback_functions.py
chmod +x test_local_servoing.py

cd ~/catkin_ws
catkin_make
source devel/setup.bash

 

앞선 SITL-MAVROS Connection 포스팅과의 다른 점은, 시뮬레이션 환경이 아닌 실제 드론과의 연결이므로, Gazebo 시뮬레이터 및 ArduPilot SITL을 실행할 필요가 없다는 것입니다. 드론에 전원을 인가하여 픽스호크와 라즈베리파이 두 보드에 모두 전원이 인가된다면, 다음 두 터미널을 통해 예제를 실행해볼 수 있습니다.

 

 

Terminal 1: MAVROS 실행

 

roslaunch mavros apm.launch

 

Terminal 2: 예제 패키지 코드 실행

 

rosrun guided_py test_callback_functions.py

 

 

콜백 함수 테스트 노드 외에도, test_local_servoing.py라는 기동 노드도 같이 업로드해두었습니다.

코드 실행 시 자동으로 GUIDED 모드로 전환 후 arming하며, 5m 고도로 이륙하여 상대좌표 (3,6,5)로 기동 후 그 자리에서 LAND 모드로 변경하여 착륙하는 코드입니다.

실제 드론에 올려서 시험해보시고 싶으신 분들은 야외에서 GPS 신호 감도를 확인하여 충분한 여유 공간을 두고 진행하시기 바랍니다.

 

 

 이상으로 이번 포스팅을 마칩니다. 긴 글 읽어주셔서 감사드리며, 궁금한 점이나 잘못된 점이 있으시면 알려주시면 감사하겠습니다.