Post

2_ros1_in_m1_mac

이전포스트: 1_ros1_in_m1_mac

이번 포스팅에서는 pre build된 conda-forge를 사용해서 native한 m1 macos 환경에서 다시 noetic설치를 시도해볼 것이다. conda-forge추천 robostack_pkg gazebo docs

rviz, gazebo같은 gpu context가 필요한 visualisation과 simulation도 가능!

conda에서 channel이란?

conda를 통해 패키지 관리 및 가상환경 관리를 할 때, channel을 틍해 어디서 패키지를 가져와 설치할지를 지정할 수 있다.
chnnel은 간단히 말하자면, 패키지들이 저장되어 있으면서 호스팅 되는 위치라고 생각하면 된다.
개인도 채널을 운영가능한 구조이므로 정말 많은 채널이 존재한다.

  • conda는 https://repo.anaconda.com/pkgs/ 를 default channel로 사용.

conda-forge란?

conda-forge는 여러 자발적인 기여자들이 모인 conda-forge라는 커뮤니티에서 운영 및 관리하는 conda용 채널이다.
chnnel중에서 가장 믿을만한 것같다.

default channel확인

1
conda config --show channels

ros1 noetic 설치

robostack라는 repo.는 pre-compiled ROS packages under Linux (intel, arm), Windows, MacOS (intel, arm)
의 배포를 위한 conda-forge를 이용하는 것이 목적인 저장소이다.
일종의 language-agnostic 패키지매니저이다. (pip,npm,gem같은 패키지관리자와 달리, 언어나 플랫폼에 독립적)

conda는 설치되지 않은 상황이라고 가정한다.

  1. miforge 설치 설치과정
    miniforge repo
    Miniforge는 Miniconda와 비슷하지만, 특히 Conda-Forge라는 커뮤니티 유지 패키지 채널을 기본 설정으로 사용한다.
    Window는 anaconda 환경을 사용하지만, M1 유저는 경량화된 miniforge 환경을 구축하는 것이 좋다.

miniforge repo에서 m1용 Miniforge3-MacOSX-arm64.sh을 다운받고, 아래의 명령을 입력하면
~/miniforge3에 miniforge가 설치된다.

1
2
3
chmod +x ~/Downloads/Miniforge3-MacOSX-arm64.sh
sh ~/Downloads/Miniforge3-MacOSX-arm64.sh
source ~/miniforge3/bin/activate
  1. robostack channel을 통해 conda-forge에서 ros noetic 설치
    robostack docs
    ~/miniforge3/envs/ros_env가 home이 된다.

추가로 ros1 tutorial을 참고하여 다음과 같이 설정하였다.
ROS1 tutorial

  • catkin workspaces
  • zsh기준이다. (ws의 src에서 catkin_make할 때마다 source devel/setup.zsh해야한다.)
  1. rospackage 빌드(실패) ubuntu의 apt 패키지관리자로 rospackage를 설치할 수 없기때문에,
    rosinstall_generator, wstool, ./src/catkin/bin/catkin_make_isolated –install 을 통해 rospackage를 빌드해야한다.
    Installation Instructions
  • rosinstall_generator: 해당 패키지와 그 의존성에 대한 정보를 포함한 .rosinstall 파일을 생성한다.
  • wstool: 워크스페이스 관리도구이다. .rosinstall 파일을 읽고 해당 파일에 명시된 패키지들을 다운로드하고 설정한다.
  • vcs(vcstool): 버전 관리 시스템(Git, Mercurial, Subversion 등)의 관리 도구이다. .repos 파일 형식을 사용하여 여러 저장소를 관리한다.
  • wstool init: 초기화 및 소스 코드 다운로드.
  • wstool merge: 새로운 패키지 리스트를 기존 워크스페이스에 병합.
  • wstool update: 워크스페이스 내의 모든 패키지를 업데이트.
1
2
3
4
5
6
7
cd ~/ros_catkin_ws
rosinstall_generator gazebo_ros_pkgs gazebo_ros_control --rosdistro noetic --deps --tar > noetic-gazebo.rosinstall
// 다음과 같이 vcstool를 설치한다.
// brew install vcs하면 안된다. 그건 vcstool이 아니라 다른 패키지이다..
pip install vcstool
// vcstool로 .rosinstall 파일에 명시된 
vcs import src < noetic-gazebo.rosinstall
  1. gazebo11 최신버전
    1
    
    brew install gazebo11 --HEAD
    

    위 명령을 수행했는데 gazebo11가 최신버전이 아니라는 에러가 뜨면, 다음의 명령을 수행하자.

