AbudoriLab-TC2024 / navigation-trial

Navigation関連を色々試すリポジトリ
Apache License 2.0
0 stars 0 forks source link

gazebo を試す #2

Closed nonanonno closed 3 weeks ago

nonanonno commented 1 month ago

https://gazebosim.org/docs/harmonic/tutorials/ を進めていく感じで。

nonanonno commented 1 month ago

インストール

sudo apt install -y ros-${ROS_DISTRO}-ros-gz
nonanonno commented 1 month ago

嵌まったポイント

https://gazebosim.org/docs/harmonic/moving_robot/

/keyboard/keypress を出すには Key publisher プラグインを有効化する必要がある。これは、gazebo の client の設定。右上の検索窓から探して追加できる。

image

https://gazebosim.org/docs/harmonic/sensors/

gz launch が求められるが、入っていないことがある。 ros-jazzy-gz-launch-vendor のインストールが必要。

https://gazebosim.org/docs/harmonic/spawn_urdf/

xacro は直接は読み込めないので urdf に変換する。 xacro <path/to/xacro> > model.urdf urdf でも、filename="package://foo などと外部ファイルを見ている場合は、探索パスを GZ_SIM_RESOURCE_PATH に設定する必要がある。ROSパッケージの場合、見た感じ export GZ_SIM_RESOURCE_PATH=/opt/ros/jazzy/share/ で大丈夫そう。gz service -s /world/empty/create ... ではなく、 gz sim ... の方で設定すること。

https://gazebosim.org/docs/harmonic/ros2_launch_gazebo/

ドキュメント上は gz_server タグが使えるようになっているが、jazzy では最近バックポートされたのか今現在(10/3)使えない。以下の記述で代用する。

<executable name="gzserver" cmd="gz sim $(var world_sdf_file)" />

composition なども未対応。

https://gazebosim.org/docs/harmonic/ros2_spawn_model/

同様に gz_spawn_model がまだ使えない。以下のコマンドで代用可能なはずだが、ダブルクォートの処理が上手くいかないので代用できない。Python でやるか諦めるか。

  <executable name="spawn"
    cmd="gz service -s /world/empty/create --reqtype gz.msgs.EntityFactory  --reptype gz.msgs.Boolean --timeout 1000 --req 'sdf_filename: &quot;$(var robot_sdf_file)&quot;, name: &quot;robot&quot;'" />
nonanonno commented 1 month ago

image

rrbot をシミュレートする launch

<launch>
  <arg name="world_sdf_file" default="empty.sdf" />
  <arg name="robot_sdf_file" default="$(find-pkg-share gz_demo)/models/rrbot.urdf" />
  <arg name="bridge_config" default="$(find-pkg-share gz_demo)/config/gz_bridge.yaml" />
  <arg name="rviz_config" default="$(find-pkg-share gz_demo)/config/rviz.rviz" />

  <executable name="gzserver" cmd="gz sim $(var world_sdf_file)" />
  <executable name="spawn"
    cmd="gz service -s /world/empty/create --reqtype gz.msgs.EntityFactory  --reptype gz.msgs.Boolean --timeout 1000 --req 'sdf_filename: &quot;/workspaces/navigation-trial/gz_ws/install/gz_demo/share/gz_demo/models/rrbot.urdf&quot;, name: &quot;robot&quot;'" />

  <node pkg="robot_state_publisher" exec="robot_state_publisher">
    <param name="use_sim_time" value="true" />
    <param name="robot_description" value="$(file-content $(var robot_sdf_file))" />
  </node>
  <node pkg="rviz2" exec="rviz2" args="-d $(var rviz_config)" />
  <node pkg="ros_gz_bridge" exec="parameter_bridge">
    <param name="config_file" value="$(var bridge_config)" />
  </node>
</launch>
nonanonno commented 1 month ago

urdf を sdf から読み込む

urdf でも以下のようにアセットを組めば include で読み込める

foo_robot
├─ model.config
└─ robot.urdf

model.config は以下の通り。

<?xml version="1.0"?>
<model>
  <name>foo_robot</name>
  <version>1.0</version>
  <sdf version="1.10">robot.urdf</sdf>
</model>

これにより、以下の記述で読み込める

    <include>
      <uri>model://foo_robot</uri>
    </include>
nonanonno commented 3 weeks ago

対向二輪ロボットを動かす

https://github.com/AbudoriLab-TC2024/navigation-trial/tree/da39fd72c3a712c1907e29024389b587261d66e9/nav_ws

以下の要素の組み合わせになる。ここではSDFを使うが、TFが上手く出ない。

ロボットモデルには gz::sim::systems::DiffDrive を入れている。これにより 対向二輪として動作し、gz のトピックが生成される

ワールドの sdf ではロボットを読み込んでいるが、以下のような記述をすることで OdometryPublisher などを追加している。

    <model name="penguin">
      <self_collide>true</self_collide>
      <pose>0 0 0.35 0 0 0</pose>
      <include merge="true">
        <uri>model://penguin_description/models/penguin</uri>
      </include>

      <plugin
        filename="gz-sim-joint-state-publisher-system"
        name="gz::sim::systems::JointStatePublisher">
      </plugin>

      <plugin
        filename="gz-sim-pose-publisher-system"
        name="gz::sim::systems::PosePublisher">
        <publish_link_pose>true</publish_link_pose>
        <use_pose_vector_msg>true</use_pose_vector_msg>
        <static_publisher>true</static_publisher>
        <static_update_frequency>1</static_update_frequency>
      </plugin>

      <plugin
        filename="gz-sim-odometry-publisher-system"
        name="gz::sim::systems::OdometryPublisher">
        <odom_frame>penguin/odom</odom_frame>
        <robot_base_frame>penguin</robot_base_frame>
      </plugin>
    </model>

ロボットの制御はROS 2側から行っている。ros_gz_bridge を使っていて、ブリッジの設定はこちらの通りとなる。

この状態での rqt graph

image

nonanonno commented 3 weeks ago

この時の TF。chassis がない。

image
nonanonno commented 3 weeks ago

URDF と SDF の違い

https://www.learnros2.com/ros/tech-blog/difference-between-urdf-and-sdf-and-how-to-convert

nonanonno commented 3 weeks ago

rviz 上でモデルを表示できるようになった。ポイントは2つ

Image

Image

nonanonno commented 3 weeks ago

だいたい終わったので close。