自動起動は
・init.d
・systemd
などあるが、昨今はsysemdでの導入が暗黙の標準、または推奨。
●ステップ
・起動するノード用のスクリプトを作成する
・systemdの.serviceファイルを作成する
・systemdに登録
●起動するノード用のスクリプトを作成する
今回の例だと以下のようになる。
以下を~/start_voldisp.shとかの名前で作っておく。
#!/bin/bash
# ROS 2の環境設定
source /opt/ros/humble/setup.bash
source /home/pi/11_colcon_ws/install/setup.bash
export FASTRTPS_DEFAULT_PROFILES_FILE=/home/pi/.fastdds/DEFAULT_FASTRTPS_PROFILES.xml
# vol_dispノードを起動
ros2 run vol_disp voldisp
ただ、これだとコケたときに何もわからないのでログを残そう。
#!/bin/bash
# pulseaudioが起動しているか確認
if ! pulseaudio --check; then
echo "PulseAudio is not running, starting it..."
pulseaudio --start
fi
# jackが起動しているか確認
if ! jack_control status; then
echo "Jack server is not running, starting it..."
jack_control start
fi
# 使用可能な音声デバイスを確認
echo "Checking available audio devices..."
arecord -l
aplay -l
# ROS 2の環境設定
echo "Starting ROS 2 environment setup..." > /home/pi/start_vol_disp.log
source /opt/ros/humble/setup.bash >> /home/pi/start_vol_disp.log 2>&1
if [ $? -ne 0 ]; then
echo "Failed to source /opt/ros/humble/setup.bash" >> /home/pi/start_vol_disp.log
exit 1
fi
source /home/pi/11_colcon_ws/install/setup.bash >> /home/pi/start_vol_disp.log 2>&1
if [ $? -ne 0 ]; then
echo "Failed to source /home/pi/11_colcon_ws/install/setup.bash" >> /home/pi/start_vol_disp.log
exit 1
fi
export FASTRTPS_DEFAULT_PROFILES_FILE=/home/pi/.fastdds/DEFAULT_FASTRTPS_PROFILES.xml >> /home/pi/start_vol_disp.log 2>&1
if [ $? -ne 0 ]; then
echo "Failed to source export FASTRTPS_DEFAULT_PROFILES_FILE" >> /home/pi/start_vol_disp.log
exit 1
fi
# vol_dispノードを起動
echo "Starting vol_disp node..." >> /home/pi/start_vol_disp.log
ros2 run vol_disp voldisp >> /home/pi/start_vol_disp.log 2>&1
if [ $? -ne 0 ]; then
echo "Failed to start vol_disp node" >> /home/pi/start_vol_disp.log
exit 1
fi
chmod +x ~/start_voldisp.sh
で実行権限つけるのを忘れないようにねー
このままコンソールから実行して、「起動しない」ようならばその時点で何かおかしいので、エラーログをAIにでもかませて、何がおかしいかアドバイスをもらえばいいと思う。
・・・OpenAIのChatGPTあたりは結構まともに答えてくれると思う。
Copilotは、Edgから簡単に起動できるから手を伸ばしだけど、こういうことには全くダメですな。使えん。あれはゴミだ。
特にマイクロソフトのせいで動かないようなものは、嘘を教えてくるし、かたくなにマイクロソフト製品を擁護しようとするあまり、トラブル解決がすすまない。
(例えば既存環境でSMBサーバに接続できないなどの場合、実際はWinアップデートのせいでつながらなくなったとしてもSMB側の設定が悪い、とばかり言ってくる。でもSMB側の設定を変えると当然今までつながっていたマシンまでつながらなくなるということが起こり被害が広がる。)
●systemdの.serviceファイルを作成する
/etc/systemd/system/voldisp.service
とかで以下のファイルを作る
これはsystemdに何をどう起動するかの指示になり、先ほどのshをここから起動するのが目的のファイル。
[Unit]
Description=Start ROS2 vol_disp node
After=network.target pulseaudio.service jack.service
[Service]
ExecStart=/home/pi/start_voldisp.sh
WorkingDirectory=/home/pi
User=pi
Group=pi
Environment=ROS_DOMAIN_ID=0
Environment=RCL_LOG_LEVEL=INFO
Restart=on-failure
#Environment=DISPLAY=:0 # X11ディスプレイを使用する場合(適切なディスプレイ番号を指定)
Environment=PULSE_SERVER=unix:/run/user/1000/pulse/native # PulseAudioがユーザーセッションで動作するように設定
# ここを実際のユーザーIDに合わせる 「id -u pi」で確認。
[Install]
WantedBy=multi-user.target
ここでの躓きがちなミソは3行目。
前提となるサービスが起動していないと当然ノード起動できずコケる。
なので、前提サービスが立ち上がった後に起動せよっていう命令。
ネットワークはROS2動かすのだから必須。(AIでもちゃんと記載してくる)でも、それ以外はAIは知る由もないので、自分で考えないといけない。(あるいはノードのプログラムも食わせれば記載してくれるかもしれないが・・・。)
なんとなく他はAIに聞けばコード生成してくれるが、AIなんかに聞いてもなかなか正解が出てこないと思う。
6行目は普通に起動ファイルを記載。
そのあとの部分は、ROS2のノードをOS起動時に実行したい、どうしたらいいかとかで聞くと出てくると思う。
・systemdに登録
以下はお決まり文句
sudo systemctl daemon-reload
sudo systemctl enable voldisp.service
sudo systemctl start voldisp.service
再起動して
ros2 node list
で起動したノードが出ていれば成功。
うまくいってなければエラーログをAIに食わせてみよう