Search
🌏

deer.2. title: ROS melodic 에서 python2 와 python3 을 동시에 사용하면서 발생하는 이슈들과 대응법

🚀 prev note
♻️ prev note
🚀 next note
♻️ next note
17 more properties
ROS melodic 에서 python 2와 3을 동시에 사용하면서 발생하는 이슈들이 있다. 이에 잘 대응하려면, 다음과 같이 행동하는 것이 좋다.
1.
(step.1) 우선 ROS 를 설치하기 전에 python3-<package> 는 최소한으로 설치한다.
2.
(step.2) 그 다음 ros melodic 을 설치한다. 이때 --fix-missing 옵션을 통해 (참고1, 2) 나머지를 설치해주도록 한다.
3.
(step.3) 만약 특정 설치 스크립트가 반드시 python(2)-dev 를 요구하는 상황에서는 ros 를 전부 지워낸다. 설치하고자 하는 ros 패키지의 요구사항에 맞춰 python2 를 위한 melodic 을 설치해서 그렇게 깔고난 뒤, 또 새로 설치하려는 ros 패키지가 python3-dev 를 요구하는 상황에서는 전부 ros 를 제거하고 또 다시 설치하는 방법이 현재 상황에서 가장 깔끔하다.
4.
(step.4) 위 방법들에도 CMake 가 python3 을 잡지 못한다면 ROS 의 환경변수 export ROS_PYTHON_VERSION=3 (/opt/ros/melodic 로부터 실행되는) 을 지정해 주도록 하자. /opt/ros/melodic 로부터 실행되었기 때문에 다시 source 를 하면 리셋된다.
ros melodic 에서 python3 와 안 맞기로 악명높은!
geometry2 패키지를 설치하는 과정을 통해 이 원칙(?) 을 적용해 보자.
문제상황은 다음과 같다.
아래와 같은 명령에도 geometry2 라는 패키지가 python3 패키지로 설치되지 않는다. (분명히 DPYTHON_EXECUTABLE, DPYTHON_INCLUDE_DIR, DPYTHON_LIBRARY 따위의 additional Cmake args 를 통해 python3 을 잡아 주려고 아무리 노력해도...)
만약 작은 프로젝트였다면, 당장 python3 만 지원하는 ROS 상위 버전으로 넘어갔을 것이다. 하지만 이런 문제들이 상당히 자주 일어나고, 당장 ros melodic 을 버리고 상위 버전으로 올라가기는 새로운 리스크들이 너무 많아서 (패키지, 안정성 등...) 유보할 수밖에 없다.
설치 시작
mkdir -p ~/dev/geometry2_build_ws/src cd ~/dev/geometry2_build_ws wstool init wstool set -y src/geometry2 --git https://github.com/ros/geometry2 -v 0.6.5 wstool up rosdep install --from-paths src --ignore-src -y -r catkin clean catkin config --init # (참고3) catkin config -DPYTHON_EXECUTABLE=/usr/bin/python3 \ -DPYTHON_INCLUDE_DIR=/usr/include/python3.6m \ -DPYTHON_LIBRARY=/usr/lib/aarch64-linux-gnu/libpython3.6m.so catkin config --install catkin_make source devel/setup.bash echo "source ~/dev/geometry2_build_ws/devel/setup.bash --extend" >> ~/.bashrc
Bash
복사
additional cmake arguments 를 통해 python3 을 잡아 주려고 아무리 노력해도 python3 에서 잡히도록 패키지들이 설치되지 않았고, 대부분의 온라인 문서들에서 솔루션들이 위와 같은 상황의 해결책으로 python3-dev 문제를 풀어내라고 지적했지만 (참고4), 비단 python3-dev 뿐 아니라 python3-catkin-pkg 과도 관련이 있겠다 (참고5) 는 사실을 짐작할 수 있었다.
sudo apt install python3-catkin-pkg 를 설치하려고 하는 순간, 패키지 관리자는 ros melodic 를 전부 다 제거하려고 하고 있었다. 이를 통해 python2 와 python3 가 동시에 호환되는 ros 설치를 암묵적으로 권장하지 않는다는 사실을 알 수 있다.
문서들 (참고 6, 7) 을 통해 지금까지 내린 결론은, 어쨌든 ros melodic 은 python3 을 별로 좋아하지 않는다는 사실이다. 내부적으로 python2 스크립트들 위주로 만들어졌고, python 스크립트를 이용해서 설치하는 패키지들도 python2 를 이용한다는 것을 전제로 하기 때문일 가능성이 높다. python3-<sth> 를 설치할 때 ros melodic 전체가 삭제되려고 하는 이유가 그것이 아닐까.
문서 (참고6) 에 따르면, ROS 에는 환경변수 ROS_PYTHON_VERSION 가 있다. CMake 가 python3 을 잡지 못한다면 ROS 의 환경변수 export ROS_PYTHON_VERSION=3 (/opt/ros/melodic 로부터 실행되는) 을 지정해 주도록 하자. /opt/ros/melodic 로부터 실행되었기 때문에 다시 source 를 하면 리셋된다.
export | grep ROS export ROS_PYTHON_VERSION=3 sudo pip3 install empy catkin clean catkin config --init catkin config -DPYTHON_EXECUTABLE=/usr/bin/python3 \ -DPYTHON_INCLUDE_DIR=/usr/include/python3.6m \ -DPYTHON_LIBRARY=/usr/lib/aarch64-linux-gnu/libpython3.6m.so catkin_make
Bash
복사
아래 잘 보면, found pythoninterp : /usr/bin/python3 이 있다.
설치 화면. python 인터프리터가 버전 3이 잡혔다.
python3 에서 동작을 확인하자.
터미널 설명
좌 : python3, source ~/dev/realsense2_ros_build_ws/devel/setup.bash --extend
우 : python3, no source (좌측 터미널처럼 소싱하지 않음)
좌측 python3 환경에서 동작시키는 경우 거의 다 된 것은 맞는데, PyKDL 이라는 라이브러리가 python2 바인딩이기 때문에 동작하지 않는다는 사실을 알 수 있다 (참고 8).
python2 확인
python2 에서 동작을 확인하자.
터미널 설명
좌 : python2, source ~/dev/realsense2_ros_build_ws/devel/setup.bash --extend
우 : python2, no source
source (소싱) 된 이후에는 python2 에서는 tf2_py 가 작동하지 않고, python3 만 작동하게 된다는 사실을 알 수 있다.
나는 뭐 python3 에서만 잘 돌리면 된다. 잠깐 python2 의 문제를 덮어두자. 이 PyKDL 이라는 녀석이 문제다. PyKDL 은 어쩌다가 설치된 녀석인가
확인을 해 보았는데, 이게 원본 파일이다. 그렇다면 아마 ros 를 설치할 때 같이 깔렸을 가능성이 높다. 왜냐하면 이것이 원본이 아니라 geometry2_build_ws 의 build 디렉터리 등에 들어 있는 파일이 원본이라면 여기 안에 있는 녀석이 걸려나왔을 가능성이 높기 때문이다.
이 오류는 python2 바인딩에 의한 문제(참고8) 이기 때문에 이를 해결하려면
PyKDL 이라는 것이 python3 의 라이브러리로부터 링크되도록 소프트링크를 걸어줄 수 있다.
PyKDL 이라는 기존 python2 라이브러리를 지워 버리고 새로운 PyKDL python3 래퍼를 만든다.
PyKDL 을 pip 패키지 관리자를 통해 python3 venv 에 설치고 이를 우선적으로 잡도록 한다.
이 방법을 가장 먼저 시도한다. 이유는 기존 파일은 최대한 안 건드리는게 좋기 때문이다!
하지만 venv 에서의 pip install PyKDL 이 정상적으로 작동하지 않았다.
어쩔 수 없이 공식 repo (참고9) 에서 답을 찾아야 하는 상황이었다.
아래는 공식 repo (참고9) 의 내용을 가져온 것이다.
#(Optional) Update apt cache: sudo apt-get update #Install EIGEN and cppunit: sudo apt-get install libeigen3-dev libcppunit-dev #Depending on your python version install the future and psutil module #Python 2: #sudo apt-get install python-psutil python-future #Python 3: sudo apt-get install python3-psutil python3-future #Install Sphinx to generate API-documentation #Python 2: #sudo apt-get install python-sphinx #Python 3: sudo apt-get install python3-sphinx #With catkin #Clone the repository inside the workspace mkdir -p ~/dev/kdl_py3_build_ws/src cd ~/dev/kdl_py3_build_ws/src #참고 : . 은 프로젝트 디렉터리 포함 안 하겠다는 옵션 git clone https://github.com/orocos/orocos_kinematics_dynamics.git . #Initialize the PyBind11 submodule git submodule update --init cd .. #install catkin clean catkin config --init #내가보니까 이거 ros melodic 에서 잘 안된다 싶으면 이거 다 해줘야할듯... 기본이 python2 라. export ROS_PYTHON_VERSION=3 catkin config -DPYTHON_EXECUTABLE=/usr/bin/python3 \ -DPYTHON_INCLUDE_DIR=/usr/include/python3.6m \ -DPYTHON_LIBRARY=/usr/lib/aarch64-linux-gnu/libpython3.6m.so catkin build python_orocos_kdl source devel/setup.bash echo "source ~/dev/kdl_py3_build_ws/devel/setup.bash --extend" >> ~/.bashrc
Bash
복사
아래 라이브러리들의 import 가 정상적으로 돼야 성공이다.
python3 >>>import tf >>>import tf_conversions >>>import tf2_ros
Bash
복사
전역 환경에서 테스트해 보자
가상 환경에서도 테스트해 보자
잘 동작한다.
추후 또 문제가 생긴다면 문서 (참고10) 를 참고하면 좋을 것 같다. 해당 문서에는 ROS_PYTHON_VERSION 을 변경하고 나서, ROS 과 관련된 환경변수들을 직접 손질하는 과정과 이에 관련된 간략한 설명들을 붙여 두었다 (참고11). 이것을 기록해 둔다면 나중에 더 강한 환경분석이 필요할 때 참고할 수 있으리라 생각한다.
참고