OSOYOO PI CARキット ROS2化 #5 – 試験走行 ブラウザからの遠隔操縦

OSOYOO PI CAR

前回までで、PI CARの遠隔操に必要な部品がそろいましたので、実際にブラウザから遠隔操縦してみます。操縦するまでには、今まで作成してきたROS2ノードを起動する必要があります。
いちいち、5つもノードを起動しないといけないので面倒ですし、セッションを開くのも大変です。
ここで登場するのはlaunchという仕組み。
ROS2はノードシステムですので、複数ノードを起動する仕組みが用意されています。
今回は、これに従って作っていきます。
用意ができたところで、実際にブラウザから遠隔操縦を行ってみようと思います。

まずは、パッケージを準備します。
ここでは、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>

先に作成した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
rqt_graph

私はhtmlとかjavaは、まともにお勉強したことないのですが、適当につくりました。
取り合えず画像が見えて、車が動かせればよいだけですので、下記のような感じで作りました。

実際にGUIをつなげて試運転をしてみました。
画面だけをみて操作するのは、ちょっと難しいです。運転が下手なのもあり、おっかなびっくりで運転しています。
実は、この撮影の前にもっと難しいコースを作っていたのですが、とても尺におさまるような感じになりませんでしたので、ボツにしました。

嘘でも、ROS2ベースで車を操作できるようになりましたので、引き続き、もう少し遊んでみようと思います。
また、よろしければ見ていただけるとありがたいです。

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