第一步:在工作空间下建立功能包 我的工作空间是topic_pub
cd ./topic_pub/src/
catkin_create_pkg mbot_description urdf xacro
进入src目录后创建文件夹 urdf meshes launch config四个文件夹
cd ~/topic_pub/src/mbot_description
mkdir urdf
mkdir meshes
mkdir launch
mkdir config
第二步:在launch文件夹下创建launch并编辑
cd ~/catkin_ws/src/mbot_description/launch
touch display_mbot_base_urdf.launch
编辑内容如下:
<launch>
<!-- 加载的参数名字叫robot_description,具体内容是urdf相关模型的路径 -->
<param name="robot_description" textfile="$(find mbot_description)/urdf/mbot_base.urdf" />
<!-- 设置GUI参数,显示关节控制插件 -->
<param name="use_gui" value="true"/>
<!-- 运行joint_state_publisher节点,发布机器人的关节状态 -->
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
<!-- 运行robot_state_publisher节点,发布tf -->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
<!-- 运行rviz可视化界面,保存每次打开之后的相关插件,保存到config文件夹下面 -->
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find mbot_description)/config/mbot_urdf.rviz" required="true" />
</launch>
注意<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" />可删除但不建议。当然删除不会报下方错误的如:
第三步:在urdf文件夹下建立小车的模型b
cd ~/topic_pub/src/mbot_description/urdf
touch mbot_base.urdf
编辑如下:
<?xml version="1.0" ?>
<robot name="mbot">
<link name="base_link">
<visual>
<origin xyz=" 0 0 0" rpy="0 0 0" />
<geometry>
<cylinder length="0.16" radius="0.20"/>
</geometry>
<material name="yellow">
<color rgba="1 0.4 0 1"/>
</material>
</visual>
</link>
<joint name="left_wheel_joint" type="continuous">
<origin xyz="0 0.19 -0.05" rpy="0 0 0"/>
<parent link="base_link"/>
<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.06" length = "0.025"/>
</geometry>
<material name="white">
<color rgba="1 1 1 0.9"/>
</material>
</visual>
</link>
<joint name="right_wheel_joint" type="continuous">
<origin xyz="0 -0.19 -0.05" rpy="0 0 0"/>
<parent link="base_link"/>
<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.06" length = "0.025"/>
</geometry>
<material name="white">
<color rgba="1 1 1 0.9"/>
</material>
</visual>
</link>
<joint name="front_caster_joint" type="continuous">
<origin xyz="0.18 0 -0.095" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="front_caster_link"/>
<axis xyz="0 1 0"/>
</joint>
<link name="front_caster_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<sphere radius="0.015" />
</geometry>
<material name="black">
<color rgba="0 0 0 0.95"/>
</material>
</visual>
</link>
<joint name="back_caster_joint" type="continuous">
<origin xyz="-0.18 0 -0.095" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="back_caster_link"/>
<axis xyz="0 1 0"/>
</joint>
<link name="back_caster_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<sphere radius="0.015" />
</geometry>
<material name="black">
<color rgba="0 0 0 0.95"/>
</material>
</visual>
</link>
<link name="laser_link">
<visual>
<origin xyz=" 0 0 0 " rpy="0 0 0" />
<geometry>
<cylinder length="0.05" radius="0.05"/>
</geometry>
<material name="black"/>
</visual>
</link>
<joint name="laser_joint" type="fixed">
<origin xyz="0 0 0.105" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="laser_link"/>
</joint>
</robot>
<?xml version="1.0" ?>
<robot name="mbot">
<!--底盘信息-->
<link name="base_link">
<visual>
<origin xyz=" 0 0 0" rpy="0 0 0" />
<!-- link坐标位置,放在最中央 ,xyz单位是米,rpy单位是弧度-->
<geometry>
<cylinder length="0.16" radius="0.20"/>
</geometry>
<!-- 机器人的外观效果,使用圆柱体,高0.16,半径0.20 -->
<material name="yellow">
<color rgba="1 0.4 0 1"/>
</material>
<!-- 通过rgba来描述颜色,颜色命名为yellow,a为1是不透明-->
</visual>
<!--visual指的是一些物理属性的标签 -->
</link>
<!--左轮信息-->
<joint name="left_wheel_joint" type="continuous">
<!-- joint名字为left_wheel_joint,属性为continuous,即无限旋转-->
<origin xyz="0 0.19 -0.05" rpy="0 0 0"/>
<!-- 坐标位置,在base_link基础上,Y偏移0.19,z偏移-0.05-->
<parent link="base_link"/>
<child link="left_wheel_link"/>
<!-- 主关节:base_link,上面的圆柱形车体-->
<!-- 子关节:left_wheel_link,左轮-->
<!-- 主关节最后是一个,本代码是base_link-->
<axis xyz="0 1 0"/>
<!--left_wheel_link绕某一个轴做旋转,指定为Y轴 -->
</joint>
<!--joint用来连接两个link-->
<link name="left_wheel_link">
<visual>
<origin xyz="0 0 0" rpy="1.5707 0 0" />
<geometry>
<cylinder radius="0.06" length = "0.025"/>
</geometry>
<material name="white">
<color rgba="1 1 1 0.9"/>
</material>
</visual>
</link>
<!--右轮信息-->
<joint name="right_wheel_joint" type="continuous">
<origin xyz="0 -0.19 -0.05" rpy="0 0 0"/>
<!-- 坐标位置,在base_link基础上,Y偏移-0.19,z偏移-0.05,与左轮正好相反-->
<parent link="base_link"/>
<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.06" length = "0.025"/>
</geometry>
<material name="white">
<color rgba="1 1 1 0.9"/>
</material>
</visual>
</link>
<joint name="front_caster_joint" type="continuous">
<origin xyz="0.18 0 -0.095" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="front_caster_link"/>
<axis xyz="0 1 0"/>
</joint>
<!--前支撑轮-->
<link name="front_caster_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<sphere radius="0.015" />
<!--用圆形轮子代替 -->
</geometry>
<material name="black">
<color rgba="0 0 0 0.95"/>
</material>
</visual>
</link>
<!--后支撑轮-->
<joint name="back_caster_joint" type="continuous">
<origin xyz="-0.18 0 -0.095" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="back_caster_link"/>
<axis xyz="0 1 0"/>
</joint>
<!--后支撑轮-->
<link name="back_caster_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<sphere radius="0.015" />
</geometry>
<material name="black">
<color rgba="0 0 0 0.95"/>
</material>
</visual>
</link>
</robot>
inertial 惯性
geometry 几何形状
material 纹理
collision 碰撞属性
这里<origin xyz="0 0 1.0" rpy="0 0 0" />理解
基坐标在xyz(0 0 0)处,很明显xyz="0 0 1.0"就是在基坐标上方1处rpy="0 0 0" 就是不绕x轴不旋转,不绕y轴不旋转不绕z轴不旋转。(注意rpy 的值是弧度制,1.57表示转90)
可以通过这个链接试试弧度转换角度弧度在线转换器 角度和弧度/弧度与角度换算关系 ab126软件园
显然<origin xyz="0 0 1.0" rpy="1.57 0 0" />就是绕x轴转90°
查看模型
roslaunch mbot_description display_mbot_base_urdf.launch
如果报错则是因为launch删了
<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" />
加回来就行。
参考:基于 ROS 进行 URDF 机器人建模详细步骤【机器人仿真入门教程一】_可乐有点好喝的博客-CSDN博客_ros urdf
urdf 文件 joint origin标签 rpy变换理解!_Lucky Vivi的博客-CSDN博客_urdf的rpy