ROS rviz gazebo No transform from [left_leg] to [base_link]

本文介绍如何使用URDF在ROS环境中构建一个可移动的机器人模型,并通过在launch文件中添加joint_state_publisher和robot_state_publisher节点来确保机器人关节状态的正确发布。文中详细展示了launch文件的配置代码以及URDF模型的定义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://wiki.ros.org/urdf/Tutorials/Building%20a%20Movable%20Robot%20Model%20with%20URDF

 

当出现这种现象时,是因为joint_state_publisher没有启动。

在launch中添加joint_state_publisher 和robot_state_publisher会正常。

<launch>

  <!-- these are the arguments you can pass this launch file, for example paused:=true
<arg name="model" default="04-materials.urdf"/>
 -->
  <arg name="paused" default="false"/>
  <arg name="use_sim_time" default="true"/>
  <arg name="gui" default="true"/>
  <arg name="headless" default="false"/>
  <arg name="debug" default="false"/>
  

  <arg name="model" default="04-materials.urdf"/>


  <!-- We resume the logic in empty_world.launch, changing only the name of the world to be launched -->
  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <arg name="debug" value="$(arg debug)" />
    <arg name="gui" value="$(arg gui)" />
    <arg name="paused" value="$(arg paused)"/>
    <arg name="use_sim_time" value="$(arg use_sim_time)"/>
    <arg name="headless" value="$(arg headless)"/>
  </include>

  <param name="robot_description" command="$(find xacro)/xacro --inorder $(arg model)" />
 
  <!-- push robot_description 
   <param name="robot_description" command="$(find xacro)/xacro.py $(arg model)" />

  to factory and spawn robot in gazebo -->
  <node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model"
        args="-z 1.0 -unpause -urdf -model robot -param robot_description" respawn="false" output="screen" />

  <node pkg="robot_state_publisher" type="robot_state_publisher"  name="robot_state_publisher">
    <param name="publish_frequency" type="double" value="30.0" />
  </node>

   <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />

   <node name="my_controller_spawner" pkg="controller_manager" type="spawner" respawn="false"
	output="screen" args="my_controller_name"/>


</launch>
<?xml version="1.0"?>
<robot name="materials" xmlns:xacro="http://ros.org/wiki/xacro">
 
  <xacro:macro name="default_inertial" params="mass">
    <inertial>
      <mass value="${mass}" />
      <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0" />
    </inertial>
  </xacro:macro>
  <material name="blue">
    <color rgba="0 0 0.8 1"/>
  </material>

  <material name="white">
    <color rgba="1 1 1 1"/>
  </material>

  <link name="base_link">
    <visual>
      <geometry>
        <cylinder length="0.1" radius="0.6"/>
      </geometry>
      <material name="blue"/>
    </visual>

        <collision>
      <geometry>
        <cylinder  length="0.1" radius="0.6"/>
      </geometry>
    </collision>
    <xacro:default_inertial mass="10"/>

  </link>

  <link name="right_leg">
    <visual>
      <geometry>
       <cylinder length="0.05" radius="0.2"/>
      </geometry>
      <origin rpy="1.5707963267948966 0 0" xyz="0 -0 0"/>
      <material name="white"/>
    </visual>

            <collision>
      <geometry>
        <cylinder length="0.05" radius="0.2"/>
      </geometry>
    </collision>
    <xacro:default_inertial mass="10"/>

  </link>

  <joint name="base_to_right_leg" type="continuous">
    <parent link="base_link"/>
    <child link="right_leg"/>
<axis xyz="0 0 1" />
    <origin rpy="0 0 0" xyz="0 -0.6 0"/>

  </joint>

  <link name="left_leg">
    <visual>
      <geometry>
        <cylinder length="0.05" radius="0.2"/>
      </geometry>
      <origin rpy="1.5707963267948966 0 0" xyz="0 0. 0"/>
      <material name="white"/>
     
    </visual>
      <collision>
      <geometry>
        <cylinder length="0.05" radius="0.2"/>
      </geometry>
    </collision>
    <xacro:default_inertial mass="10"/>
  </link>

  <gazebo reference="right_leg">
    <material>Gazebo/Orange</material>
  </gazebo>

  <joint name="base_to_left_leg" type="continuous">
    <parent link="base_link"/>
    <child link="left_leg"/>
