ROS入門 (40) - レーザースキャナー
Gazeboでレーザースキャナーを利用する方法をまとめました。
前回
1. レーザースキャナー
「レーザースキャナー」は、照射されたレーザーによって、対象物の空間位置情報を取得する計測するセンサーです。短時間に大量かつ「面」的な「3次元空間の点群座標」を取得することができます。
2. URDFへのレーザースキャナーの追加
URDFへのレーザースキャナーの追加手順は、次のとおりです。
(1) レーザースキャナーの「link」と「joint」の追加。
レーザースキャナーの見た目と配置を定義しています。
・toio_style.urdfの一部
<!--レーザースキャナー-->
<link name="hokuyo_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<box size="0.1 0.1 0.1" />
</geometry>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<box size="0.1 0.1 0.1" />
</geometry>
</collision>
<inertial>
<mass value="1e-5" />
<origin xyz="0 0 0" rpy="0 0 0" />
<inertia ixx="1e-6" ixy="0" ixz="0" iyy="1e-6" iyz="0" izz="1e-6" />
</inertial>
</link>
<joint name="hokuyo_joint" type="fixed">
<axis xyz="0 1 0" />
<origin xyz="0 0 0.2" rpy="0 0 0" />
<parent link="base_link" />
<child link="hokuyo_link" />
</joint>
(2) レーザースキャナーのGazeboプラグインの追加。
レーザースキャナーの機能をGazeboでシミュレートする定義になります。更新レートは1Hzにしています。
・toio_style.urdfの一部
<!--laserプラグイン-->
<gazebo reference="hokuyo_link">
<sensor type="ray" name="hokuyo">
<pose>0 0 0 0 0 0 </pose>
<visualize>false</visualize>
<update_rate>1</update_rate>
<ray>
<scan>
<horizontal>
<samples>720</samples>
<resolution>1</resolution>
<min_angle>-1.570796</min_angle>
<max_angle>1.570796</max_angle>
</horizontal>
</scan>
<range>
<min>0.10</min>
<max>30.0</max>
<resolution>0.01</resolution>
</range>
</ray>
<plugin name="laser" filename="libgazebo_ros_laser.so">
<topicName>/scan</topicName>
<frameName>hokuyo_link</frameName>
</plugin>
</sensor>
</gazebo>
URDFの全コードは、次のとおりです。
・toio_style.urdf
<?xml version="1.0"?>
<robot name="toio">
<!--ボディ-->
<link name="base_link">
<visual>
<geometry>
<box size="0.3 0.3 0.23" />
</geometry>
<material name="white">
<color rgba="1.0 1.0 1.0 1.0" />
</material>
</visual>
<collision>
<geometry>
<box size="0.3 0.3 0.23" />
</geometry>
</collision>
<inertial>
<mass value="1.0" />
<inertia ixx="0.015" iyy="0.0375" izz="0.0375" ixy="0" ixz="0" iyz="0" />
</inertial>
</link>
<!--前輪-->
<link name="front_wheel">
<visual>
<geometry>
<cylinder length="0.05" radius="0.035" />
</geometry>
<material name="white" />
</visual>
<collision>
<geometry>
<cylinder length="0.05" radius="0.035" />
</geometry>
</collision>
<inertial>
<mass value="0.1" />
<inertia ixx="5.1458e-5" iyy="5.1458e-5" izz="6.125e-5" ixy="0" ixz="0" iyz="0" />
</inertial>
</link>
<joint name="front_wheel_joint" type="continuous">
<axis xyz="0 0 1" />
<parent link="base_link" />
<child link="front_wheel" />
<origin rpy="-1.5708 0 0" xyz="0.1 0 -0.1" />
</joint>
<!--後輪-->
<link name="back_wheel">
<visual>
<geometry>
<cylinder length="0.05" radius="0.035" />
</geometry>
<material name="white" />
</visual>
<collision>
<geometry>
<cylinder length="0.05" radius="0.035" />
</geometry>
</collision>
<inertial>
<mass value="0.1" />
<inertia ixx="5.1458e-5" iyy="5.1458e-5" izz="6.125e-5" ixy="0" ixz="0" iyz="0" />
</inertial>
</link>
<joint name="back_wheel_joint" type="continuous">
<axis xyz="0 0 1" />
<parent link="base_link" />
<child link="back_wheel" />
<origin rpy="-1.5708 0 0" xyz="-0.1 0 -0.1" />
</joint>
<!--右車輪-->
<link name="right_wheel">
<visual>
<geometry>
<cylinder length="0.05" radius="0.035" />
</geometry>
<material name="gray">
<color rgba="0.2 0.2 0.2 1" />
</material>
</visual>
<collision>
<geometry>
<cylinder length="0.05" radius="0.035" />
</geometry>
</collision>
<inertial>
<mass value="0.1" />
<inertia ixx="5.1458e-5" iyy="5.1458e-5" izz="6.125e-5" ixy="0" ixz="0" iyz="0" />
</inertial>
</link>
<joint name="right_wheel_joint" type="continuous">
<axis xyz="0 0 1" />
<parent link="base_link" />
<child link="right_wheel" />
<origin rpy="-1.5708 0 0" xyz="0.0 -0.125 -.1" />
</joint>
<!--左車輪-->
<link name="left_wheel">
<visual>
<geometry>
<cylinder length="0.05" radius="0.035" />
</geometry>
<material name="gray" />
</visual>
<collision>
<geometry>
<cylinder length="0.05" radius="0.035" />
</geometry>
</collision>
<inertial>
<mass value="0.1" />
<inertia ixx="5.1458e-5" iyy="5.1458e-5" izz="6.125e-5" ixy="0" ixz="0" iyz="0" />
</inertial>
</link>
<joint name="left_wheel_joint" type="continuous">
<axis xyz="0 0 1" />
<parent link="base_link" />
<child link="left_wheel" />
<origin rpy="-1.5708 0 0" xyz="0.0 0.125 -.1" />
</joint>
<!--レーザースキャナー-->
<link name="hokuyo_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<box size="0.1 0.1 0.1" />
</geometry>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<box size="0.1 0.1 0.1" />
</geometry>
</collision>
<inertial>
<mass value="1e-5" />
<origin xyz="0 0 0" rpy="0 0 0" />
<inertia ixx="1e-6" ixy="0" ixz="0" iyy="1e-6" iyz="0" izz="1e-6" />
</inertial>
</link>
<joint name="hokuyo_joint" type="fixed">
<axis xyz="0 1 0" />
<origin xyz="0 0 0.2" rpy="0 0 0" />
<parent link="base_link" />
<child link="hokuyo_link" />
</joint>
<!--Gazeboプラグイン-->
<gazebo>
<!--differential_drive_controllerプラグイン-->
<plugin name="differential_drive_controller" filename="libgazebo_ros_diff_drive.so">
<leftJoint>left_wheel_joint</leftJoint>
<rightJoint>right_wheel_joint</rightJoint>
<robotBaseFrame>base_link</robotBaseFrame>
<wheelSeparation>0.25</wheelSeparation>
<wheelDiameter>0.07</wheelDiameter>
<updateRate>1</updateRate>
<publishWheelJointState>true</publishWheelJointState>
</plugin>
<!--joint_state_publisherプラグイン-->
<plugin name="joint_state_publisher" filename="libgazebo_ros_joint_state_publisher.so">
<jointName>front_wheel_joint, back_wheel_joint</jointName>
</plugin>
</gazebo>
<!--laserプラグイン-->
<gazebo reference="hokuyo_link">
<sensor type="ray" name="hokuyo">
<pose>0 0 0 0 0 0 </pose>
<visualize>false</visualize>
<update_rate>1</update_rate>
<ray>
<scan>
<horizontal>
<samples>720</samples>
<resolution>1</resolution>
<min_angle>-1.570796</min_angle>
<max_angle>1.570796</max_angle>
</horizontal>
</scan>
<range>
<min>0.10</min>
<max>30.0</max>
<resolution>0.01</resolution>
</range>
</ray>
<plugin name="laser" filename="libgazebo_ros_laser.so">
<topicName>/scan</topicName>
<frameName>hokuyo_link</frameName>
</plugin>
</sensor>
</gazebo>
</robot>
3. 動作確認
(1) Gazeboとrvizの起動。
$ roslaunch hello toio_style.launch
$ rviz
(2) rvizのDisplaysのAddボタンで「LaserScan」を追加し、Topicに「/scan」を指定。
(3) Gazeboの画面上端の円柱ボタンで、ロボットの前に円柱を配置。
rvizにレーザースキャナーでスキャンした情報が赤く表示されます。
この記事が気に入ったらサポートをしてみませんか?