rosbag はデータを記録および再生し、GMappping アルゴリズムを通じて地図とナビゲーションを作成します

1 はじめに

前章の紹介で ROS の動作原理を理解し、ロボットを遠隔制御することもできるようになりましたが、実際の環境ではロボットはどのように自律的に移動するのでしょうか? これを行うには、ロボットは自分がどこにいるのか、どこへ行く必要があるのか​​を認識する必要があります。
これは、ロボットが周囲環境の地図を持ち、地図内での自分の位置を把握している必要があることを意味します。そのため、このセクションでは、ロボットのセンサー データを使用して地図を構築する方法について学びます。

2.ロスバッグツール

2.1、ロスバッグ記録

ここでは、まず ROS トピックを記録および再生するためのツールに慣れます。rosbag は
、前の記事の起動ファイルを引き続き使用してロボットを起動します。 roslaunch mywanderbot test.launch
でトピックの記録を開始します。rosbag Record -a は、
送信されたすべてのメッセージを記録します。オンライン トピックによる. センサーが多く、大量のデータが記録される場合. 一般に、スキャンTF の記録など、指定したトピックを記録することをお勧めします:
rosbag Record scan TF は、記録されたスキャンTF
で送信されたすべてのメッセージを保存します.bag ファイル内のトピック。デフォルトは、2023-10-13-08-28-57.bagのように、「年-月-日-時-分-秒」に基づく名前です。また、名前を指定するか、それを示すプレフィックスを追加します。rosbag レコード -O test.bag scan tf生成ファイル: test.bag


rosbag Record -o test.bag scan tf は、
テスト接頭辞と時間を含む名前を生成します: test_2023-10-13-08-36-10.bag
ここのレコード トピックは基本的にサブスクリプションです。トピック情報を表示できます: rostopic infoスキャンすると、
加入者レコードがあることがわかります。


2.2. ロスバッグを表示する

このバッグファイルの情報を表示します: rosbag info test.bag

パス: test.bag
バージョン: 2.0
期間: 1.2 秒
開始: 1970 年 1 月 1 日 08:05:48.80 (348.80)
終了: 1970 年 1 月 1 日 08:05:50.03 (350.03)
サイズ: 53.9 KB
メッセージ: 83
圧縮: なし [1 /1 チャンク]
タイプ: sensor_msgs/LaserScan [90c7ef2dc6895d81024acba2ac42f369]
             tf2_msgs/TFMessage [94810edda583a504dfda3829e70d7eec]
トピック: スキャン 7 メッセージ : sensor_msgs/LaserScan
             tf 76 メッセージ : tf2_msgs/ TFMessage (2 接続)

レコードの期間、サイズ、タイプ、トピックなどを確認できます。バッグファイル情報を表示すると、必要な情報が記録されているかどうかを知るのに非常に役立ちます。 

2.3. ロスバッグの再生

記録後、それを再生できます: rosbag play -- Clock test.bag
ここで、--クロックフラグは、rosbag が時間メッセージを公開する必要があることを示します。これはマップの作成にとって非常に重要です。
注: --クロックフラグを指定すると、 rosbag が時間メッセージを公開し、時間はこのパッケージによって記録された時間から始まります。Gazebo エミュレータなど、他のノードが時間メッセージを公開している場合、多くの問題が発生します。ソースのリリース時間が 2 つある場合、時間が矛盾しているため、時間が前後に飛び、マッピング アルゴリズムが混乱します。
したがって、--クロックパラメータを指定してrosbagコマンドを実行するときは、システム上の他のものが時刻を公開していないことを確認してください。簡単な解決策は、実行中のエミュレータを閉じることです。

3. マップを作成する

ロボットにとってマップの重要性は自明です。ここでは、gmappingパッケージのslam_gmappingノードを使用してマップを作成します。このノードはGMappingアルゴリズムを使用します。原理は、Rao-Blackwellized パーティクル フィルタを使用してロボット独自のフィルタを維持することです。追跡の場合、このアルゴリズムはロボットのセンサー データとすでに構築されている部分マップに基づいています。
リアルタイムのセンサー データを使用してロボットの実行中にマップを生成することもできますが、ここでは別の方法を使用し、ロボットを駆動して動き回り、上記の rosbag を使用してセンサー データを記録し、データを再生します。slam_gmappingノードを使用してマップを取得します。rosbag
を使用する利点は、ロボットを再度実行する必要がないため、特に多くの異なるパラメーターを試す必要がある場合に時間を節約できることです。

