ros 2パッケージ作成

cd ~/ros2_ws/src
ros2 pkg create uv_sample_pkg
cd uv_sample_pkg

プロジェクトの初期化

uv init . --lib --python-preference only-system

仮想環境作成(ローカルの環境にアクセス可能)

uv venv --system-site-packages

初期構造

uv_sample_pkg/
  ├── CMakeLists.txt
  ├── LICENSE
+ ├── README.md
  ├── include
  │   └── uv_sample_pkg
  ├── package.xml
+ ├── pyproject.toml
  └── src
+    └── uv_sample_pkg
+         ├── __init__.py
+         └── py.typed

src/uv_sample_pkg/init.pyにclassとメイン関数記述

scripts/publisher.pyを作成して以下のように記述(名前はなんでもいい)

#!/usr/bin/env python3
from uv_sample_pkg import main

if __name__ == "__main__":
    main()

権限の付与

chmod +x scripts/publisher.py

cmake設定

cmake_minimum_required(VERSION 3.8)
project(uv_sample_pkg)

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()

# 依存パッケージ
find_package(ament_cmake REQUIRED)
find_package(ament_cmake_python REQUIRED)
find_package(rclpy REQUIRED)

# Pythonパッケージのインストール
ament_python_install_package(${PROJECT_NAME} PACKAGE_DIR src/${PROJECT_NAME})

# スクリプトのインストール
install(PROGRAMS scripts/publisher.py DESTINATION lib/${PROJECT_NAME})

if(BUILD_TESTING)
  find_package(ament_lint_auto REQUIRED)
  set(ament_cmake_copyright_FOUND TRUE)
  set(ament_cmake_cpplint_FOUND TRUE)
  ament_lint_auto_find_test_dependencies()
endif()

ament_package()

Build

# ワークスペースのルートディレクトリで実行
cd ~/ros2_ws
colcon build --packages-select uv_sample_pkg --symlink-install
source ./install/setup.sh

実行

# パッケージディレクトリで仮想環境を有効化
cd ~/ros2_ws/src/uv_sample_pkg
source .venv/bin/activate

# ノードの実行
ros2 run uv_sample_pkg publisher.py

参考サイト