Open15

YDLiDAR X4 を動かす

nonanonnononanonno

CP2102 のドライバーは Linux カーネルに最初から入っている。

nonanonnononanonno

Ubuntu では ROS1 Melodic での動作確認になっている。環境汚したくないのでコンテナ上で動かすことにする。↓が結果。

注意点(忘れていたのもあるが)

  • docker 起動時に privileged オプション、あるいは device オプションで /dev/ttyUSB0 をマウントする
  • docker 起動時に group_add オプションで dialout を追加する。(root実行であれば不要)
  • ホスト環境で 自身を dialout グループに追加する(要再起動。もしかしたら不要かも)
nonanonnononanonno

各種ファイル

devcontainer.json
{
    "name": "melodic desktop",
    "dockerComposeFile": "../docker-compose.yml",
    "service": "container",
    "workspaceFolder": "/workspaces/YDLiDAR-trial",
    "shutdownAction": "stopCompose",
    "remoteUser": "vscode",
    "features": {
        "ghcr.io/devcontainers/features/common-utils:2": {}
    },
    "customizations": {
        "vscode": {
            "extensions": []
        }
    }
}
docker-compose.yml
services:
  container:
    image: osrf/ros:melodic-desktop-full
    group_add:
      - dialout
    command: /bin/sh -c "while sleep 1000; do :; done"
    environment:
      - DISPLAY
      - NVIDIA_DRIVER_CAPABILITIES=all
      - XDG_RUNTIME_DIR=/tmp/runtime-xdg_runtime_dir
      - PULSE_SERVER=unix:/tmp/pulse/native
    volumes:
      - /tmp/.X11-unix:/tmp/.X11-unix:rw
      - /usr/share/vulkan/icd.d:/usr/share/vulkan/icd.d:ro
      - /usr/share/vulkan/implicit_layer.d:/usr/share/vulkan/implicit_layer.d:ro
      - ${XDG_RUNTIME_DIR}/pulse/native:/tmp/pulse/native
      - ${HOME}/.config/pulse/cookie:/tmp/pulse/cookie:ro
      - .:/workspaces/YDLiDAR-trial:cached
    devices:
      - /dev/ttyUSB0:/dev/ttyUSB0
    tmpfs:
      - /tmp/runtime-xdg_runtime_dir
    cap_add:
      - SYS_PTRACE
    security_opt:
      - seccomp:unconfined
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [ gpu ]

実行コマンド

source /opt/ros/melodic/setup.sh
cd ydlidar_ws/
source devel/setup.sh
roslaunch ydlidar_ros_driver lidar_view.launch

なお、X4.launch で port 設定を /dev/ttyUSB0 に、 lidar_view.launch で include を X4.launch に変更しておく必要あり。

nonanonnononanonno

コード見た感じ ROS 2 化できそうな気がするので気が向いたら試してみる。YDLidar-SDK が Python3 対応しているか怪しいが、特に使うつもりはないのでC++が動けば良い。

nonanonnononanonno
sudo apt install -y ./ros-humble-desktop-0.3.1_arm64.deb

で↓のようなエラー?ガ出た。

Setting up ros-humble-desktop (0.3.1) ...
N: Download is performed unsandboxed as root as file '/home/nonno/Downloads/ros-humble-desktop-0.3.1_arm64.deb' couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied)

そのまま継続してみるが、 pip install ができず、ros2 launch も↓のようにエラーになる。

$ ros2 launch demo_nodes_cpp talker_listener.launch.py
[INFO] [launch]: All log files can be found below /home/nonno/.ros/log/2024-08-19-11-52-59-546349-raspberrypi-18518
[INFO] [launch]: Default logging verbosity is set to INFO
[ERROR] [launch]: Caught exception in launch (see debug for traceback): Caught exception when trying to load file of format [py]: No module named 'rclpy._rclpy_pybind11'
The C extension '/opt/ros/humble/lib/python3.9/site-packages/_rclpy_pybind11.cpython-311-aarch64-linux-gnu.so' isn't present on the system. Please refer to 'https://docs.ros.org/en/humble/Guides/Installation-Troubleshooting.html#import-failing-without-library-present-on-the-system' for possible solutions
nonanonnononanonno