3.1. 起動が存在しない

ロボットとキーボードの制御を開始しましょう。

roslaunchturtlebot_stageturtlebot_in_stage.launch
roslaunchturtlebot_teleopkeyboard_teleop.launch

以下のようなエラーが発生した場合:

RLException : [turtlebot_in_stage.launch] はパッケージ [turtlebot_stage] の起動ファイルでも、[turtlebot_stage] の起動ファイル名でもありません
例外のトレースバックはログ ファイルに書き込まれました

RLException : [keyboard_teleop.launch] はパッケージ [turtlebot_teleop] の起動ファイルでも、[turtlebot_teleop] の起動ファイル名でもありません
例外のトレースバックはログ ファイルに書き込まれました

このようなエラーは通常、インストール パッケージがないことを意味します。理由はバージョンの問題です。sudo
apt-get install ros-melodic-turtlebot-teleop をインストールする必要があります。

同様に、ここでもUbuntu のバージョンに注意する必要があります。以前のバージョンはros-melodic-turtlebot-teleopである必要があります。次のようなエラーが発生した場合:

 E: パッケージ ros-melodic-turtlebot-teleop が見つかりません

Tab キーをダブルクリックしてプロンプトを表示します。表示されるバージョンは次のとおりです:
sudo apt-get install ros-melodic-turtlebot3-teleop. Turtlebot がTurtlebot3にアップグレードされたこと
がわかります

インストール後、起動します 正しいコマンドは次のとおりです(名前は検索してタブキーをダブルクリックすることによっても決定されます):
roslaunch Turtlebot3_gazebo Turtlebot3_stage_1.launch
roslaunch Turtlebot3_teleop Turtlebot3_teleop_key.launch
 

開始後、図に示すように:

キーボードのw と xは線速度の加速と減速に使用され、a と dは角速度の加速と減速に使用され、sは停止に使用されます。

3.2. 記録データ

ロボットの操作に慣れてきたら、scantfで送信されるメッセージを記録していきますが、ここでは-Oでバッグのファイル名を指定します
rosbag レコード -O data.bag /scan /tf

マシンを駆動して周囲の環境を移動する過程で、マシンには十分なデータが蓄積されます。

3.3. Gマッピングアルゴリズム

マッピング プログラムを開始する前に、まずシミュレーション ソフトウェアを終了します。シミュレータはLaserScanメッセージを発行するため、これは非常に重要です。これはrosbag のリプレイ メッセージと競合します。終了後、 roscoreを開始します新しいターミナルを開き、パッケージ ファイルに記録されているタイムスタンプを使用してslam_gmapping
ノードを開始するように ROS に指示しますrosparam set use_sim_time true rosrun gmapping slam_gmapping次のようなエラーが発生した場合:


[rospack] エラー: パッケージ「gmapping」が見つかりません

gmappingをインストールします。また、システムのバージョンに応じて選択します: sudo apt install ros-melodic-gmapping 

インストール後、rosrun gmapping slam_gmapping を開始します。ここで、トピックがscanでない場合は、 scan:=mylaser_scanと同様に再マッピングを行う必要があること
に注意してください。この時点で、マッピング プログラムは開始されており、データを待っています。入力したら、次のステップはデータを再生することです。rosbag記録を再生するコマンド: rosbag play --lock data.bag

この時点ではまだマップはハードディスクに保存されていないので、slam_gmapping を保存するには、 map_serverパッケージ内のmap_saverノードを使用して保存します。
rosrun マップサーバー マップセーバー

[rospack] エラー: パッケージ 'map_server' が見つかりません

インストールするバージョンも確認します: sudo apt-get install ros-melodic-map-server  

もちろん、マップを保存するときに次のエラーが発生した場合:

[警告] [1697176900.416482590、1697172684.125851250]: MessageFilter [target=odom]: これまでにメッセージの 100.00% が削除されました。詳細については、[ros.gmapping.message_filter] rosconsole ロガーを DEBUG にしてください。

