- 文章目录
- 教程描述
- 准备工作 2.1 创建工作空间 2.2 创建ROS硬件描述包
- 小车模型示意图
- 创建urdf描述文件
- 创建launch文件
- rviz模型展示 6.1 添加Displays 6.2 修改参数
- 可能遇到的问题 7.1 No transform from [base_link] to [map]. 参考文献:
2. 准备工作
2.1 创建工作空间 创建ROS工作空间,命名为SmartCar,并在该工作空间中创建src文件
mkdir -p /SmartCar/src
初始化工作空间
cd /SmartCar
catkin_init_workspace
2.2 创建ROS硬件描述包
cd /src
roscreate-pkg smartcar_description urdf
3. 小车模型示意图
小车的车体主要由以下两部分构成:25cm x 16cm x 5cm的长方体作为小车的车体,直径5cm、高2cm的圆柱作为小车的轮子,四个轮子尺寸一样,只是安装位置不同。
4. 创建urdf描述文件
在smartcar_description文件夹下创建urdf文件夹,并创建智能车的描述文件smartcar.urdf,写入下述代码:
<?xml version="1.0"?>
<robot name="smartcar">
<link name="base_link">
<visual>
<geometry>
<box size="0.25 .16 .05"/>
</geometry>
<origin rpy="0 0 1.57075" xyz="0 0 0"/>
<material name="blue">
<color rgba="0 .5 .8 1"/>
</material>
</visual>
</link>
<link name="right_front_wheel">
<visual>
<geometry>
<cylinder length=".02" radius="0.025"/>
</geometry>
<material name="black">
<color rgba="0 0 0 1"/>
</material>
</visual>
</link>
<joint name="right_front_wheel_joint" type="continuous">
<axis xyz="0 0 1"/>
<parent link="base_link"/>
<child link="right_front_wheel"/>
<origin rpy="0 1.57075 0" xyz="0.08 0.1 -0.03"/>
<limit effort="100" velocity="100"/>
<joint_properties damping="0.0" friction="0.0"/>
</joint>
<link name="right_back_wheel">
<visual>
<geometry>
<cylinder length=".02" radius="0.025"/>
</geometry>
<material name="black">
<color rgba="0 0 0 1"/>
</material>
</visual>
</link>
<joint name="right_back_wheel_joint" type="continuous">
<axis xyz="0 0 1"/>
<parent link="base_link"/>
<child link="right_back_wheel"/>
<origin rpy="0 1.57075 0" xyz="0.08 -0.1 -0.03"/>
<limit effort="100" velocity="100"/>
<joint_properties damping="0.0" friction="0.0"/>
</joint>
<link name="left_front_wheel">
<visual>
<geometry>
<cylinder length=".02" radius="0.025"/>
</geometry>
<material name="black">
<color rgba="0 0 0 1"/>
</material>
</visual>
</link>
<joint name="left_front_wheel_joint" type="continuous">
<axis xyz="0 0 1"/>
<parent link="base_link"/>
<child link="left_front_wheel"/>
<origin rpy="0 1.57075 0" xyz="-0.08 0.1 -0.03"/>
<limit effort="100" velocity="100"/>
<joint_properties damping="0.0" friction="0.0"/>
</joint>
<link name="left_back_wheel">
<visual>
<geometry>
<cylinder length=".02" radius="0.025"/>
</geometry>
<material name="black">
<color rgba="0 0 0 1"/>
</material>
</visual>
</link>
<joint name="left_back_wheel_joint" type="continuous">
<axis xyz="0 0 1"/>
<parent link="base_link"/>
<child link="left_back_wheel"/>
<origin rpy="0 1.57075 0" xyz="-0.08 -0.1 -0.03"/>
<limit effort="100" velocity="100"/>
<joint_properties damping="0.0" friction="0.0"/>
</joint>
<link name="head">
<visual>
<geometry>
<box size=".02 .03 .03"/>
</geometry>
<material name="white">
<color rgba="1 1 1 1"/>
</material>
</visual>
</link>
<joint name="tobox" type="fixed">
<parent link="base_link"/>
<child link="head"/>
<origin xyz="0 0.08 0.025"/>
</joint>
</robot>
.urdf文件主要有两部分构成:和,两者的关系如下图所示。
其中…主要描述模型硬件结构的属性信息,里面对轮子的形状、颜色、质量、惯性等信息进行了语言描述;…可以理解为两个…之间的连接间,如图中蓝色框所示,主要描述两个…之间的位置等固定连接信息。 文中的结构可以简化为下面的格式,定义一个robot标签,在标签中定义base_link和right_front_wheel两个标签,两个标签的后面跟着描述base_link和right_front_wheel关系的joint
<?xml version="1.0"?>
<robot name="smartcar">
<link name="base_link">
...
</link>
<link name="right_front_wheel">
...
</link>
<joint name="left_front_wheel_joint" type="continuous">
...
</joint>
</robot>
在link中定义了小车的外观,以base_link为例。
<link name="base_link">
<visual> <!--视觉信息-->
<geometry> <!--几何形状信息-->
<box size="0.25 .16 .05"/> <!--形状为矩形盒子(还有其他可选形状,如圆、圆柱等),大小为"0.25 0.16 0.05"-->
</geometry>
<origin rpy="0 0 1.57075" xyz="0 0 0"/> <!--rpy代表欧拉角,绕着z轴转动90度;xyz代表在xyz三轴上的位移-->
<material name="blue"> <!--材料信息-->
<color rgba="0 .5 .8 1"/> <!--定义颜色信息-->
</material>
</visual>
</link>
在每个信息标签中除了上述的类型外还有其他的信息可以增加,需要的请自行查阅。 在joint中定义两个link的连接信息,以right_front_wheel_joint为例。
<joint name="right_front_wheel_joint" type="continuous">
<axis xyz="0 0 1"/>
<parent link="base_link"/>
<child link="right_front_wheel"/> <!--将子link(right_front_wheel)连接到父link(base_link)上-->
<origin rpy="0 1.57075 0" xyz="0.08 0.1 -0.03"/> <!--连接位置-->
<limit effort="100" velocity="100"/>
<joint_properties damping="0.0" friction="0.0"/>
</joint>
对上述信息不太清楚的朋友可以再查阅相关资料,或者自己动手修改参数试试便知。
5. 创建launch文件
在/smartcar_description文件夹下建立launch文件夹,并创建智能车的launch文件 base.urdf.rviz.launch,描述代码如下:
<launch>
<arg name="model" />
<arg name="gui" default="False" />
<param name="robot_description" textfile="$(find smartcar_description)/urdf/smartcar.urdf" />
<param name="use_gui" value="$(arg gui)"/>
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" ></node>
<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find urdf_tutorial)/urdf.vcg" />
</launch>
在旧版本ROS中使用该语句启动rviz
6. rviz模型展示
在工作空间/SmartCar路径下,先source下工作空间的路径
source devel/setup.bash
然后运行.launch文件
roslaunch servo_description base.urdf.rviz.launch
这时候你会发现rviz会自动打开,rviz的配置如下: 6.1 添加Displays 自动打开的rviz如下图所示,需要我们自己添加现实的内容,从而显示出小车
点击左下角的Add添加显示内容到Display
选择RobotModel,并点击确认添加到Display
6.2 修改参数 添加过RobotModel后rviz显示如下图,这时候还不可以正常显示小车,可以点击Display中“RobotModel”选项,并点击“Status:Error”查看详细错误提示,提示为“No transform from [base_link] to [map].”类型,这是需要修改Fixed Frame选项。
修改Fixed Frame为base_link即可正常显示,如下图。
7. 可能遇到的问题 7.1 No transform from [base_link] to [map]. 没有修改Fixed Frame,详情请看6.2章节。 .urdf文件有误,可以使用下述语句查看
check_urdf smartcar.urdf
参考文献: 古月老师博客
mkdir -p /SmartCar/src
cd /SmartCar
catkin_init_workspace
cd /src
roscreate-pkg smartcar_description urdf
<?xml version="1.0"?>
<robot name="smartcar">
<link name="base_link">
<visual>
<geometry>
<box size="0.25 .16 .05"/>
</geometry>
<origin rpy="0 0 1.57075" xyz="0 0 0"/>
<material name="blue">
<color rgba="0 .5 .8 1"/>
</material>
</visual>
</link>
<link name="right_front_wheel">
<visual>
<geometry>
<cylinder length=".02" radius="0.025"/>
</geometry>
<material name="black">
<color rgba="0 0 0 1"/>
</material>
</visual>
</link>
<joint name="right_front_wheel_joint" type="continuous">
<axis xyz="0 0 1"/>
<parent link="base_link"/>
<child link="right_front_wheel"/>
<origin rpy="0 1.57075 0" xyz="0.08 0.1 -0.03"/>
<limit effort="100" velocity="100"/>
<joint_properties damping="0.0" friction="0.0"/>
</joint>
<link name="right_back_wheel">
<visual>
<geometry>
<cylinder length=".02" radius="0.025"/>
</geometry>
<material name="black">
<color rgba="0 0 0 1"/>
</material>
</visual>
</link>
<joint name="right_back_wheel_joint" type="continuous">
<axis xyz="0 0 1"/>
<parent link="base_link"/>
<child link="right_back_wheel"/>
<origin rpy="0 1.57075 0" xyz="0.08 -0.1 -0.03"/>
<limit effort="100" velocity="100"/>
<joint_properties damping="0.0" friction="0.0"/>
</joint>
<link name="left_front_wheel">
<visual>
<geometry>
<cylinder length=".02" radius="0.025"/>
</geometry>
<material name="black">
<color rgba="0 0 0 1"/>
</material>
</visual>
</link>
<joint name="left_front_wheel_joint" type="continuous">
<axis xyz="0 0 1"/>
<parent link="base_link"/>
<child link="left_front_wheel"/>
<origin rpy="0 1.57075 0" xyz="-0.08 0.1 -0.03"/>
<limit effort="100" velocity="100"/>
<joint_properties damping="0.0" friction="0.0"/>
</joint>
<link name="left_back_wheel">
<visual>
<geometry>
<cylinder length=".02" radius="0.025"/>
</geometry>
<material name="black">
<color rgba="0 0 0 1"/>
</material>
</visual>
</link>
<joint name="left_back_wheel_joint" type="continuous">
<axis xyz="0 0 1"/>
<parent link="base_link"/>
<child link="left_back_wheel"/>
<origin rpy="0 1.57075 0" xyz="-0.08 -0.1 -0.03"/>
<limit effort="100" velocity="100"/>
<joint_properties damping="0.0" friction="0.0"/>
</joint>
<link name="head">
<visual>
<geometry>
<box size=".02 .03 .03"/>
</geometry>
<material name="white">
<color rgba="1 1 1 1"/>
</material>
</visual>
</link>
<joint name="tobox" type="fixed">
<parent link="base_link"/>
<child link="head"/>
<origin xyz="0 0.08 0.025"/>
</joint>
</robot>
其中…主要描述模型硬件结构的属性信息,里面对轮子的形状、颜色、质量、惯性等信息进行了语言描述;…可以理解为两个…之间的连接间,如图中蓝色框所示,主要描述两个…之间的位置等固定连接信息。 文中的结构可以简化为下面的格式,定义一个robot标签,在标签中定义base_link和right_front_wheel两个标签,两个标签的后面跟着描述base_link和right_front_wheel关系的joint
<?xml version="1.0"?>
<robot name="smartcar">
<link name="base_link">
...
</link>
<link name="right_front_wheel">
...
</link>
<joint name="left_front_wheel_joint" type="continuous">
...
</joint>
</robot>
<link name="base_link">
<visual> <!--视觉信息-->
<geometry> <!--几何形状信息-->
<box size="0.25 .16 .05"/> <!--形状为矩形盒子(还有其他可选形状,如圆、圆柱等),大小为"0.25 0.16 0.05"-->
</geometry>
<origin rpy="0 0 1.57075" xyz="0 0 0"/> <!--rpy代表欧拉角,绕着z轴转动90度;xyz代表在xyz三轴上的位移-->
<material name="blue"> <!--材料信息-->
<color rgba="0 .5 .8 1"/> <!--定义颜色信息-->
</material>
</visual>
</link>
<joint name="right_front_wheel_joint" type="continuous">
<axis xyz="0 0 1"/>
<parent link="base_link"/>
<child link="right_front_wheel"/> <!--将子link(right_front_wheel)连接到父link(base_link)上-->
<origin rpy="0 1.57075 0" xyz="0.08 0.1 -0.03"/> <!--连接位置-->
<limit effort="100" velocity="100"/>
<joint_properties damping="0.0" friction="0.0"/>
</joint>
<launch>
<arg name="model" />
<arg name="gui" default="False" />
<param name="robot_description" textfile="$(find smartcar_description)/urdf/smartcar.urdf" />
<param name="use_gui" value="$(arg gui)"/>
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" ></node>
<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find urdf_tutorial)/urdf.vcg" />
</launch>
source devel/setup.bash
roslaunch servo_description base.urdf.rviz.launch
点击左下角的Add添加显示内容到Display
选择RobotModel,并点击确认添加到Display
6.2 修改参数 添加过RobotModel后rviz显示如下图,这时候还不可以正常显示小车,可以点击Display中“RobotModel”选项,并点击“Status:Error”查看详细错误提示,提示为“No transform from [base_link] to [map].”类型,这是需要修改Fixed Frame选项。
修改Fixed Frame为base_link即可正常显示,如下图。
7. 可能遇到的问题 7.1 No transform from [base_link] to [map]. 没有修改Fixed Frame,详情请看6.2章节。 .urdf文件有误,可以使用下述语句查看
check_urdf smartcar.urdf