Setting up the ROS Transforms

From wikidb
Jump to: navigation, search

References

Base_link to Laser

 cat tf_laser.launch
 <launch>
   <node pkg="tf" type="static_transform_publisher" name="base_to_laser" 
         args="0.202 0 0.111 0 0 0 1 base_link neato_laser 100" />
 </launch>

See floor_hugger.urdf URDF Representation of Floor Hugger

 base_link => extended_base => Laser_layer => laser_sensor
 x = 0.004 + 0.000 + 0.192 + 0.006 = 0.202
 z = 0.021 + 0.018 + 0.011 + 0.061 = 0.111

This neato_laser reference needs to be the same as the reference in costmap_common_params.yaml. See Navigation Tuning#laser_link.

The static_transform_publisher arguments are defined at ROS TF. Offset is in linear meters and angular quaternions.

 static_transform_publisher x y z qx qy qz qw frame_id child_frame_id  period_in_ms

Odom to Base_link

TBD: Where is this specified? In Odometry?

Map to Odom

 cat tf_map.launch
 <launch>
   <node pkg="tf" type="static_transform_publisher" name="odom_to_map" 
         args="0 0 0.045 0 0 0 1.0 map odom 100" />
 </launch>

Wheel radius is 45 mm. Calibrate_Phidgets_Odometry#From_Specs

Navigation Stack Test

Setup

Terminal 1

 roscore

Terminal 2

 roslaunch floor_hugger nav.launch

Display Tree

Terminal 3

 rosrun tf view_frames

 evince frames.pdf

TF Zoom 170415.png

Exploration Tools

monitor

Monitor the transforms between frames. See complete tree below. See URDF Representation of Floor Hugger for the robot transform definitions.

 rosrun tf tf_monitor
     All Broadcasters:
     Node: unknown_publisher 96.979 Hz, Average Delay: -0.260119 Max Delay: 0.102549
 
     RESULTS: for all Frames
 
     Frames:
     Frame: base published by unknown_publisher Average Delay: -0.474372 Max Delay: 0
     Frame: base_link published by unknown_publisher Average Delay: 0.000405951 Max Delay: 0.00156847
     Frame: battery_layer published by unknown_publisher Average Delay: -0.474377 Max Delay: 0
     Frame: camera_layer published by unknown_publisher Average Delay: -0.474374 Max Delay: 0
     Frame: compute_layer published by unknown_publisher Average Delay: -0.474374 Max Delay: 0
     Frame: computer published by unknown_publisher Average Delay: -0.474373 Max Delay: 0
     Frame: control_layer published by unknown_publisher Average Delay: -0.474377 Max Delay: 0
     Frame: extended_base published by unknown_publisher Average Delay: -0.474378 Max Delay: 0
     Frame: laser_layer published by unknown_publisher Average Delay: -0.474373 Max Delay: 0
     Frame: laser_sensor published by unknown_publisher Average Delay: -0.474372 Max Delay: 0
     Frame: left_wheel published by unknown_publisher Average Delay: -0.474379 Max Delay: 0
     Frame: neato_laser published by unknown_publisher Average Delay: -0.0996256 Max Delay: 0
     Frame: odom published by unknown_publisher Average Delay: -0.0327469 Max Delay: 0.104149
     Frame: right_wheel published by unknown_publisher Average Delay: -0.474377 Max Delay: 0
     Frame: usb_hub published by unknown_publisher Average Delay: -0.474375 Max Delay: 0
     Frame: webcam_sensor published by unknown_publisher Average Delay: -0.474375 Max Delay: 0

map to odom transform

See tf_map.launch script above to confirm the z value below

 rosrun tf tf_echo map odom
     At time 1492259778.541
     - Translation: [0.000, 0.000, 0.045]
     - Rotation: in Quaternion [0.000, 0.000, 0.000, 1.000]
                 in RPY (radian) [0.000, -0.000, 0.000]
                 in RPY (degree) [0.000, -0.000, 0.000]

odom to base_link

The odom to base_link transform in all zeros at startup.

 rosrun tf tf_echo odom base_link
     At time 1492260129.428
     - Translation: [0.000, 0.000, 0.000]
     - Rotation: in Quaternion [0.000, 0.000, 0.000, 1.000]
                 in RPY (radian) [0.000, -0.000, 0.000]
                 in RPY (degree) [0.000, -0.000, 0.000]

odom to base_link after move

The odom to base_link transform changes after the robot moves.

 rostopic pub -1 /cmd_vel geometry_msgs/Twist '[5,0,0]' '[0,0,0]'

 rosrun tf tf_echo odom base_link
     At time 1492261296.158
     - Translation: [0.365, -0.062, 0.000]
     - Rotation: in Quaternion [0.000, 0.000, -0.066, 0.998]
                 in RPY (radian) [0.000, 0.000, -0.132]
                 in RPY (degree) [0.000, 0.000, -7.546]

It reflects the same values as odometry.

 rostopic echo odom
     ...
     pose: 
       pose: 
         position: 
           x: 0.364562615458
           y: -0.0618304999521
           z: 0.0
         orientation: 
           x: 0.0
           y: 0.0
           z: -0.0658021751817
           w: 0.997832688251
     ...

base_link to neato_laser

See tf_laser.launch for how these were derived.

 rosrun tf tf_echo base_link neato_laser
     At time 1492260448.546
     - Translation: [0.202, 0.000, 0.111]
     - Rotation: in Quaternion [0.000, 0.000, 0.000, 1.000]
                 in RPY (radian) [0.000, -0.000, 0.000]
                 in RPY (degree) [0.000, -0.000, 0.000]

base_link to laser_sensor

This is derived from the URDF and is the same as the base_link to the neato_laser. So I wonder whether the tf_laser.launch script is redundant. They fortunately give the same results.

 rosrun tf tf_echo base_link laser_sensor
     At time 1492260747.860
     - Translation: [0.202, 0.000, 0.111]
     - Rotation: in Quaternion [0.000, 0.000, 0.000, 1.000]
                 in RPY (radian) [0.000, -0.000, 0.000]
                 in RPY (degree) [0.000, -0.000, 0.000]

Display Complete Tree

See URDF Representation of Floor Hugger. It is pulled in from the rviz_mapping.launch script. Notice that its transforms are published by the robot_state_publisher. See robot_state_publisher launch below and the floor_hugger.urdf parameter definition below.

 cat rviz_mapping.launch
     <launch>
         <arg name="gui" default="False" />
         <param name="robot_description" textfile="$(find floor_hugger)/model/floor_hugger.urdf" />
         <param name="use_gui" value="$(arg gui)"/>
         <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
         <node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
         <node name="rviz" pkg="rviz" type="rviz" args="-d $(find floor_hugger)/config/active_mapping.rviz" required="true" />
     </launch>

Frames.pdf

Initial Test

Terminal 1

 roscore

Terminal 2

Set sim time to false in case it was set to true during gmapping.

 rosparam set use_sim_time false
 roslaunch floor_hugger odometry.launch

Terminal 3

 rosrun xv_11_laser_driver neato_laser_publisher _port:=/dev/ttyUSB0 _firmware_version:=2

Terminal 4

 roslaunch floor_hugger tf_laser.launch

Terminal 5

 roslaunch floor_hugger tf_map.launch

Terminal 6

 rosrun tf view_frames
 
 evince frames.pdf

Result is a file named frames.pdf.

TF Tree.png