以下に示すように、 tf ツリーを表示して、それらの間の関係を理解することができます: rosrun rqt_tf_tree rqt_tf_tree

ノードが完了しているかどうかを確認してください。これは通常、記録に必要なトピックが不足していることが原因であるため、単純にすべてのメッセージを記録できます: rosbag Record -O data_all.bag -a
。この方法では問題はありません。 

3.4. プロセス全体

前のエラー処理と説明の一部については、プロセスの概要を次に示します。2 つのターミナルを開き、1 つはロボットを起動し、もう 1 つはすべてのデータを記録します。

roslaunch mywanderbot test.launch
rosbag レコード -O data_all.bag -a
 

記録後、続行する前に、エミュレータを停止し、新しいターミナルを開いて次のコマンドを入力する必要があります。

roscore
rosparam set use_sim_time true
rosrun gmapping slam_gmapping
rosbag play --clock data_all.bag
rosrun map_server map_saver

GMappingアルゴリズムをオンにし、記録されたデータの再生を待って計算処理を実行し、最後にマップをハードディスクに保存します。
これにより、2 つのファイルが生成され、1 つはmap.pgm (マップ) で、もう 1 つはmap.yaml (マップ メタデータ) であり、以下に示すように、オンライン トピックrostopic list
を表示できます。


この図では、追加のトピック/tf_staticがあることがわかります。このトピックの情報を表示できます:
rostopic info tf_static

タイプ: tf2_msgs/TFMessage

出版社: なし

