声明
本文是关于URDF的模型生成的link joint两个标签的语法的着重讲解,并完成 创建一个汽车底盘并加上一个摄像头这样一个案例来经行实践,通过launch文件实现链接,并解决在rivz中底盘下沉了一半,本不是完全在地面的问题。
-1.注意
如果出现报错,如下,请删掉所有的注释(urdf文件)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 463-464: ordinal not in range(128)
[joint_state_publisher-3] process has died [pid 4443, exit code 1, cmd /opt/ros/melodic/lib/joint_state_publisher/joint_state_publisher __name:=joint_state_publisher __log:=/home/rosmelodic/.ros/log/b38967c0-0acb-11eb-aee3-0800278ee10c/joint_state_publisher-3.log].
log file: /home/rosmelodic/.ros/log/b38967c0-0acb-11eb-aee3-0800278ee10c/joint_state_publisher-3*.log
0.robot标签
这是我们编写urdf文件时的根标签。
1.link标签的语法
link标签下有三个子标签,分别为:
1.1visual
这个是描述你所创建的模型的外观,在rviz中是可以看见的可视化数据
visual下也有几个子标签:
box-----当你的模型是盒装时,就需要使用这个标签,后面所跟的属性叫做size,写法也就是size="x y z",xyz也就是对应盒装物体的长宽高的数据。
cylinder-----圆柱状,属性为radius = 半径 length = 高度
sphere-----球体,属性为radius = 半径
mesh-----为目标物体添加皮肤,也可以用于关于其他stl文件,urdf文件的导入rviz环境,具体语法如下:
<mesh filename = "package://你的功能包名/mesh/你的stl文件名"/>
1.2origin
用于设置物体的偏移量与倾斜弧度的作用,简单来说就是调整它的位置。
它没有子标签,只有两个属性
xyz=x方向偏移 y方向偏移 z方向偏移
rpy=x翻滚 y俯仰 z偏航
1.3metrial
属性为name,你需要命名一个名字。
标签为:color,属性为rgba=红 绿 蓝 透明度(每个权重量的取值在0-1之间)
1.4collision
连杆的碰撞属性
1.5inertial
连杆的惯性矩阵
下面我们来建立一个盒装底盘案例:
<!-- 父标签robot 属性为name -->
<robot name = "mycar">
<link name="base_link">
<visual>
<!-- 盒装与尺寸 -->
<geometry>
<box size="0.5 0.2 0.1" />
</geometry>
<origin xyz="0 0 0" rpy="0 0 0" />
<!-- 改变了颜色,设置为了绿色,透明度设置为了0.5 -->
<material name="green">
<color rgba="0 1 0 0.5" />
</material>
</visual>
</link>
</robot>
launch文件的编写,上一节有相关的讲解,这里就不在赘述:
<launch>
<!-- 设置参数 -->
<param name = "robot_description" textfile ="$(find ilovezero4_urdf)/urdf/urdf/demo01_link.urdf"/>
<!-- 启动 rivz -->
<node pkg = "rviz" type = "rviz" name = "rviz" args = "-d $(find ilovezero4_urdf)config/hello_mycar.rviz" />
</launch>
运行结果如下:
可以看到,我们成功生成了一个绿色的盒装物体。
2.关于joint标签的语法
joint本身拥有两个属性:
name-----给该关节取名字
type-----这个是设置关节运动形式的,它的参数设置是下面固定的几个量。
continuous:旋转关节,可以绕某个轴无限制旋转
revolute:旋转关节,可以绕某轴以一角度旋转
prismatic:滑动关节,沿着某一轴线的关节,有位置极限
floating:浮动关节,允许进行平移和旋转运动
fixed:固定关节,不允许动
planer:平面关节,允许在平面正交方向向上平移or旋转
2.1关于joint的子标签
1.parent(必需)
parent link 是一个必须的属性,后面跟上你的父级连杆的名字,也就是之前设置link name。
2.child(必需)
与上面的parent同理,child link是要把关节连接在父级连杆的子集连杆的名字,也就是另一个部件的link name。
3.origin
属性:xyz=各个轴线上的偏移量(需要自己计算) rpy=各个轴线的偏移弧度
4.axis
属性为xyz用于设置其绕哪个轴运动
下面是一个将摄像头安装在你的底盘上的代码实现,你需要新建一个urdf文件:
<robot name="mycar">
<link name="base_link">
<visual>
<geometry>
<box size="0.5 0.2 0.1" />
</geometry>
<origin xyz="0 0 0" rpy="0 0 0" />
<material name="blue">
<color rgba="0 1 0 0.5" />
</material>
</visual>
</link>
<link name="camera">
<visual>
<geometry>
<box size="0.02 0.05 0.05" />
</geometry>
<origin xyz="0 0 0" rpy="0 0 0" />
<material name="red">
<color rgba="1 0 0 0.5" />
</material>
</visual>
</link>
<joint name="camera2baselink" type="continuous">
<parent link="base_link"/>
<child link="camera" />
<!-- 这里需要根据你的地盘尺寸计算摄像头具体放在哪 -->
<origin xyz="0.2 0 0.075" rpy="0 0 0" />
<axis xyz="0 0 1" />
</joint>
</robot>
然后关于它的launch文件,需要稍微做出修改,具体修改代码如下,需要添加两个功能包,这两个功能包的具体功能在注释上,最后一个功能包可加可不加。
<launch>
<!-- 设置参数 -->
<param name = "robot_description" textfile ="$(find ilovezero4_urdf)/urdf/urdf/demo02_jiont.urdf"/>
<!-- 启动 rivz -->
<node pkg = "rviz" type = "rviz" name = "rviz" args = "-d $(find ilovezero4_urdf)config/hello_mycar.rviz" />
<!-- 添加关节状态发布节点 -->
<node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" />
<!-- 添加机器人状态发布节点 -->
<node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" />
<!-- 可选:用于控制关节运动的节点 -->
<node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher_gui" />
</launch>
最后一个功能包如果要添加,他会出现一个qt界面,可以调节关节的运动情况,下面是功能包的下载代码:
sudo apt install ros-你的ros版本-joint-state-publisher-gui
接下来我们运行一下,结果如下:
3.关于footprint的优化实现
我们先来观察这个问题,它是为了解决部件半个身子陷入地面的问题,问题如下:
大家可以看到,这个绿色物块是陷入地下的,一半的高陷入地下。
我们的解决思路就是在这个物块的底部中心点加一个小到可以忽略的物块,让这个物块的高一半陷入地底即可,小物块与底盘通过joint的fixed连接就可以了。关节的高度设置为这个刚体的高的一半,这样当小物块下沉时,关节的高度高,会使该物体上移一半高度,正好在地面上。
下面是urdf的代码是实现:
<robot name="mycar">
<link name="base_footprint">
<visual>
<geometry>
<sphere radius="0.001" />
</geometry>
</visual>
</link>
<link name="base_link">
<visual>
<geometry>
<box size="0.5 0.2 0.1" />
</geometry>
<origin xyz="0 0 0" rpy="0 0 0" />
<material name="blue">
<color rgba="0 0 1.0 0.5" />
</material>
</visual>
</link>
<joint name="base_link2base_footprint" type="fixed">
<parent link="base_footprint" />
<child link="base_link" />
<origin xyz="0 0 0.05" />
</joint>
<link name="camera">
<visual>
<geometry>
<box size="0.02 0.05 0.05" />
</geometry>
<origin xyz="0 0 0" rpy="0 0 0" />
<material name="red">
<color rgba="1 0 0 0.5" />
</material>
</visual>
</link>
<joint name="baselink2foot_print" type="fixed">
<parent link="base_footprint"/>
<child link="base_link" />
<origin xyz="0 0 0.05" rpy="0 0 0" />
<axis xyz="0 0 0" />
</joint>
<joint name="camera2baselink" type="continuous">
<parent link="base_link"/>
<child link="camera" />
<origin xyz="0.2 0 0.075" rpy="0 0 0" />
<axis xyz="0 0 1" />
</joint>
</robot>
launch文件的编写请参照上文,本文中与上面的launch文件无变化。
结果如下:
大家可以看到,绿色框中有一个红色小点。