<axis xyz="0 0 1" />
    <origin rpy="0 0 0" xyz="0 0.6 0"/>

  </joint>

 <!-- stereo camera -->
    <gazebo reference="base_link">  
      <sensor type="multicamera" name="stereocamera">
        <always_on>true</always_on>
        <update_rate>10</update_rate>
        <visualize>false</visualize>
        <camera name="left">
          <pose>0 0 0 0 0 0</pose>
          <horizontal_fov>1.047</horizontal_fov>
          <image>
            <width>320</width>
            <height>240</height>
          </image>
          <clip>
            <near>0.1</near>
            <far>100</far>
          </clip>
        </camera>
        <camera name="right">
          <pose>0 -0.07 0 0 0 0</pose>
          <horizontal_fov>1.047</horizontal_fov>
          <image>
            <width>320</width>
            <height>240</height>
          </image>
          <clip>
            <near>0.1</near>
            <far>100</far>
          </clip>
        </camera> 


       
        <plugin name="stereo_camera_controller" filename="libgazebo_ros_multicamera.so">
          <cameraName>stereocamera</cameraName>
          <alwaysOn>true</alwaysOn>
          <updateRate>10</updateRate>
          <cameraName>stereocamera</cameraName>
          <imageTopicName>image_raw</imageTopicName>
          <cameraInfoTopicName>camera_info</cameraInfoTopicName>
          <frameName>camera_link_optical</frameName>
          <baseline>0.07</baseline>
          <distortion_k1>0.0</distortion_k1>
          <distortion_k2>0.0</distortion_k2>
          <distortion_k3>0.0</distortion_k3>
          <distortion_t1>0.0</distortion_t1>
          <distortion_t2>0.0</distortion_t2>
        </plugin>
      </sensor>
    </gazebo>
 

  <transmission name="base_to_left_leg_joint_trans">
    <type>transmission_interface/SimpleTransmission</type>
    <joint name="base_to_left_legjoint"/>
    <actuator name="base_to_left_leg_joint_motor">
      <hardwareInterface>PositionJointInterface</hardwareInterface>
      <mechanicalReduction>1</mechanicalReduction>
    </actuator>
  </transmission>


  <transmission name="base_to_right_leg_joint_trans">
    <type>transmission_interface/SimpleTransmission</type>
    <joint name="base_to_right_legjoint"/>
    <actuator name="base_to_right_leg_joint_motor">
      <hardwareInterface>PositionJointInterface</hardwareInterface>
      <mechanicalReduction>1</mechanicalReduction>
    </actuator>
  </transmission>

 <gazebo>
    <plugin filename="libgazebo_ros_diff_drive.so" name="differential_drive_controller_front">
      <rosDebugLevel>Debug</rosDebugLevel>
      <publishWheelTF>True</publishWheelTF>
      <publishTf>1</publishTf>
      <publishWheelJointState>true</publishWheelJointState>
      <alwaysOn>true</alwaysOn>
      <updateRate>100.0</updateRate>
      <leftJoint>base_to_left_leg</leftJoint>
      <rightJoint>base_to_right_leg</rightJoint>
      <wheelSeparation>0.3</wheelSeparation>
      <wheelDiameter>0.08</wheelDiameter>
      <broadcastTF>1</broadcastTF>
      <wheelTorque>30</wheelTorque>
      <wheelAcceleration>1.8</wheelAcceleration>
      <commandTopic>cmd_vel</commandTopic>
      <odometryFrame>odom</odometryFrame>
      <odometryTopic>odom</odometryTopic>
      <robotBaseFrame>base_link</robotBaseFrame>
    </plugin>
  </gazebo>
<gazebo>
    <plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
      <robotNamespace>/</robotNamespace>
    </plugin>
  </gazebo>
</robot>

正常了。

### 解决ROS中`tf`无变换问题 当遇到 `no transform from left_wheel_link to base_link` 的错误提示时,这通常意味着在TF树中缺少从 `left_wheel_link` 到 `base_link` 的转换关系。为了建立正确的坐标系转换,在ROS环境中需确保所有必要的节点已启动并配置正确。 #### 启动关节状态控制器 确保已经按照文档说明启动了联合状态控制器[^1]: ```xml <node name="joint_state_controller" pkg="controller_manager" type="spawner" args="joint_state_controller"/> ``` 此操作会发布机器人的关节位置信息到 `/joint_states` 主题上,这对于构建完整的机器人模型至关重要。 #### 配置URDF文件中的静态变换发布器 对于固定连接的部分(例如轮子链接),应通过 URDF 文件定义这些部件之间的相对位姿,并利用 `robot_state_publisher` 发布对应的 TF 变换消息。确认 URDF 中存在如下类似的描述来表示 `left_wheel_link` 和 `base_link` 间的关联: ```xml <link name="base_link"> <!-- Base link properties --> </link> <link name="left_wheel_link"> <!-- Wheel link properties --> </link> <joint name="left_wheel_joint" type="fixed"> <parent link="base_link"/> <child link="left_wheel_link"/> <origin xyz="..." rpy="..."/> <!-- Specify the position and orientation relative to parent --> </joint> ``` 之后,在启动脚本里加入 `robot_state_publisher` 节点以广播基于上述几何结构计算得出的静态变换数据: ```bash rosrun robot_state_publisher robot_state_publisher ``` #### 使用`static_transform_publisher`手动添加缺失的变换 如果仍然无法解决问题,则可以尝试直接使用 `tf2_ros::StaticTransformBroadcaster` 或命令行工具 `static_transform_publisher` 来显式指定所需的转换关系: ```bash rosrun tf static_transform_publisher x y z yaw pitch roll frame_id child_frame_id period_in_ms ``` 具体参数替换为实际数值即可创建临时性的解决方案直到找到根本原因所在。 #### 检查其他可能的原因 有时该类问题是由于时间同步问题引起的;因此建议核查各个传感器的时间戳设置以及网络延迟情况。另外也要注意检查是否有多个不同版本的 `tf` 库共存而导致冲突的情况发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值