YDLiDAR X4 を動かす

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

Ubuntu では ROS1 Melodic での動作確認になっている。環境汚したくないのでコンテナ上で動かすことにする。↓が結果。
注意点(忘れていたのもあるが)
- docker 起動時に privileged オプション、あるいは device オプションで
/dev/ttyUSB0
をマウントする - docker 起動時に group_add オプションで dialout を追加する。(root実行であれば不要)
- ホスト環境で 自身を dialout グループに追加する(要再起動。もしかしたら不要かも)

各種ファイル
{
"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": []
}
}
}
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 に変更しておく必要あり。

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

ROS 2
普通にあった。

手元に Ubuntu のノートパソコンがないので、ラズパイ 3B上に ROS 2 Humble を入れて動かしてみる。セットアップは↓を利用する。

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

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

実行したコマンド
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

とりあえず 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]

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

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

PC間通信でラズパイでスキャンしたものをそのままデスクトップPCに送ることもできる。以下の点に注意すれば良い。
- ROS_DOMAIN_ID を設定する
- ファイヤーウォールを無効にする。
FastDDSだからかNICの構成上なのかわからないが、CycloneDDSにあったNICを指定する、といった操作は不要そう。