ROS基础--URDF语法的相关讲解与案例及相关优化

声明

本文是关于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文件无变化。

结果如下:

大家可以看到,绿色框中有一个红色小点。

### 回答1: 这是一个关于ROS Noetic软件包依赖关系的问题。其中,下列软件包的依赖关系尚不足够满足要求,无法安装: ros-noetic-desktop-full: 依赖于 ros-noetic-desktop,但它不会被安装。 依赖于 ros-noetic-perception,但它不会被安装。 依赖于 ros-noetic-simulators,但它不会被安装。 依赖于 ros-noetic-urdf-sim-tu,但它不会被安装。 ### 回答2: 这个错误提示是说明在安装 ros-noetic-desktop-full 软件包时,发现它需要依赖一些其他的软件包,但是这些软件包未被安装。其中,ros-noetic-desktop、ros-noetic-perception、ros-noetic-simulators 和 ros-noetic-urdf-sim-tu 是四个未满足依赖关系的软件包。 这个错误提示一般是由于软件源的问题所导致的。在安装软件包时,系统会从软件源中查找该软件包以及它所需的依赖关系。如果软件源中不存在某个软件包的依赖关系,则会提示这个错误信息。 要解决这个问题,可以尝试以下几个方法: 1. 更新软件源:可通过修改软件源配置文件或使用软件源管理工具来更新软件源。更新后再次尝试安装软件包,看是否能够解决依赖关系问题。 2. 手动安装依赖关系:如果更新软件源后仍然无法解决依赖关系问题,可以尝试手动安装依赖关系。按照依赖关系的提示,逐个安装这四个软件包。安装完成后再次尝试安装 ros-noetic-desktop-full 软件包,看是否能够正常安装。 3. 使用 aptitude 命令安装:aptitude 命令可以自动处理依赖关系,可能会更好地解决这个问题。可以通过运行以下命令安装 ros-noetic-desktop-full 软件包: sudo aptitude install ros-noetic-desktop-full 以上是我的回答,希望能对你有所帮助。如果你还有其他问题,请随时回复。 ### 回答3: 这个问题意味着在安装 ros-noetic-desktop-full 软件包时,计算机无法满足所有需要的依赖关系。这些依赖关系包括 ros-noetic-desktop、ros-noetic-perception、ros-noetic-simulators 和 ros-noetic-urdf-sim-tu。 在解决这个问题之前,我们需要了解什么是依赖关系。在软件工程中,依赖关系指的是一个软件包需要另一个软件包才能正常运行的情况。例如,在 ROS 中,ros-noetic-desktop-full 需要依赖其他的软件包才能提供完整的功能。 为了解决这个问题,我们可以使用以下方法: 1. 更新软件包源列表。我们可以更新软件包源列表,这有助于计算机查找所需的软件包。在 Ubuntu 系统中,我们可以使用以下命令更新软件包源列表:sudo apt-get update。 2. 安装依赖关系。我们可以尝试单独安装缺失的依赖关系。在 ROS 中,我们可以使用以下命令安装缺失的软件包:sudo apt-get install ros-noetic-desktop ros-noetic-perception ros-noetic-simulators ros-noetic-urdf-sim-tu。 3. 检查软件包仓库。某些情况下,软件包源可能已经过时或不再受支持。我们可以检查软件包仓库,查看软件包是否可用。在 Ubuntu 系统中,我们可以使用以下命令查看软件包仓库:apt-cache search ros-noetic-desktop-full。 总之,无法满足依赖关系的问题是常见的,在解决这个问题之前,我们需要了解依赖关系的概念,并掌握一些解决方法。在 ROS 中,我们可以使用更新软件包源列表、安装依赖关系和检查软件包仓库等方法解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值