起動時にros2 launchを実行させます。
環境はUbuntu 22.04 Server for ARMとUbuntu 22.04 Desktopです。
とりあえず動けばいいでやってみる
出来るだけ錯綜している情報は掴まないようには気をつけています。
$ cd /etc/systemd/system
$ sudo vi sample.service
$ sudo chmod 644 sample.service
下記が作成したOSの起動時に起動させるservice。
sample.service
[Unit]
Description=launch sample daemon
[Service]
Type=simple
User=jn
EnvironmentFile=/home/jn/.bashrc.upstart
ExecStart=/bin/bash -c ". /home/jn/.bashrc.upstart; ros2 launch sample sample.launch.py use_sim_time:=${USE_SIM_TIME}"
KillMode=process
Restart=always
RestartSec=42s
[Install]
WantedBy=multi-user.target
上記のservice用に切り出した.bashrcを.bashrc.upstartとします。
~/.bashrc.upstart
. /opt/ros/humble/setup.bash
. /home/jn/ros/sample_ws/install/setup.bash
USE_SIM_TIME=false
export USE_SIM_TIME
説明していきます。
EnvironmentFile=/home/jn/.bashrc.upstart
環境変数を設定する。上記の例のUSE_SIM_TIME
が使えるようになる。
setup.bash
を読み込んでいるがros2
が見つからないと怒られる。
ExecStart=/bin/bash -c ". /home/jn/.bashrc.upstart; ros2 launch sample sample.launch.py use_sim_time:=${USE_SIM_TIME}"
setup.bash
を使いたいのでbash -c
を使って.bash.upstart
を読み込んでいる
これでros2
などを使えるようになる。環境変数は使えるようにならない。
WantedBy=multi-user.target
これがないとsystemctl start
では怒られないがsystemctl enable
で怒られる。
[Install]
に対する記述が無いのはおかしいということらしい。
登録。
$ cd /etc/systemd/system
$ sudo systemctl enable sample.service
serviceを書き換えたら。
$ systemctl daemon-reload
期待通りの動作をしているか確認。
$ journalctl
まとめ
本当はこんなに汚いはずは無いので機会があれば綺麗にします。