iRobotEducation/create3_docs

ir_intensity /tf_static transforms do not match mechanical drawing or URDF

slowrunner opened this issue · 1 comments

Discussed in #499

Originally posted by slowrunner January 4, 2024

How are you connecting to your Create 3?

Wi-Fi (ROS 2)

Computer(s) Model(s) and Operating System(s)

No response

Which version of ROS 2 is installed on your computer?

Humble

Which firmware version is installed on your robot?

H.2.3

Which RMW is your robot running?

FastRTPS

Does your robot have an assigned namespace? If so, please share.

No response

Is the robot connected to a network? If so, what is the network type?

Yes: 2.4GHz Home WiFi

Are there multiple Create 3 robots connected to your network?

No

Is multicast enabled?

Yes

What is the Adapter Board's USB/BLE Toggle currently switched to?

Bluetooth (default)

Describe your question.

Where is the URDF the Create3 is actually using to broadcast tf2 transforms?

For the right_wheel, the Create3 broadcasts:

$ ros2 run tf2_ros tf2_echo base_link right_wheel

At time 0.0
- Translation: [0.000, -0.116, 0.036]
- Rotation: in Quaternion [-0.707, 0.000, 0.000, 0.707]
- Rotation: in RPY (radian) [-1.571, 0.000, 0.000]
- Rotation: in RPY (degree) [-90.000, 0.000, 0.000]
- Matrix:
  1.000 -0.000  0.000  0.000
  0.000 -0.000  1.000 -0.116
 -0.000 -1.000 -0.000  0.036
  0.000  0.000  0.000  1.000

Which would be 232mm or 233 if the full precision value is 0.1615. This would seem to match the URDF of create3_sim (distance_between_wheels = 23.3*cm2m divided by 2), and the roughly 233-234mm measurement of my Create3, but not the Create3 docs mechanical drawing which states 235.0 mm.

! BUT the Create3 is also broadcasting the base_link to ir_intensity_right sensor as:

$ ros2 run tf2_ros tf2_echo base_link ir_intensity_right
At time 0.0
- Translation: [0.081, -0.155, 0.052]
- Rotation: in Quaternion [0.000, 0.000, -0.519, 0.855]
- Rotation: in RPY (radian) [0.000, 0.000, -1.092]
- Rotation: in RPY (degree) [0.000, 0.000, -62.567]  <<---
- Matrix:
  0.461  0.888  0.000  0.081
 -0.888  0.461 -0.000 -0.155
 -0.000  0.000  1.000  0.052
  0.000  0.000  0.000  1.000

which I believe says the "ir_intensity_right" sensor is pointed -62.6 degrees CW from the Create3 heading

This value does not match either the mechanical drawing value of -65.3 degrees, nor the create3_sim URDF value of -75 degrees (rpy=[0 0 -1.309] radians).

I understand the create3_sim URDF might have been simplified or perhaps pre-dated the physical robot, but it is the only URDF I have found.

Additionally - front_center_left tf2 transform is broadcast as 2.636 degrees CCW from robot heading

$ ros2 run tf2_ros tf2_echo base_link ir_intensity_front_center_left

At time 0.0
- Translation: [0.175, 0.008, 0.052]
- Rotation: in Quaternion [0.000, 0.000, 0.023, 1.000]
- Rotation: in RPY (radian) [0.000, -0.000, 0.046]
- Rotation: in RPY (degree) [0.000, -0.000, 2.636]
- Matrix:
  0.999 -0.046  0.000  0.175
  0.046  0.999  0.000  0.008
  0.000  0.000  1.000  0.052
  0.000  0.000  0.000  1.000

UPDATE all sensors summary:

  • IR Intensity Sensor Orientation Angle (yaw from forward 0 deg)
   Sensor              tf2      |Mech Drawing|   URDF
- side_left:           57.3 deg |  65.3  deg |  75.0 deg
- left:                36.0 deg |  38.0  deg |  50.0 deg
- front_left:          19.1 deg |  20.0  deg |  25.0 deg 
- front_center_left:    2.6 deg |   3.0  deg |   0.0 deg (defaulted)
- front_center_right: -13.8 deg | -14.25 deg | -25.0 deg 
- front_right:        -32.3 deg | -34.0  deg | -50.0 deg
_ right:              -62.6 deg | -65.3  deg | -75.0 deg


$ ros2 run tf2_ros tf2_echo base_link ir_intensity_side_left


- Translation: [0.095, 0.147, 0.052]
- Rotation: in Quaternion [0.000, 0.000, 0.479, 0.878]
- Rotation: in RPY (radian) [0.000, -0.000, 1.000]
- Rotation: in RPY (degree) [0.000, -0.000, 57.296]

$ ros2 run tf2_ros tf2_echo base_link ir_intensity_left

- Translation: [0.141, 0.103, 0.052]
- Rotation: in Quaternion [0.000, 0.000, 0.309, 0.951]
- Rotation: in RPY (radian) [0.000, -0.000, 0.629]
- Rotation: in RPY (degree) [0.000, -0.000, 36.039]

$ ros2 run tf2_ros tf2_echo base_link ir_intensity_front_left

- Translation: [0.165, 0.057, 0.052]
- Rotation: in Quaternion [0.000, 0.000, 0.166, 0.986]
- Rotation: in RPY (radian) [0.000, -0.000, 0.333]
- Rotation: in RPY (degree) [0.000, -0.000, 19.079]


$ ros2 run tf2_ros tf2_echo base_link ir_intensity_front_center_left

- Translation: [0.175, 0.008, 0.052]
- Rotation: in Quaternion [0.000, 0.000, 0.023, 1.000]
- Rotation: in RPY (radian) [0.000, -0.000, 0.046]
- Rotation: in RPY (degree) [0.000, -0.000, 2.636]


$ ros2 run tf2_ros tf2_echo base_link ir_intensity_front_center_right

- Translation: [0.170, -0.042, 0.052]
- Rotation: in Quaternion [0.000, 0.000, -0.120, 0.993]
- Rotation: in RPY (radian) [0.000, 0.000, -0.240]
- Rotation: in RPY (degree) [0.000, 0.000, -13.751]


$ ros2 run tf2_ros tf2_echo base_link ir_intensity_front_right

- Translation: [0.148, -0.094, 0.052]
- Rotation: in Quaternion [0.000, 0.000, -0.278, 0.961]
- Rotation: in RPY (radian) [0.000, 0.000, -0.564]
- Rotation: in RPY (degree) [0.000, 0.000, -32.315]


$ ros2 run tf2_ros tf2_echo base_link ir_intensity_right

- Translation: [0.081, -0.155, 0.052]
- Rotation: in Quaternion [0.000, 0.000, -0.519, 0.855]
- Rotation: in RPY (radian) [0.000, 0.000, -1.092]
- Rotation: in RPY (degree) [0.000, 0.000, -62.567]

The turtlebot4 URDF references
<xacro:include filename="$(find irobot_create_description)/urdf/create3.urdf.xacro" />

This is the urdf of the create3_sim repository, that you already found (here https://github.com/iRobotEducation/create3_sim/tree/main/irobot_create_common/irobot_create_description/urdf)

Where is the URDF the Create3 is actually using to broadcast tf2 transforms?

The create 3 robot internally doesn't use an urdf to broadcast the tf2 transforms.
So the only urdf available is the one from the sim repository.

I'll check why there's a difference in the values among those different sources (sim-urdf, robot, mechanical drawings).