購読者: 
 * /slam_gmapping (http://YAB:37763/)

そのサブスクライバはslam_gmappingなので、ここのマッピング プログラムにはこのtf_static トピックメッセージが必要です。 

タイプを確認します: rosmsg show tf2_msgs/TFMessage

geometry_msgs/TransformStamped[] 変換
  std_msgs/ヘッダー ヘッダー
    uint32 seq
    タイム スタンプ
    文字列 Frame_id
  string child_frame_id
  geometry_msgs/Transform 変換
    geometry_msgs/Vector3変換
      float64 x
      float64 y float64
      z
    geometry_msgs/四元数回転
      float64 x
      float64 y
      float64 z
      float64 w

上記で記録したすべてのデータにより、ファイルが非常に大きくなり不必要になるため、ここではもう 1 つのトピックだけを記録する必要があります。tf_static
rosbag Record -O data_three.bag /scan /tf /tf_static

生成されたマップを見てみましょう。マップ コマンド: eog map.pgmまたは: rosrun rviz rviz (rviz にマップを追加します。表示するマップ トピックを選択することもできます)。以下に示すように: 

マップのメタデータを表示: cat map.yaml

画像:map.pgm
解像度:0.050000
原点:[-100.000000, -100.000000, 0.000000]
negate:0
occupy_thresh:0.65
free_thresh:0.196

3.5. マップの品質を向上させる

Turtlebotのセンサーには、実際にはレーザー距離計の代わりに Microsoft のKinect深度カメラによって取得されたデータが使用されており、この偽のレーザー距離計は本物のレーザー センサーよりも範囲が狭く、視野角も狭いです。slam_gmapping はレーザー データを使用してロボットの動作を推定します。長距離、広角のデータにより、この推定がより正確になります。slam_gmappingノードのパラメーターを変更して、マップの品質を向上させることが
できます。

rosparam set /slam_gmapping/angularUpdate 0.1
rosparam set /slam_gmapping/linearUpdate 0.1
rosparam set /slam_gmapping/lskip 10
rosparam set /slam_gmapping/xmax 10
rosparam set /slam_gmapping/xmin -10
rosparam set /slam_gmapping/ymax 10
rosparam set /slam_gmapping/ymin 10

これらのコマンドは、 angularUpdateLinearUpdateの各回転で新しいスキャンが行われる距離、各LaserScanメッセージを処理するときにスキップするレイの数(lskip)、およびマップの拡張の長さ(xmin、xmax、ymin、ymax) を
変更します。これらのパラメーターの変更は、影響を受けるだけです。slam_gmapping を使用すると、データを再収集せずに上記で収集したデータを使用できます。これは、rosbagを使用して記録し、再生してマップを作成することの利点でもあります。

パラメータの使用例:

rosparam list : 現在のすべてのパラメータをリストします
rosparam get xxx : xxx パラメータ値を表示します
rosparam set xxx v : xxx パラメータ値を設定します v
rosparam dump file_name : パラメータをファイルに保存します
rosparamload file_name : ファイルからパラメータを読み取ります
rosparam delete xxx : xxxパラメータを削除します。

4. 新規インストール 

一部の友人のために、上記のパッケージがインストールされていない場合は、オープンソースのTurtlebot3を使用して新しいインストールを行います。

4.1. 作業エリアを確立する 

mkdir -p ~/mybot3_ws/src
cd ~/mybot3_ws/src
catkin_init_workspace

4.2. コンパイル

cd ..
catkin_make
echo "source ~/mybot3_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc

4.3. パッケージのダウンロード

cd ~/mybot3_ws/src
git clone https://github.com/ROBOTIS-GIT/turtlebot3.git

4.4. 再度コンパイルする

cd ..
catkin_make

4.5. 不足しているパッケージ

ここで問題が発生しました。概要は次のとおりです。

/opt/ros/melodic/share/catkin/cmake/catkinConfig.cmake:83 (find_package) での CMake エラー: 「turtlebot3_msgs」によって提供された   、次のいずれかの名前の
  パッケージ構成ファイルが見つかりませんでした。

    Turtlebot3_msgsConfig.cmake
    Turtlebot3_msgs-config.cmake
「cmake」の呼び出しに失敗しました

Turtlebot3_msgsパッケージが見つからないため、ダウンロードとコンパイルを続行します。

cd ~/mybot3_ws/src
git clone https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git

科学インターネットではない場合、エラーが発生します。

gnutls_handshake() が失敗しました: TLS 接続が適切に終了されませんでした。
取消代理:

git config --global --unset https.https://github.com.proxy 
git config --global --unset http.https://github.com.proxy

それでも動作しない場合は、構成ファイルを削除できます: rm -rf ~/.gitconfig

パッケージのインストールの詳細については、ROS の新しいワークスペース (workspace) とパッケージ (package) のコンパイルの実践 (C++ の例)を参照してください。

4.6. マップの作成

問題なく再度コンパイルした後、マップとナビゲーション操作の作成を開始します (注意: Tab キーをダブルクリックすると自動的に入力されます):ガゼボシミュレーション ロボット
を開きますroslaunch Turtlebot3_gazebo Turtlebot3_world.launchマップを開きますroslaunch Turtlebot3_Slam Turtlebot3_slam.launch slam_methods:= gmappingキーボード制御を有効にする ロボットは、以下に示すようにマップroslaunch Turtlebot3_teleop Turtlebot3_teleop_key.launchを作成します。





最後に、マップとして保存できます: rosrun map_server map_saver -f ~/map

以下に示すように:

5. ナビゲーション

5.1. マップをロードする

マップが作成されたら、マップ内でのロボットのナビゲーションを見てみましょう。

roslaunch turtlebot3_gazebo turtlebot3_world.launch
roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=$HOME/map.yaml

次のエラーが発生します。概要は次のとおりです。

エラー: タイプ [amcl/amcl] のノードを起動できません: amcl
エラー: タイプ [move_base/move_base] のノードを起動できません: move_base

AMCL (Adaptive Monte Carlo Localization)ロボットの位置決めとナビゲーション、インストール コマンド (ROS バージョンに応じて) によく使用される適応型モンテカルロ ローカライゼーション手法
sudo apt-get install ros-melodic-navigation

5.2. バージョンコマンド

lsb_release -a

No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 18.04.6 LTS
Release:	18.04
Codename:	bionic

ROSのバージョン:

printenv ROS_DISTRO
melodic

シミュレートされたロボットのバージョン:

gazebo -version
Gazebo multi-robot simulator, version 9.0.0

5.3. tf ツリーのフルバージョン

rosrun rqt_tf_tree rqt_tf_tree は
以下のとおりです。 

5.4. 手動ナビゲーション

rvizメニュー バーの「 2D Nav Goal 」をクリックすると、地図上でロボットが走行する必要がある目的地を選択でき、次に示すように、ロボットは計画されたパスを走行します。

このナビゲーション パッケージの原理は次のとおりです。

1.ナビゲーションの目的地 (クリックされた「2D Nav Goal」) がナビゲーション ソフトウェアに送信されます。ROSアクション呼び出し ( action ) を作成し、この目的地を表すMoveBaseGoalタイプのパラメーターを渡します。このタイプの構造を見てみましょう: rosmsg info MoveBaseGoal

[move_base_msgs/MoveBaseGoal]:
geometry_msgs/PoseStamped target_pose
  std_msgs/ヘッダー ヘッダー
    uint32 seq
    タイム スタンプ
    文字列 Frame_id
  geometry_msgs/ポーズ ポーズ
    geometry_msgs/ポイント位置
      float64 x
      float64
      y float64 z
    geometry_msgs/クォータニオン方向
      float64 x
      float64 y
      float64 z
      float64 w

このパラメータは、特定の座標系 (通常はマップ座標系)での姿勢 (位置と向き)であることがわかります。

2. Global Planner は、経路計画アルゴリズムとマップを使用して、現在の場所から目標の場所までの最短経路を計画します。

3. このパスはローカル プランナー (ローカル プランナー)に渡され、ローカル プランナーはこのパスに従うようにロボットを駆動しようとします。ローカル プランナーはセンサー情報を使用して、ロボットの前にあるものの地図上にない障害物 (歩いている人など) を回避します。ローカル プランナーが立ち​​往生して経路を計画できない場合、グローバル プランナーに経路を描画するように要求します。新しいパスを選択し、再度そのパスをたどってみてください。

4. ロボットが目標ポーズに近づくと、この動作呼び出しは完了します。

5.5. コードナビゲーション

上記の手動ナビゲーションでは問題ありません。最後に、自分自身でナビゲーションするためのノードの作成を見てみましょう。同様に、ロボットを起動して、ナビゲーション マップを読み込みます。

roslaunch turtlebot3_gazebo turtlebot3_world.launch
roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=$HOME/map.yaml

ナビゲーション パッケージTurtlebot3_navigationに到達し、ノードを初期化します。

cd ~/mybot3_ws/src/turtlebot3/turtlebot3_navigation
gedit patrol.py
#!/usr/bin/env python
import rospy
import actionlib

from move_base_msgs.msg import MoveBaseAction,MoveBaseGoal

waypoints=[[(-2.5,-2.2,0),(0,0,0,1)],[(6.5,4.43,0),(0,0,-1.2,1.5)]]

def goal_pose(pose):
    goal_pose=MoveBaseGoal()
    goal_pose.target_pose.header.frame_id='map'
    goal_pose.target_pose.pose.position.x=pose[0][0]
    goal_pose.target_pose.pose.position.y=pose[0][1]
    goal_pose.target_pose.pose.position.z=pose[0][2]

    goal_pose.target_pose.pose.orientation.x=pose[1][0]
    goal_pose.target_pose.pose.orientation.y=pose[1][1]
    goal_pose.target_pose.pose.orientation.z=pose[1][2]
    goal_pose.target_pose.pose.orientation.w=pose[1][3]
    return goal_pose

if __name__=='__main__':
    rospy.init_node('patrol')
    client=actionlib.SimpleActionClient('move_base',MoveBaseAction)
    client.wait_for_server()
    while True:
        for pose in waypoints:
            goal=goal_pose(pose)
            client.send_goal(goal)
            client.wait_for_result()

コードは比較的単純です。最初にパスを計画するためのウェイポイントを定義し、次にこれらのウェイポイントをMoveBaseGoalに変換する関数goal_baseを構築します。最後に、アクション クライアントを作成し、サーバーの準備が完了するのを待ち、ウェイポイント間を循環します。各すべてのポイントナビゲーション ソフトウェアに目的地として送信されます。実行権限を追加します: chmod u+xpatrol.pyノードを実行します: rosrun Turtlebot3_navigation Patrol.py地図上でロボットが走行しているのが確認できます。動作呼び出し (アクション) の詳細な使用方法については、興味のある方は次を参照してください: ROS 通信メカニズムのアクション サービスの実践



おすすめ

転載: blog.csdn.net/weixin_41896770/article/details/134027989