[ROS] 패키지 소스 빌드 전 의존 패키지 설치하기

ROS를 개발하다보면 여러가지 패키지들을 사용해야 하고, 또한 오픈소스로 공개되어 있는 (주로는 github 등에서 받아오는) 패키지를 받아 빌드하여 사용해야할 경우가 생긴다.

이때 빌드하려는 패키지가 사용하는 의존 패키지들을 설치해줘야 빌드가 제대로 될 수 있는데, 이를 일일이 설치하는 것부터가 일이 되는 경우가 있다. README.md 파일에 이런 패키지들을 설치해야 합니다라고 알려주고 설치방법을 다음과 같이 패키지 리스트와 같이 알려 주는 경우도 있다.

$ sudo apt install package1 package2 ...

ROS에선 이를 쉽게 해결하기 위해서 rosdep 툴을 제공한다. rosdep이 하는 일을 보면, 여러가지 패키지들의 이름을 저장해 놓고, 각 패키지의 이름에 해당하는 시스템 패키지 명을 db로 저장하고 있는 형태이다. 기본적으론 rosdep.yaml 파일을 메인 레포지토리에서 받아와서 사용하고 있으며, 사용자가 이 파일을 수정하여 사용할 수도 있다.

각 패키지의 package.xml 파일엔 이 패키지가 의존하는 패키지들의 리스트가 저장되어 있다 (잘 만들어진 패키지라면…). rosdep은 각 패지키의 package.xml 파일을 읽어와, 의존 패키지 리스트를 만들고, 이를 위에서 설명한 db와 매칭하여 시스템 패키지를 설치하는 과정을 거친다.

따라서 패키지 디렉토리로 이동하여 다음과 같이 입력한다.

$ rosdep install --from-paths . --ignore-src -r -y

이렇게 하면 현재 디렉토리부터 하위 디렉토리를 순환하여 돌아다니며, 의존 패키지들을 자동으로 설치해 준다.

만약 파이썬으로 구성된 패키지이고, 의존 패키지를 requirements.txt 내에 잘 정리해 두었다면, 위와 같은 방법으로 다음과 같이 실행하면 의존 패키지를 pip를 이용하여 설치한다.

$ find -name 'requirements.txt' | xargs -L 1 sudo pip install -U -r

다른 사람이 만들어 놓은 패키지를 잘 이용하는 것도 좋지만, 위와 같은 과정을 잘 익혀두었다가 본인이 만든 패키지를 배포할때도 package.xml, requirements.txt 파일을 잘 정리하여 배포한다면 다른 사람이 별다른 수고없이도 쉽게 사용할 수 있게 된다.

Ubuntu와 Windows 멀티부팅 시 시스템 시간 변경 문제 해결

Ubuntu와 Windows를 듀얼부팅으로 사용하는 경우, Ubuntu를 사용한 다음 윈도우로 부팅하면 현재 시각이 다른 값으로 설정되어 있다. 자동으로 조정 기능을 껐다가 키면 다시 정상 시각으로 설정되지만 매번 그러기엔 아주 귀찮다.

Ubuntu에서 시각을 UTC를 기준으로 삼아 사용해서 생기는 문제인데, 이를 사용하지 않고 로컬타임으로 사용하게끔 하면 문제는 해결된다.

16.04 이후 버전부터는 터미널에서 다음과 같이 입력한다.

$ sudo timedatectl set-local-rtc 1

이렇게 되면, 이제 서로 다른 운영체제로 부팅하더라도 시스템의 시간은 변경되지 않는다.

커스텀 메시지를 이용할 경우 catkin 빌드 에러 해결

ROS 패키지를 개발할 때, Topic, Service, Action을 사용할 경우, 기존 정의되어 있는 여러가지 메시지를 사용할 수도 있지만, 편의상 사용자가의 커스텀 메시지를 이용해야 하는 경우가 있다.

이때 Python으로 개발하면 별다른 문제는 없지만, C++로 만든 노드의 경우 catkin 빌드를 하게 되면 커스텀 메시지의 header 파일을 찾을 수 없다는 에러가 나온다.

Errors     << dynamixel_ros_control:make /home/robot/catkin_ws/logs/dynamixel_ros_control/build.make.000.log                                                                        
In file included from /home/robot/catkin_ws/src/dynamixel_ros_control/include/dynamixel_ros_control/dynamixel_hw_interface.h:9:0,                                                   
                 from /home/robot/catkin_ws/src/dynamixel_ros_control/src/dynamixel_ros_control_node.cpp:3:                                                                         
