はじめに
前回は、MG400 の github から urdf.xacro をダウンロードし、xacro で URDF を作成しました。
今回は、作成した URDF のメッシュ情報を変更していきます。
前提条件
前提条件は、以下の通りです。
- MG400 を Rviz2 上で表示できる。
メッシュ情報の変更方法
現在の mg400_training.urdf ではメッシュ情報を読み込めていないので、Gazebo 上に表示しようとするとエラーが出ます。
なので、mg400_training.urdf のメッシュ情報を以下のように変更します。
<mesh filename="package:///home/wsl-ubuntu/mg400_workspace/src/mg400_training/meshes/base_link.dae"/>
↓
<mesh filename="/home/wsl-ubuntu/mg400_workspace/src/mg400_training/meshes/base_link.dae"/>
これを、全ての <mesh> タグで変更してください。
package:// は、~/.gazebo/models を指していますので、こちらにファイルをコピーしても問題ありません。
Gazebo で起動
<mesh> タグを変更したら、gazebo の launch ファイルを作成していきます。
cd ~/mg400_workspace/src/mg400_training
touch launch/gazebo.launch.py
今作成した gazebo.launch.py を以下のようにしてください。
import os
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch.actions import ExecuteProcess
from launch_ros.actions import Node
def generate_launch_description():
pkg_box_car_description = get_package_share_directory("mg400_training")
urdf_file = os.path.join(pkg_box_car_description, "urdf", "mg400_training.urdf")
print(urdf_file)
return LaunchDescription([
ExecuteProcess(
cmd=["gazebo", "-s", "libgazebo_ros_factory.so"],
output="screen"
),
Node(
package="gazebo_ros",
executable="spawn_entity.py",
arguments=["-entity", "mg400_training", "-b", "-file", urdf_file],
),
Node(
package="robot_state_publisher",
executable="robot_state_publisher",
output="screen",
arguments=[urdf_file],
),
])
ここまでできたら、あとは起動するだけです。
cd ~/mg400_workspace
colcon build --packages-select mg400_training
source ~/.bashrc
ros2 launch mg400_training gazebo.launch.py
上記を実行すると、以下のように gazebo が立ち上がります。
力のない mg400 が表示されたかと思います。
ここから、各関節に力の情報を入力していきます。
URDF の修正について
現状の URDF では、各 joint の接続情報はありますが、Gazebo のシミュレーション上で表示しようとすると、joint間 の力学情報がないのでうまく表示できません。
この問題を解決するために、gazebo_ros2_control を使用します。
詳細な説明はこちらにあります。
前回の AGV では、libgazebo_ros_diff_drive.so を使用して、シミュレーションを実行しました。
似たようなことを、追記します。
URDF の修正
gazebo_ros2_control の追加
mg400_training.urdf の最終行の </ robot> の上の行に以下を追加してください。
<gazebo>
<plugin filename="libgazebo_ros2_control.so" name="gazebo_ros2_control">
<robot_sim_type>gazebo_ros2_control/GazeboSystem</robot_sim_type>
<parameters>/home/wsl-ubuntu/mg400_workspace/src/mg400_training/config/jtc.yaml</parameters>
</plugin>
</gazebo>
<ros2_control name="GazeboSystem" type="system">
<hardware>
<plugin>gazebo_ros2_control/GazeboSystem</plugin>
</hardware>
<joint name="mg400_j1">
<command_interface name="position">
<param name="min">-3.14</param>
<param name="max">3.14</param>
</command_interface>
<command_interface name="velocity">
<param name="min">-3.15</param>
<param name="max">3.15</param>
</command_interface>
<state_interface name="position"/>
<state_interface name="velocity"/>
<state_interface name="effort"/>
<param name="initial_position">0.0</param>
</joint>
<joint name="mg400_j2_1">
<command_interface name="position">
<param name="min">-3.14</param>
<param name="max">3.14</param>
</command_interface>
<command_interface name="velocity">
<param name="min">-3.15</param>
<param name="max">3.15</param>
</command_interface>
<state_interface name="position"/>
<state_interface name="velocity"/>
<state_interface name="effort"/>
<param name="initial_position">-1.57</param>
</joint>
<joint name="mg400_j2_2">
<command_interface name="position">
<param name="min">-3.14</param>
<param name="max">3.14</param>
</command_interface>
<command_interface name="velocity">
<param name="min">-3.15</param>
<param name="max">3.15</param>
</command_interface>
<state_interface name="position"/>
<state_interface name="velocity"/>
<state_interface name="effort"/>
<param name="initial_position">0.0</param>
</joint>
<joint name="mg400_j3_1">
<command_interface name="position">
<param name="min">-3.14</param>
<param name="max">3.14</param>
</command_interface>
<command_interface name="velocity">
<param name="min">-3.2</param>
<param name="max">3.2</param>
</command_interface>
<state_interface name="position"/>
<state_interface name="velocity"/>
<state_interface name="effort"/>
<param name="initial_position">-1.57</param>
</joint>
<joint name="mg400_j3_2">
<command_interface name="position">
<param name="min">-3.14</param>
<param name="max">3.14</param>
</command_interface>
<command_interface name="velocity">
<param name="min">-3.2</param>
<param name="max">3.2</param>
</command_interface>
<state_interface name="position"/>
<state_interface name="velocity"/>
<state_interface name="effort"/>
<param name="initial_position">0.0</param>
</joint>
<joint name="mg400_j4_1">
<command_interface name="position">
<param name="min">-3.14</param>
<param name="max">3.14</param>
</command_interface>
<command_interface name="velocity">
<param name="min">-3.2</param>
<param name="max">3.2</param>
</command_interface>
<state_interface name="position"/>
<state_interface name="velocity"/>
<state_interface name="effort"/>
<param name="initial_position">0.0</param>
</joint>
<joint name="mg400_j4_2">
<command_interface name="position">
<param name="min">-3.14</param>
<param name="max">3.14</param>
</command_interface>
<command_interface name="velocity">
<param name="min">-3.2</param>
<param name="max">3.2</param>
</command_interface>
<state_interface name="position"/>
<state_interface name="velocity"/>
<state_interface name="effort"/>
<param name="initial_position">0.0</param>
</joint>
<joint name="mg400_j4_3">
<command_interface name="position">
<param name="min">-3.14</param>
<param name="max">3.14</param>
</command_interface>
<command_interface name="velocity">
<param name="min">-3.2</param>
<param name="max">3.2</param>
</command_interface>
<state_interface name="position"/>
<state_interface name="velocity"/>
<state_interface name="effort"/>
<param name="initial_position">0.0</param>
</joint>
<joint name="mg400_j5_1">
<command_interface name="position">
<param name="min">-3.14</param>
<param name="max">3.14</param>
</command_interface>
<command_interface name="velocity">
<param name="min">-3.2</param>
<param name="max">3.2</param>
</command_interface>
<state_interface name="position"/>
<state_interface name="velocity"/>
<state_interface name="effort"/>
<param name="initial_position">0.0</param>
</joint>
<joint name="mg400_j5">
<command_interface name="position">
<param name="min">-3.14</param>
<param name="max">3.14</param>
</command_interface>
<command_interface name="velocity">
<param name="min">-3.2</param>
<param name="max">3.2</param>
</command_interface>
<state_interface name="position"/>
<state_interface name="velocity"/>
<state_interface name="effort"/>
<param name="initial_position">0.0</param>
</joint>
</ros2_control>
gazebo_ros2_control を追加しました。
次は、<gazebo> タグの <parameters> にある yaml ファイルを作成します。
jtc.yaml の作成
cd ~/mg400_workspace/src/mg400_training
mkdir config
touch config/jtc.yaml
jtc.yaml は以下のように記載してください。
controller_manager:
ros__parameters:
update_rate: 100
joint_state_broadcaster:
type: joint_state_broadcaster/JointStateBroadcaster
joint_trajectory_controller:
type: joint_trajectory_controller/JointTrajectoryController
joint_trajectory_controller:
ros__parameters:
joints:
- mg400_j1
- mg400_j2_1
- mg400_j2_2
- mg400_j3_1
- mg400_j3_2
- mg400_j4_1
- mg400_j4_2
- mg400_j4_3
- mg400_j5_1
- mg400_j5
command_interfaces:
- position
state_interfaces:
- position
state_publish_rate: 50.0
action_monitor_rate: 20.0
allow_partial_joints_goal: false
open_loop_control: true
constraints:
stopped_velocity_tolerance: 0.01
goal_time: 0.0
joint1:
trajectory: 0.05
goal: 0.03
詳細は後程説明します。
setup.py の編集
setup.py に先ほど作成した config を読み込むように指定します。
(os.path.join("share", package_name, "launch"), glob("launch/*")),
(os.path.join("share", package_name, "urdf"), glob("urdf/mg400*")),
(os.path.join("share", package_name, "urdf/common"), glob("urdf/common/*")),
(os.path.join("share", package_name, "meshes"), glob("meshes/*")),
↓
(os.path.join("share", package_name, "launch"), glob("launch/*")),
(os.path.join("share", package_name, "config"), glob("config/*")),
(os.path.join("share", package_name, "urdf"), glob("urdf/mg400*")),
(os.path.join("share", package_name, "urdf/common"), glob("urdf/common/*")),
(os.path.join("share", package_name, "meshes"), glob("meshes/*")),
MG400 を Gazebo 上で表示する
ここまで進めたら、MG400 を gazebo 上で表示してみましょう。
cd ~/mg400_workspace
colcon build --packages-select mg400_training
source ~/.bashrc
ros2 launch mg400_training gazebo.launch.py
以下のようにロボットが表示されれば成功です。
おわりに
今回はここまでとします。
ここまでで、MG400 だけでなく UR や Techman のロボットも同様に扱えるようになると思います。
様々なモデルでお試しください。
URDF に追記した部分と jtc.yaml に関しては次回、詳細を説明します。
コメント