第三章 ROS建模

第三章 ROS建模

ROS系列学习:
总章目录:
第一章 ROS基础
第二章 ROS常用组件
第三章 ROS建模
第四章 ModelArts模型转换
第五章 HiLens模型管理
第六章 HiLens技能部署
第七章 Hilens红绿灯数据获取+socket通信
第八章 Hilens红绿灯数据获取+socket通信(二)



前言

URDF建模;
TF坐标变换;
Qt工具箱;


提示:以下是本篇文章正文内容,下面案例仅供参考

一、URDF介绍

   1、Unified Robot description Format, 统一机器人描述格式;
   2、ROS中—个非常重要的机器人模型描述格式;
   3、可以解析URDF文件中使用XML格式描述的机器人模型;
   4、ROS同时也提供URDF文件的C++解析器。

例如:

<?xml version="1.0" ?>
<robot name="mrobot_chassis">

    <link name="base_link">
        <visual>
            <origin xyz=" 0 0 0" rpy="0 0 0" />
            <geometry>
                <cylinder length="0.005" radius="0.13"/>
            </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>

    <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>

</robot>

1、 XML语言介绍

方便使用标签,属性描述机器人的相关信息,组织起来比较方便。
机器人整体可以拆解为两部分:
就是 link 和 joint:

1、 <link>

   连杆,刚体等元素采用<link>......</link>标签定义。
   描述机器人某个刚体部分的外观以及物理属性, 如:尺寸(size)、 颜色(color)、形状(shape)等;
   以及动力学中用到的:惯性矩阵(inertial matrix)、碰撞参数(collision properties)等。

 <link name="base_link">
        <visual>......</visual>  # 描述机器人link部分外观参数;
        <inertial>......</inertial>   # 描述link惯性参数(质心,重心等);
        <collision>......</collision>   #碰撞属性;
 </link>

如下图:
在这里插入图片描述

2、<joint>

   关节等元素采用<link>......</link>标签定义。

    <joint name="name of the joint" type="continuous(joint_type)">
        <origin xyz="0 0.0485 0" rpy="0 0 0"/>
        <parent link="left_motor"/>
        <child link="left_wheel_link"/>
        <axis xyz="0 1 0"/>
        <calibration ...>
        <dynamics damping...>
        <limit effort...>
    </joint>

   描述机器人关节运动学和动力学属性;
   包括关节运动的位置和速度控制;
   根据关节运动形式,可将其分为六种类型。
在这里插入图片描述

关节类型描述简介
continuous旋转关节,可以围绕单轴无线旋转;
revolute旋转关节,类似于continuous,但是有旋转角度的极限;
prismatic滑动关节,沿着某一轴线移动的关节,带有位置极限;
planar平面关节,允许在平面正交方向上平移或者旋转;
floating浮动关节,允许进行平移、旋转运动;
fixed固定关节,不允许运动的特殊关节;
calibration关节参考位置,用来校准关节的绝对位置;
dynamics描述关节的物理属性,例如阻尼值、物理静摩擦力等,经常在动力学仿真中用到;
limit描述运动的极限值,包括关节运动的上下限位置,速度限制,力矩限制等;
safety_controller描述安全控制参数;

。。。。。。

3、<robot>

   整体机器人模型的最顶岑标签采用<link>......</link>标签定义,类似于launch文件的最顶层标签用launch
link 和 joint 标签必须包含在 robot 中。

在这里插入图片描述

2、URDF实践

1.创建功能包:模型

catkin_create_pkg mbot_description urdf xacro

2.创建必要文件夹:

mkdir launch/ meshes/ urdf/ config/

launch/ :主要存放相关启动文件
meshes/:放置URDF中引用的模型渲染文件
urdf/ :机器人URDF模型 或者 xacro文件
config/:保存rviz等文件配置信息

3.display_base_urdf.launch

在launch文件中加入display_base_urdf.launch文件:

<launch>
	<!--加载一个参数,参数为一个urdf的模型路径 -->
	<prame name="robot_description" textfile="$(find mbot_description)/urdf/mbot_base.urdf" />

	<!--设置GUI参数,显示关节控制插件 -->
	<prame name="use_gui" vales="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可视化界面 -->
	<node name="rviz" pkg="rviz" type="rviz" args="-d $ (find mbot_description)/config/mbot_urdf.rviz" required="true" />
	
</launch>

4、编写urdf文件

<?xml version="1.0" ?>
<robot name="mbot">

    <link name="base_link">
        <visual>
            <origin xyz=" 0 0 0" rpy="0 0 0" />  # xyz相对世界坐标系的位置偏移(单位米),rpy相对于坐标的旋转偏移(单位弧度);
            <geometry>
                <cylinder length="0.16" radius="0.20"/>
            </geometry>
            <material name="yellow">
                <color rgba="1 0.4 0 0.8"/>
            </material>
        </visual>
    </link>


</robot>

5、配置rviz

在这里插入图片描述

此时需要添加插件: 通过add 加入robotstate,TF等;

报错:

此时显示rviz会报错:

[ERROR] [1593909045.156283127]: Robot semantic description not found. Did you forget to define or remap '/robot_description_semantic'?

解决办法:
保存配置,会默认生成urdf.rviz
打开该,找到默认配置,截取其中一处

Value: true

  • Attached Body Color: 150; 50; 150
    Class: moveit_rviz_plugin/RobotState—要更改地方
    Collision Enabled: false
    Enabled: true

将默认配置:

Class: moveit_rviz_plugin/RobotState

改为:

 Class: rviz/RobotModel

保存后重新启动即可。

3、URDF实战升级:

1、使用圆柱体创建车体模型:

见第二部分( link )。

2、创建车轮模型:

使用( joint)链接车轮 。
在车体模型(base_link)下创建左轮模型:

<?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 0.8"/>
            </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>
    
</robot>

同理我们可以创建右轮等模块。
如下:

<?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>

</robot>

3、创建传感器

此时我们将小车的主体URDF保存一下。
然后开始创建几个传感器:
例如:摄像头,激光雷达,kinect深度相机;

1、增加摄像头传感器;

将代码加入到主体URDF部分最下端:

<link name="camera_link">
        <visual>
            <origin xyz=" 0 0 0 " rpy="0 0 0" />
            <geometry>
                <box size="0.03 0.04 0.04" />
            </geometry>
            <material name="black">
                <color rgba="0 0 0 0.95"/>
            </material>
        </visual>
    </link>

    <joint name="camera_joint" type="fixed">
        <origin xyz="0.17 0 0.10" rpy="0 0 0"/>
        <parent link="base_link"/>
        <child link="camera_link"/>
    </joint>

解释:
在这里插入图片描述
用于调节TF坐标大小。

增加摄像头模块是一个长方体:box
大小:size;
<box size="0.03 0.04 0.04" />

运行:

roslaunch mbot_description display_mbot_base_urdf.launch 

在这里插入图片描述

2、增加激光雷达:

同理:在最后部分增加雷达模型;

<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>

显示效果:
在这里插入图片描述
此时只是模型,后续会将其变为真正的雷达;

3、加载kinect纹理信息;

代码如下:将代码放入小车主体URDF文件中:

<link name="kinect_link">
    <visual>
        <origin xyz="0 0 0" rpy="0 0 1.5708"/>
        <geometry>
            <mesh filename="package://mbot_description/meshes/kinect.dae" />
        </geometry>
    </visual>
</link>

<joint name="laser_joint" type="fixed">
    <origin xyz="0.15 0 0.11" rpy="0 0 0"/>
    <parent link="base_link"/>
    <child link="kinect_link"/>
</joint>

代码解释:

mesh 主要存放传感器的纹理信息;
纹理信息获取可以从roswiki中其他项目文件中获取;

<mesh filename="package://mbot_description/meshes/kinect.dae" />

我们将纹理信息文件放入meshes这个文件夹中,打开launch文件;
在这里插入图片描述

4、查看URDF模型结构

urdf_to_graphiz mbot_base.urdf 

在这里插入图片描述

4、思考

1.模型冗长,重复过多;
2.参数修改麻烦,不便于二次开发;
3.没有参数计算功能;

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值