1
2
brew unlink gazebo11
brew install gazebo11 --HEAD

4-1. gazebo 재설치 gazebo docs를 따라 다음과 같이 gazebo를 설치했다.

1
2
3
4
5
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
// brew에 osrf/simulation저장소 추가
brew tap osrf/simulation
// Mac Ventura에 적합한 gz version(ignition-citadel) 설치
brew install ignition-citadel

ignition-citadel에 종속된 ogre2.1패키지 설치에서 진행이 안된다. 관련이슈

1
brew install ogre2.1 
  1. mamba install ros-noetic-gazebo-ros 다음의 명령으로 gazebo_ros라는 package를 mamba의 robostack채널에서 찾아보았지만, 없었다.
    1
    
    mamba search gazebo_ros -c robostack
    

    ex. gazebo-ros 설치(robostack issue)를 참고하여, 다음의 명령으로 ros-noetic-gazebo-ros를 설치하면 된다는 것을 알았다.

    1
    
    mamba install ros-noetic-gazebo-ros
    
  2. mamba install -c robostack-staging default채널이 robostack-staging이지만, 명시적으로 하려면 다음과 같이 옵션을 준다.
    1
    
    mamba install -c robostack-staging {패키지명}
    
  3. gazebo.launch 관련 패키지 controller spawner, urdf spawner, robot_state_publisher, xacro 등에 관련된 패키지이다.
    1
    2
    3
    4
    5
    
    mamba install ros-noetic-ros-control ros-noetic-joint-state-controller ros-noetic-effort-controllers \
    ros-noetic-position-controllers ros-noetic-velocity-controllers ros-noetic-ros-controllers \
    ros-noetic-gazebo-ros ros-noetic-gazebo-ros-control ros-noetic-gazebo-ros-pkgs ros-noetic-controller-manager \
    ros-noetic-joint-state-publisher ros-noetic-robot-state-publisher ros-noetic-xacro ros-noetic-position-controllers \
    compilers cmake pkg-config make ninja colcon-common-extensions catkin_tools ros-noetic-simulators
    

    추가로 다음과 같은 명령으로 dependancy를 자동설치할 수도 있다.

    1
    
    rosdep install --from-paths src --ignore-src -r -y
    
  4. if < eigen3.4 error 아래와 같은 convert 오류가 뜬다. g++이 c++11 라이브러리 문제인 줄 알았다.
    하지만 eigen 라이브러리 버전이 3.4보다 낮으면 생기는 이슈라는 것을 선배님께 들었다.
1
/home/gene/catkin_ws/src/aidin_arm/src/arm_function.h:144:51: error: could not convert ~ from ‘<brace-enclosed initializer list> to Eigen::Matrix<double, 4, 4>
1
pkg-config --modversion eigen3

eigen3.4를 다운받고 eigen3으로 이름바꾸고 /usr/include에 위치시켰다.

  1. model not be loaded on gz libprotobuf 버전을 4.24.4으로 맞춰서 해결했다.
1
2
[INFO] [1718797795.879569, 0.000000]: Waiting for /clock to be available...
[INFO] [1718797795.881280, 0.000000]: Controller Spawner: Waiting for service controller_manager/load_controller

rostopic list로 확인된 topic중에 /tf에 대해 rostopic echo /tf해보니 다음과 같은 메시지를 얻었다. /clock이 문제인 것같다.

1
Is /clock being published?

use_sim_time이라는 rosparam에 대한 설명은 다음과 같다.

Tells ROS nodes asking for time to get the Gazebo-published simulation time, published over the ROS topic /clock (default true)

1
2
rosparam get use_sim_time
rosparam set use_sim_time true

node의 실행이 종료되었지만 ROS master를 중심으로 하는 분산형 노드 구조에 남아있는 노드의 정보를 제거한다.

1
rosnode cleanup

