ROS2: bag record を launch から起動して保存先ディレクトリを指定したい

とりあえずメモ.

参考にしたサイトに再たどり着きができなかった.似たようなことを書いてるところをメモ.

ROS2 launch file: how to convert LaunchArgument to string
I want to convert either a LaunchConfiguration or a LaunchArgument to a string so I can use it in a filepath later. How ...

現在,デフォルトでホームディレクトリ以下しか指定できない.
os.environ["HOME"], を削除すればOKだが,個人的にはホームディレクトリ以下しか利用しないのでこのまま.

import launch
from launch import LaunchDescription
from launch_ros.actions import Node
from launch.actions import DeclareLaunchArgument, OpaqueFunction
from ament_index_python.packages import get_package_share_directory
from launch_xml.launch_description_sources import XMLLaunchDescriptionSource
import datetime
import os
import pathlib

launch_args = [
    DeclareLaunchArgument(
        "save_dir",
        default_value="log/{}".format(datetime.datetime.now().strftime("%Y%m%d")),
        description="save directory for bag files",
    )
]


def launch_setup(context):
    # bag用のパラメータとして save_dir を指定できるようにする
    save_dir = launch.substitutions.LaunchConfiguration("save_dir")
    save_dir_path = pathlib.Path(os.environ["HOME"], save_dir.perform(context))
    os.makedirs(save_dir_path, exist_ok=True)

    # bag record を実行する
    bag_node = launch.actions.ExecuteProcess(
        shell=True,
        cmd=[
            "cd",
            "{}".format(save_dir_path),
            "&&",
            "ros2",
            "bag",
            "record",
            "-a",
        ],
        output="screen",
    )


def generate_launch_description():
    opfunc = OpaqueFunction(function=launch_setup)
    ld = LaunchDescription(launch_args)
    ld.add_action(opfunc)

    return ld

if __name__ == "__main__":
    generate_launch_description()

コメント

タイトルとURLをコピーしました