ROS小白学习历程(urdf)--urdf坐标变换的核心

一、核心思想

两个"link"间的相对位置变换,不是以"link"的几何中心为基准,而是以 两个“link”对应的"joint"的位置为准

二、具体解析


        
            
            
                
            
            
                
            
        
    

    
                
        
        
    
    
 
        
            
            
                
            
            
                
            
        
    

以上是描述 “link” 和 “joint” 的代码块,下面做具体分析。

1、在定义 link 前先定义joint

因为 link 的相对位置是根据 joint 的位置来确定的,例如 “left_motor” link 。

<link name="left_motor">
        <visual>
            <origin xyz="0 0 0" rpy="1.5707 0 0" />

link 里的 origin 描述了该 link 的几何中心相对于该link的 joint 的位置变化

<joint name="base_left_motor_joint" type="fixed">
        <origin xyz="-0.055 0.075 0" rpy="0 0 0" />        
        <parent link="base_link"/>
        <child link="left_motor" />
    </joint>

joint 里的 origin** 描述了本 joint 相对于其 父link 的 joint 的位置变化

2、base_link 的 joint

<link name="base_link">
        <visual>
            <origin xyz=" 0 0 0.05" rpy="0 0 0" />
            <geometry>
                <box size="0.26 0.26 0.1"/>
            </geometry>
            <material name="yellow">
                <color rgba="1 0.4 0 1"/>
            </material>
        </visual>
    </link>

前面提到,应当先定义 joint 再定义 link ,base_link 较为特殊,他的 joint 默认为世界中心。所以,如果在描述 base_link 的位置时,如果不加任何偏移, 即 xyz = 0,那么你会看到 base_link 会一半在上,一半在下。

三、示例代码

<?xml version="1.0" ?>
<robot name="krobot_chassis">

    <link name="base_link">
        <visual>
            <origin xyz=" 0 0 0.05" rpy="0 0 0" />
            <geometry>
                <box size="0.26 0.26 0.1"/>
            </geometry>
            <material name="yellow">
                <color rgba="1 0.4 0 1"/>
            </material>
        </visual>
    </link>
	
    <joint name="base_left_motor_joint" type="fixed">
        <origin xyz="-0.055 0.075 0" rpy="0 0 0" />        
        <parent link="base_link"/>
        <child link="left_motor" />
    </joint>
	<!--左前电机link -->
    <link name="left_motor">
        <visual>
            <origin xyz="0 0 0" rpy="1.5707 0 0" />
            <geometry>
                <cylinder radius="0.02" length = "0.08"/>
            </geometry>
            <material name="gray">
                <color rgba="0.75 0.75 0.75 1"/>
            </material>
        </visual>
    </link>

    <joint name="left_wheel_joint" type="continuous">
        <origin xyz="0 0.0485 0" rpy="0 0 0"/>
        <parent link="left_motor"/>
        <child link="left_wheel_link"/>
        <axis xyz="0 1 0"/>
    </joint>
	<!--左驱动轮 -->
    <link name="left_wheel_link">
        <visual>
            <origin xyz="0 0 0" rpy="1.5707 0 0" />
            <geometry>
                <cylinder radius="0.033" length = "0.017"/>
            </geometry>
            <material name="white">
                <color rgba="1 1 1 0.9"/>
            </material>
        </visual>
    </link>

    <joint name="base_right_motor_joint" type="fixed">
        <origin xyz="-0.055 -0.075 0" rpy="0 0 0" />        
        <parent link="base_link"/>
        <child link="right_motor" />
    </joint>
	
	<!--右侧电机link -->
    <link name="right_motor">
        <visual>
            <origin xyz="0 0 0" rpy="1.5707 0 0" />
            <geometry>
                <cylinder radius="0.02" length = "0.08" />
            </geometry>
            <material name="gray">
                <color rgba="0.75 0.75 0.75 1"/>
            </material>
        </visual>
    </link>

    <joint name="right_wheel_joint" type="continuous">
        <origin xyz="0 -0.0485 0" rpy="0 0 0"/>
        <parent link="right_motor"/>
        <child link="right_wheel_link"/>
        <axis xyz="0 1 0"/>
    </joint>

   <!--右驱动轮 -->
    <link name="right_wheel_link">
        <visual>
            <origin xyz="0 0 0" rpy="1.5707 0 0" />
            <geometry>
                <cylinder radius="0.033" length = "0.017"/>
            </geometry>
            <material name="white">
                <color rgba="1 1 1 0.9"/>
            </material>
        </visual>
    </link>

    <joint name="front_caster_joint" type="fixed">
        <origin xyz="0.1135 0 -0.0165" rpy="0 0 0"/>
        <parent link="base_link"/>
        <child link="front_caster_link"/>
    </joint>
	<!--从动轮 -->
    <link name="front_caster_link">
        <visual>
            <origin xyz="0 0 0" rpy="1.5707 0 0"/>
            <geometry>
                <sphere radius="0.0165" />
            </geometry>
            <material name="black">
                <color rgba="0 0 0 0.95"/>
            </material>
        </visual>
    </link>



<joint name="laser_cylinder_joint" type="fixed">
        <origin xyz="0.1 -0.1 0.1" rpy="0 0 0"/>
        <parent link="base_link"/>  
        <child link="laser_cylinder_link"/>
</joint>


	<激光雷达支架>
    <link name = "laser_cylinder_link">
    <visual>
            <origin xyz="0 0 0.05" rpy="0 0 0"/>
            <geometry>
                <cylinder radius="0.01" length = "0.1"/>
            </geometry>
            <material name="black">
                <color rgba="0 0 0 0.95"/>
            </material>
        </visual>
    </link>

    <joint name="laser_joint" type="fixed">
        <origin xyz="0 0 0.1" rpy="0 0 0"/>
        <parent link="laser_cylinder_link"/>  
        <child link="laser_link"/>
    </joint>


	<!--激光雷达底座 -->
    <link name = "laser_link">
    <visual>
            <origin xyz="0 0 0.01" rpy="0 0 0"/>
            <geometry>
                <cylinder radius="0.02" length = "0.02"/>
            </geometry>
            <material name="black">
                <color rgba="0 0 0 0.95"/>
            </material>
        </visual>
</link>




</robot>

创建功能包

catkin_creat_pkg krobot_description urdf xacro

将以上代码复制到 urdf文件中

运行

check_urdf <文件名>

可检查 urdf 是否正确

运行

urdf_to_graphs <文件名>

可生成pdf文件,看到整体结构图

创建launch文件

<launch>
    <param name="robot_description" textfile="$(find krobot_description)/urdf/krobot_chassis.urdf"/>

    <!--设置 gui 参数,显示关节控制插件 -->
    <param name = "use_gui" value = "true"/>

    <!-- 发布机器人关节状态 -->
    <node name = "joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher"/>


    <!--发布tf -->
    <node name = "robot_state_publisher" pkg="robot_state_publisher" type="state_publisher"/>

    <!--启动rviz 可视化界面-->
    <node name = "rviz" pkg="rviz" type="rviz" args="-d $(find krobot_description)/config/krobot_urdf.rviz" required="true" />
</launch>

注意将上面的路径更改为自己的路径。

roslaunch 命令启动

报错

[ERROR] [1586010939.143903996]: Robot semantic description not found. Did you forget to define or remap '/robot_description_semantic'?

提示你没有启动moveit,不用管。

你可能感兴趣的:(ros学习历程)