一、核心思想
两个"link"间的相对位置变换,不是以"link"的几何中心为基准,而是以 两个“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 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 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>
以上是描述 “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,不用管。