Closed nonanonno closed 3 weeks ago
sudo apt install -y ros-${ROS_DISTRO}-ros-gz
https://gazebosim.org/docs/harmonic/moving_robot/
/keyboard/keypress
を出すには Key publisher プラグインを有効化する必要がある。これは、gazebo の client の設定。右上の検索窓から探して追加できる。
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: "$(var robot_sdf_file)", name: "robot"'" />
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: "/workspaces/navigation-trial/gz_ws/install/gz_demo/share/gz_demo/models/rrbot.urdf", name: "robot"'" />
<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>
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>
以下の要素の組み合わせになる。ここでは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
この時の TF。chassis がない。
rviz 上でモデルを表示できるようになった。ポイントは2つ
/penguin
→ /penguin/chassis
の tf がないのでとりあえず static_transform_publisher で出す(urdf だと気にしなくて良くなる?)TF Prefix
に /penguin
を指定する。だいたい終わったので close。
https://gazebosim.org/docs/harmonic/tutorials/ を進めていく感じで。