/home/robot/catkin_ws/src/dynamixel_ros_control/include/dynamixel_ros_control/dynamixel_motor.h:11:48: fatal error: dynamixel_ros_control/HomingAction.h: No such file or directory 
compilation terminated.                                                                                                                                                             
make[2]: *** [CMakeFiles/dynamixel_ros_control_node.dir/src/dynamixel_ros_control_node.cpp.o] Error 1                                                                               
make[1]: *** [CMakeFiles/dynamixel_ros_control_node.dir/all] Error 2                                                                                                                
make: *** [all] Error 2    

몇번 빌드를 반복하다보면 에러 없이 빌드 되는 경우도 있지만 마땅한 해결 방법은 아니다. 몇번 골치를 썩다가 wiki의 투토리얼을 다시금 살펴보니 해결책이 나와있었다. 하지만 패키지를 만들때 생성되는 CMakeList.txt 파일엔 이 내용이 반영되어 있지 않아 혼란이 있는 듯 하다.

Writing a Simple Publisher and Subscriber (C++) 페이지를 보면 중간쯤 다음과 같이 입력하라고 나온다.

노드를 빌드하기 전, 노드에 의존 항목을 추가하여 위와 같은 에러를 방지하려는듯 하다. 따라서 CMakeList.txt 파일에 다음과 같이 입력하면 된다.

add_executable(${PROJECT_NAME}_node
  src/dynamixel_ros_control_node.cpp
  src/dynamixel_hw_interface.cpp
  src/dynamixel_motor.cpp
)

add_dependencies(${PROJECT_NAME}_node ${PROJECT_NAME}_generate_messages_cpp)
target_link_libraries(${PROJECT_NAME}_node
  ${catkin_LIBRARIES}
)

이제 다시 catkin 빌드를 할 때, 관련 에러는 발생하지 않는다.

[여름휴가] 괌

7월 3일 ~ 7월 7일에 괌으로 좀 이른 여름 휴가를 다녀왔습니다. 형 가족까지 포함하여, 총 7명 (어른4, 아이3)이 멤버였고, 이로 인해 호텔도 방 두 개를, 렌트카도 7인승 차를 빌려야 했네요.

아이들 컨디션을 적극적으로 고려하여, 일반적으로 많이 이용하시는 야간 비행보단 주간 비행 (진에어)을 이용하였습니다. 비행기 가격은 큰 차이가 없었고, 오히려 Late Check-in, Late Check-out을 이용하지 않는 아주 깔끔한 시간대였다고 생각합니다.

아침에 출발하는 비행기

7월이면 괌은 우기로 접어드는 때로, 시시때때로 소나기가 오는 기후라고 합니다만, 이번에 저희가 방문했을 때는 물놀이 할 땐 적당히 구름이 있는 날씨, 드라이브 할 땐 아주 파란 하늘을 보여줘서, 날씨 운도 좀 괜찮았습니다. 물론 덥고 습한 날씨였던건 뭐 어쩔수 없었고요.

호텔 베란다에서 보는 풍경
파란 하늘, 푸른 바다

여행 일정은 저희가 처음 괌에 가는 이유로, 많은 분들이 체험하는 코스로, 호텔 (온워드 리조트)도 그냥 무난한 곳으로 정했습니다. 실패는 하지 않는, 오히려 아이들은 충분한 물놀이로 재밌게 즐겼던 것 같습니다.

리조트 바로 옆 워터파크, 리조트 이용객은 공짜

숙소에 커다란 워터파크가 있고, 바로 앞은 맑고 푸른 바다가, 주변도 잠깐만 이동하면 식당이나 마트도 있어 편리했고, 오히려가 시내에서 살짝 거리가 있으니 사람들도 많지 않아 좋았습니다.

특히 셋째날엔 아들녀석을 위해 경비행기 조정 체험도 하였는데, 이륙부터 비행, 착륙까지 아들 녀석이 직접 조종간을 잡아 조종하였습니다. (물론 옆에서 도움주시는 조종사 분이 계시고요.) 처음엔 땀을 흘리면서 긴장하던 녀석도 시간이 지나니 엄청 재미있어하더라고요.

경비행기 타기 전
숙력된 조종사가 옆에서 보조해주면서 비행 조종 체험

총 5일의 일정 중, 하루는 렌트카를 끌고 괌 남쪽을 쭈욱 돌아봤습니다. 물론 인증샷을 위한 사진 포인트들도 이때 쭈욱 들르면 됩니다. 괌이 그리 크지 않은 섬이라서, 약 3~4시간이면 다 돌아볼만 합니다.