ベースのdebian バージョンが bookworm で、 Python 3.11 になっているのが問題な気がする。ROS 2パッケージの方では Python 3.9 を期待しているっぽい。bullseye に変更する。

nonanonnononanonno

実行したコマンド

sudo apt update && sudo apt upgrade -y
wget https://s3.ap-northeast-1.wasabisys.com/download-raw/dpkg/ros2-desktop/debian/bullseye/ros-humble-desktop-0.3.1_arm64.deb
sudo apt install -y ./ros-humble-desktop-0.3.1_arm64.deb
sudo pip install vcstool colcon-common-extensions

nonanonnononanonno

とりあえず ROS 2 動いた。

nonno@raspberrypi:~ $ source /opt/ros/humble/setup.bash
nonno@raspberrypi:~ $ ros2 launch demo_nodes_cpp talker_listener.launch.py
[INFO] [launch]: All log files can be found below /home/nonno/.ros/log/2024-08-19-21-12-09-356392-raspberrypi-9871
[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [talker-1]: process started with pid [9872]
[INFO] [listener-2]: process started with pid [9874]
[talker-1] [INFO] [1724069533.163781478] [talker]: Publishing: 'Hello World: 1'
[listener-2] [INFO] [1724069533.165450376] [listener]: I heard: [Hello World: 1]
[talker-1] [INFO] [1724069534.163806920] [talker]: Publishing: 'Hello World: 2'
[listener-2] [INFO] [1724069534.164830092] [listener]: I heard: [Hello World: 2]
[talker-1] [INFO] [1724069535.163869970] [talker]: Publishing: 'Hello World: 3'
[listener-2] [INFO] [1724069535.164880746] [listener]: I heard: [Hello World: 3]
^C[WARNING] [launch]: user interrupted with ctrl-c (SIGINT)
[listener-2] [INFO] [1724069535.331488607] [rclcpp]: signal_handler(signum=2)
[talker-1] [INFO] [1724069535.331474232] [rclcpp]: signal_handler(signum=2)
[INFO] [listener-2]: process has finished cleanly [pid 9874]
[INFO] [talker-1]: process has finished cleanly [pid 9872]
nonanonnononanonno

LiDAR を繋いだところ、とりあえず /dev/ttyUSB0 として認識。 minicom -D /dev/ttyUSB0 で接続すると回った。 Raspberry Pi OS では 最初から dialout に属していたので group 設定は不要。LiDARは、別電源を供給しておかないと挙動が怪しかった。

nonanonnononanonno

LiDAR SDK をインストール

git clone https://github.com/YDLIDAR/YDLidar-SDK.git
cd YDLidar-SDK
mkdir build
cd build
cmake ..
make
sudo make install

ydlidar ros2 をセットアップ。 master ブランチではビルドできなかったので、humble ブランチを使用する。

mkdir -p ydlidar_ws/src
cd ydlidar_ws/src
git clone https://github.com/YDLIDAR/ydlidar_ros2_driver.git -b humble
cd ..
colcon build --symlink-install

メモリが1GBでぎりぎり。ラズパイでデスクトップを起動していると丁度足りないぐらいなので、デスクトップ起動せずにビルドした。

以下のコマンドで実行する。

source ./install/setup.bash
ros2 launch ydlidar_ros2_driver ydlidar_launch.py params_file:=src/ydlidar_ros2_driver/params/X4.yaml

# rviz も起動する場合
ros2 launch ydlidar_ros2_driver ydlidar_launch_view.py params_file:=src/ydlidar_ros2_driver/params/X4.yaml

nonanonnononanonno

PC間通信でラズパイでスキャンしたものをそのままデスクトップPCに送ることもできる。以下の点に注意すれば良い。

  • ROS_DOMAIN_ID を設定する
  • ファイヤーウォールを無効にする。

FastDDSだからかNICの構成上なのかわからないが、CycloneDDSにあったNICを指定する、といった操作は不要そう。