ReconROS
사용하기 쉬운 ROS2 FPGA 기반 하드웨어 가속 프레임워크
ReconOS를 기반으로 함
FPGA 보드 준비
FPGA 보드에 ROS2와 ReconOS를 설치해야 합니다. 더 빠르게 시작할 수 있도록 사전 설치된 이미지가 있습니다:
ZCU104-Board
Pynq-Board
MiniITX-Board non-rt kernel
MiniITX-Board rt kernel
이미지를 SD 카드에 굽는 가장 쉬운 방법은 balena etcher를 사용하는 것입니다. 또한 리눅스 dd 도구(예:
dd if=/image.img of=/dev/<<yoursdcard>> bs=4M
)를 사용할 수도 있습니다.
또한 이더넷 케이블이 필요하며, 터미널을 192.168.2.xx 범위의 로컬 IP(Netmask 255.255.255.0), 단 99 제외로 구성해야 합니다. 이것은 pynq 보드의 IP입니다.
점퍼 J4를 사용하여 SD 카드 부팅으로 보드를 설정합니다.
시리얼 터미널 프로그램을 구성하세요. COM 포트는 일반적으로 다음과 같이 구성됩니다:
/dev/ttyUSB1 -serial -sercfg 115200,8,n,1,N
모든 것이 잘 작동하면 장치가 부팅되는 것을 볼 수 있으며, 자동으로 xilinx로 로그인됩니다.
저장소 초기화
하드웨어 매핑된 토픽의 생성은 원시 메시지 정의 파일에 의존하기 때문에, 필수 서브모듈을 클론(clone)한 후 업데이트해야 합니다.
$ git submodule init && git submodule update
알려진 문제 (Knows Issues)
ROS 2의 표준 메시지 타입 명명 규칙이 일관적이지 않습니다. 따라서 일부 경우에 메시지 정의 파일의 이름도 변경해야 합니다(예: ReconROS Turtlebot 3 예제의 경우, UINT64 정의 파일을 (UInt64.msg를 U_Int64.msg로)).
설치
ReconROS는 애플리케이션 컴파일 및 사용자 정의 ROS 메시지 패키지 빌드를 위해 에뮬레이션된 docker 컨테이너를 사용합니다.
ReconROS 애플리케이션을 빌드하는 첫 단계는 다음 명령어를 사용하여 환경을 소싱(sourcing)하는 것입니다:
sudo apt install python3-colcon-common-extensions
이 단계는 설치 과정뿐만 아니라 애플리케이션 컴파일 전에도 필요합니다.
ReconROS를 처음 사용하는 경우, 다음 명령어가 필요한 패키지를 설치하고 교차 컴파일(cross compiling)을 위한 docker 컨테이너를 빌드합니다.
추가적으로 다음을 소싱해야 할 수도 있습니다:
$ source /opt/ros/dashing/setup.bash
$ source /opt/Xilinx/Vivado/2017.1/settings64.sh
...
또한, 일부 패키지가 누락되었을 수 있으므로 다음 명령어를 입력해야 할 수도 있습니다:
$ sudo apt-get install g++-multilib
ROS 데모 빌드 및 실행
세 가지 종류의 데모가 사용 가능합니다. 아래에서 사용된 데모는 pub/sub 통신을 기반으로 합니다. 나머지 두 데모는 클라이언트-서버 통신에 ROS2 액션(actions)과 서비스(services)를 사용합니다. 두 데모 모두 사용자 정의 ROS2 메시지 패키지를 빌드하기 위한 선행 명령이 필요합니다.
$ rdk export_msg && rdk build_msg
ROS 정렬 데모
ROS 정렬 데모는 pub/sub 통신을 기반으로 하며, 서버 및 클라이언트 애플리케이션을 빌드하고 실행하는 과정이 ROS 정렬 데모 서비스와 동일합니다. 클라이언트 애플리케이션이 빌드된 후, 지속적으로 정렬되지 않은 데이터를 전송하며 정렬된 데이터를 다시 받습니다.
ROS 정렬 데모 서비스
나머지 두 데모는 클라이언트-서버 통신에 ROS2 액션과 서비스를 사용합니다. 두 데모 모두 사용자 정의 ROS2 메시지 패키지를 빌드하기 위한 선행 명령이 필요합니다.
/demos/ros_sort_demo_services/server_app/으로 이동하여 다음 명령어를 입력합니다:
$ rdk export_msg && rdk build_msg
첫 번째 단계: 서버 애플리케이션
서버 애플리케이션 빌드
서버 데모 폴더로 이동합니다. 이 폴더에는 ReconROS에서 사용되는 build.cfg 파일이 포함되어 있습니다. 애플리케이션을 컴파일하기 전에 프로젝트를 내보내야(export) 합니다:
그리고 컴파일합니다:
하드웨어 부분도 유사하게 빌드됩니다:
그리고 합성(synthesize)합니다:
pynq 보드로 파일 복사하기
server_app/build.msg로 이동하여 커스텀 메시지 패키지를 scp를 사용하여 fpga에 복사합니다.
비밀번호를 묻는데, 이는 사용자 이름과 동일한 xilinx입니다.
server_app/build.sw로 이동합니다.
애플리케이션을 fpga에 복사하기 전에 실행 가능하게 만든 다음 복사해야 합니다:
server_app/build.hw/myReconOS.runs/impl_1로 이동합니다.
서버 애플리케이션 실행하기
시리얼 터미널에서 다음을 수행합니다:
그런 다음 cd/를 수행하고 ls를 입력하여 message_package.zip, design_1_wrapper.bit, sortdemo가 fpga에 복사되었는지 확인합니다.
다음 명령으로 fpga를 재구성(reconfigure)합니다:
$ cat design_1_wrapper.bit > /dev/xdevcfg
/opt/reconos로 이동하여 다음을 입력합니다:
그런 다음
$ source /opt/ros/dashing/setup.sh
다시 돌아가서 mnt/project/build.msg/ 디렉토리를 생성하고 message_package.zip을 압축 해제합니다.
$ unzip message_package.zip -d /mnt/project/build.msg/
그런 다음 mnt/project/build.msg/에서 명령을 입력합니다:
$ source install/local_setup.sh
다음으로 다음 명령어로 서버 애플리케이션을 실행합니다:
여기서 0 1은 하드웨어 파라미터입니다.
모든 것이 정상적으로 작동하면, 새로운 데이터를 기다리고 있다는 서버 메시지가 표시되어야 합니다.
두 번째 단계: 클라이언트 애플리케이션
The x86 클라이언트 애플리케이션은 colcon build 명령을 사용하여 컴파일할 수 있습니다. ROS2가 사용자의 기기에 설치되어 있어야 한다는 점에 유의하십시오.
먼저 다음 명령어를 입력합니다:
$ source /opt/ros/dashing/setup.sh
ros_sort_demo_service/client_app_x86/sorter_msgs로 이동하여 명령어를 입력합니다.
$ colcon build
$ source install/local_setup.bash
그 다음 ros_sort_demo_service/client_app_x86/sorter_client에서도 동일하게 수행한 후, 마지막으로
$ ros2 run sorter_client client
이 클라이언트 애플리케이션은 정렬되지 않은 숫자를 서버 애플리케이션으로 보내고 정렬된 데이터를 다시 받는 역할을 합니다.
ARM 기반 클라이언트 애플리케이션의 경우, 서버 애플리케이션에 대해 설명된 것과 동일한 절차를 사용해야 합니다.
ROS sort demo action
이 데모는 클라이언트 애플리케이션 실행을 제외하고 서비스와 동일한 단계를 따릅니다.
먼저 명령어를 입력합니다.
$ source /opt/ros/dashing/setup.sh
client_app_x86/sorter_msgs로 이동하여 명령어를 입력합니다.
$ colcon build
$ source install/local_setup.bash
그 다음 원래 위치로 돌아와서 명령어를 입력합니다.
$ python3 sort_action_client.py
이 과정에서 서버 측과 클라이언트 측 모두에 진행 상황 메시지가 표시되는 것을 확인할 수 있습니다.
Publications
- [1] - [Christian Lienen, Marco Platzner, Bernhard Rinner