前回までで、PI CARの遠隔操に必要な部品がそろいましたので、実際にブラウザから遠隔操縦してみます。操縦するまでには、今まで作成してきたROS2ノードを起動する必要があります。
いちいち、5つもノードを起動しないといけないので面倒ですし、セッションを開くのも大変です。
ここで登場するのはlaunchという仕組み。
ROS2はノードシステムですので、複数ノードを起動する仕組みが用意されています。
今回は、これに従って作っていきます。
用意ができたところで、実際にブラウザから遠隔操縦を行ってみようと思います。
■ launchパッケージンの準備
まずは、パッケージを準備します。
ここでは、picar_bringupパッケージを準備します。
〇 picar_bringupパッケージの生成
$ cd ros2_ws/src $ ros2 pkg create picar_bringup $ cd picar_bringup $ ls CMakeLists.txt include package.xml src $ rm -rf src include $ mkdir launch
〇 CmakeList.txtの修正
次に CmakeList.txtを以下のように修正します。
テンプレートから不要な記述を削除して、必要な記述だけにした後に緑字部を追記します。
cmake_minimum_required(VERSION 3.8)
project(picar_bringup)
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
# find dependencies
find_package(ament_cmake REQUIRED)
install(DIRECTORY
launch
DESTINATION share/${PROJECT_NAME}
)
ament_package()
〇 package.xmlの修正
次にpackage.xmlを以下のように修正します。
テンプレートから不要な記述を削除した後、緑部の参照パッケージを記載します。
<package format="3">
<name>picar_bringup</name>
<version>0.0.0</version>
<description>TODO: Package description</description>
<maintainer email="xxx@todo.todo">oka</maintainer>
<license>TODO: License declaration</license>
<buildtool_depend>ament_cmake</buildtool_depend>
<exec_depend>picar_py_pkg</exec_depend>
<exec_depend>v4l2_camera</exec_depend>
<exec_depend>rosbridge_server</exec_depend>
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
<export>
<build_type>ament_cmake</build_type>
</export>
</package>
■ launchファイルの準備
先に作成したros2_ws/src/picar_bringup/launchにlaunchファイルを記述していきます。
詳しくはROS2の公式ページを参照するのがよいかとおもいます。
launchファイルはpicar.launch.pyとして作成します。
なお、.launch.pyはお作法なので付加します。
〇 picar.launch.py
パッケージ、実行プログラムを記載すればよいのですが、外部lauchを呼び出す方法が少々、情報がなくて探しました(緑部)。
なんとか、ネットで調べながら起動することができました。
from launch import LaunchDescription from launch_ros.actions import Node from launch.actions import IncludeLaunchDescription from launch.substitutions import PathJoinSubstitution from launch_ros.substitutions import FindPackageShare def generate_launch_description(): ld = LaunchDescription() picar_vehicle_node = Node ( package="picar_py_pkg", executable="picar_vehicle", name="picar_vehicle" ) picar_v4l2_camera_node = Node ( package="v4l2_camera", executable="v4l2_camera_node", name="v4l2_camera_node" ) picar_rangefinder_node = Node ( package="picar_py_pkg", executable="picar_rangefinder", name="picar_rangefinder" ) picar_gimbal_node = Node ( package="picar_py_pkg", executable="picar_gimbal", name="picar_gimbal" ) rosbridge_server = IncludeLaunchDescription( PathJoinSubstitution( [FindPackageShare("rosbridge_server"), "launch", "rosbridge_websocket_launch.xml"]), ) ld.add_action(picar_vehicle_node) ld.add_action(picar_v4l2_camera_node) ld.add_action(picar_rangefinder_node) ld.add_action(picar_gimbal_node) ld.add_action(rosbridge_server) return ld
〇 picar.launch.pyの起動確認
ここまでできたところで下記のようにプログラムを実行し、rqt_graphでノード、トピックの起動を確認しました。
$ ros2 launch picar_bringup picar.launch.py
別セッションでrqt_graphを起動して、想定通りにノードとトピックが接続されていることを確認しました。
$ ros2 run rqt_graph rqt_graph
■ ブラウザ GUI
私はhtmlとかjavaは、まともにお勉強したことないのですが、適当につくりました。
取り合えず画像が見えて、車が動かせればよいだけですので、下記のような感じで作りました。
■ 試運転
実際にGUIをつなげて試運転をしてみました。
画面だけをみて操作するのは、ちょっと難しいです。運転が下手なのもあり、おっかなびっくりで運転しています。
実は、この撮影の前にもっと難しいコースを作っていたのですが、とても尺におさまるような感じになりませんでしたので、ボツにしました。
■ 次回
嘘でも、ROS2ベースで車を操作できるようになりましたので、引き続き、もう少し遊んでみようと思います。
また、よろしければ見ていただけるとありがたいです。