아래의 이슈를 보니 libprotobuf의 버전이 문제라고 한다.
gz에 model없는 이슈 - libprotobuf 24.4.0설치

현재 libprotobuf version은 4.25.3인 것을 확인할 수 있다.

1
mamba list | grep libprotobuf

수동으로 4.24.4로 맞춰준다.

1
mamba install libprotobuf==4.24.4
  1. controller_manager - Controller Spawner ROS interface 문제 [WARN] [1719161164.840953, 27.615000]: Controller Spawner couldn’t find the expected controller_manager ROS interface. 다음의 package를 설치하면 해결된다. 패키지를 빼먹으면 문제가 되는 종속성이 에러코드에 명시적으로 안나오는 경우인 것으로 보인다.
    구글링해도 쉽게 안나오고 mamba에서는 rosdep이 안먹히니 명심하자.
    1
    
    ros-noetic-gazebo-ros-control ros-noetic-velocity-controllers
    
  2. 동적라이브러리 로드 실패
    참고: gazebo plugin작성요령
1
vi ~/.gazebo/server-11345/default.log

gzserver의 log를 보니 다음과 같이 Failed to load plugin메시지를 확인할 수 있었다.

1
2
3
(1719384344 594773055) [Err] [Plugin.hh:212] Failed to load plugin libaidin8_plugin.dylib: dlopen(libaidin8_plugin.dylib, 0x0009): tried: 'libaidin8_plugin.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OSlibaidin8_plugin.dylib' (no such file), '/Users/sdg/miniforge3/envs/ros_env/lib/libaidin8_plugin.dylib' (no such file), '/Users/sdg/miniforge3/envs/ros_env/bin/../lib/libaidin8_plugin.dylib' (no such file), '/usr/lib/libaidin8_plugin.dylib' (no such file, not in dyld cache), 'libaidin8_plugin.dylib' (no such file), '/usr/local/lib/libaidin8_plugin.dylib' (no such file), '/usr/lib/libaidin8_plugin.dylib' (no such file, not in dyld cache)
Failed to load plugin libaidin8_plugin.dylib: dlopen(libaidin8_plugin.dylib, 0x0009): tried: 'libaidin8_plugin.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OSlibaidin8_plugin.dylib' (no such file), '/Users/sdg/miniforge3/envs/ros_env/lib/libaidin8_plugin.dylib' (no such file), '/Users/sdg/miniforge3/envs/ros_env/bin/../lib/libaidin8_plugin.dylib' (no such file), '/usr/lib/libaidin8_plugin.dylib' (no such file, not in dyld cache), 'libaidin8_plugin.dylib' (no such file), '/usr/local/lib/libaidin8_plugin.dylib' (no such file), '/usr/lib/libaidin8_plugin.dylib' (no such file, not in dyld cache)
(1719384370 837549730) [Wrn] [Publisher.cc:135] Queue limit reached for topic /gazebo/default/pose/local/info, deleting message. This warning is printed only once.

임시방편으로 gzserver가 읽을 수 있는 경로인 /Users/sdg/miniforge3/envs/ros_env/lib에 libaidin8_plugin.dylib를 복사해보니 해당 라이브러리관련된 토픽은 발행된다.
즉 gzserver가 읽을 수 있는 경로에 /Users/sdg/Documents/project/ros1_noetic/catkin_ws/devel/lib를 추가하면 된다!

다음을 simulation pc의 .bashrc/.zshrc 에 추가해준다.

1
2
echo ${GAZEBO_PLUGIN_PATH}
/Users/sdg/miniforge3/envs/ros_env/lib/gazebo-11/plugins::/Users/sdg/Documents/project/ros1_noetic/catkin_ws/devel/lib
  1. test ``` roslaunch aidin_arm gazebo.launch

rosrun aidin_arm arm_command ```

주의

  1. Do not install ROS packages in the base environment base에는 conda and mamba만 설치되고, non base에는 ros만 설치되어야한다.
    반대의 경우 (ex. non base에 conda and mamba, base에 ros설치)가 발생하면 안된다.

  2. Do not source the system ROS environment non-conda environments에 ROS를 설치하면 안된다. PYTHONPATH 변수가 충돌하기 때문이다.

This post is licensed under CC BY 4.0 by the author.