아마 무슨 성당?
바다 아래로 내려가는 수족관
드라이브하다가 적당한 곳에서 세운 후 본 풍경
길다가 찾은 식당
사랑의 절벽
리조트 앞 바다, 카누도 무료 대여

전반전으로 느낀 괌은 그냥 제주도 느낌이었습니다. 한국 관광객들도 많고, 한국인 업체들도 많고, 호텔 역시 한국어 서비스가 거의 기본입니다. 영어를 잘 하지 못하더라도 편하게 다녀올수 있는 휴양지라고 생각합니다. 아울렛 등에서 쇼핑도 즐길수 있고, 음식도 괜찮았습니다. 물가도 우려했던 바와는 달리 많이 비싸진 않았고요.

한국에 도착해도 이른 저녁

이번 여름 휴가 중 일단 하나 완료!

[vscode] 원격에 있는 머신의 코드를 수정하기

코드 편집기로 Visual Studio Code를 사용하고 있다. 주로 로봇의 PC에 설치하여 모니터와 키보드를 연결하고 작업을 하지만, 어느 정도 완성이 되고 나면 로봇을 동작시키면서 개발을 해야 하므로 모니터와 키보드는 더이상 연결할 수 없게 된다.

ssh를 이용하여 접속한 후 GUI를 미러링하여 사용할 수 있지만, 그렇게 되면 많이 느려지게 된다. 그래서 간단한 작업들은 터미널에서 vim을 이용하여 코드를 수정하곤 하는데, 이것저것 다수의 코드를 수정하려면 다소 힘들게 된다.

Visual Studio Code의 확장기능 중 Remote – SSH가 이럴 경우 대단히 유용한다. 로봇(또는 그냥 원격머신)의 PC에 ssh로 접속하여 그냥 로컬머신에서 vscode를 사용하는 것과 동일하게 사용할 수 있다.

설치는 Extentions 탭으로 이용하여 Remote – SSH를 찾아 설치하면 끝.

그렇게 되면 왼쪽 탭에 모니터와 같은 모양의 아이콘이 생성된다.

처음 실행하게 되면, 위와 같이 host를 설정하라는 메시지가 나온다. Configure를 클릭하면

와 같이 나오는데, 주로 본인 계정하에서 사용하므로 첫번째와 같이 본인의 홈 폴더에 생성하도로 한다. 그렇게 되면 기존 config 파일이 나오거나, 없으면 다음과 같이 템플릿을 생성하여 보여준다.

# Read more about SSH config files: https://linux.die.net/man/5/ssh_config
Host alias
    HostName hostname
    User user

자 이제 원격PC에 접속하기 위한 계정 정보를 입력한다.

# Read more about SSH config files: https://linux.die.net/man/5/ssh_config
Host robot1_pc
    HostName 192.168.9.10
    User robot

위와 같이 계정 정보와 서버의 주소를 입력한다. 만약 hosts 파일에 컴퓨터명을 등록했으면 주소 대신 컴퓨터명을 적으면 된다. 위의 내용을 터미널 상에서 ssh를 접속하게 된다면 다음과 같은 내용이라고 보면 된다.

$ ssh robot@192.168.9.10

저장하고 나면, 왼쪽 Connections 창에 이름이 나타난다. 이제 이름 옆 창 표시를 클릭하면, 새로운 vscode 창이 생기면서 원격 머신에 접속하게 된다.

접속이 완료되면, 왼쪽 하단에 원격 PC이름이 나타나고, 터미널도 역시 원격 PC의 터미널이 보임을 알 수 있다. 또한, Open Folder를 클릭하면 원격 PC의 디렉토리 및 파일들이 나타난다. 이제부턴 로컬 머신과 같이 사용가능하다. (물론 파일 복사나 이동 등도 가능)

팁.

매번 접속시 비밀번호를 묻는게 귀찮다면, 원격PC의 known_hosts에 로컬PC의 ssh 퍼블릭 키를 등록하면 된다. 키 생성은 ssh-keygen으로 하고, 생성된 id_rsa.pub 파일의 내용을 원격 PC의 known_hosts 파일에 추가한다.

Refresh hosts on macOS

많은 이유로 /etc/hosts 파일에 아이피 및 호스트 이름을 추가하여 사용할 경우가 많은데, Ubuntu에선 hosts 파일을 수정하기만해도 반영이 되는 반면, macOS에선 반영이 되지 않는다. (아마 이번 Catalina에서부터 그런듯..)

구글링을 해본 결과 hosts 파일을 수정하고, 터미널을 열어 다음과 같이 실행 해줘야 업데이트 되는듯 하다.

$ sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder

끝.