第三章 ROS建模
ROS系列学习:
总章目录:
第一章 ROS基础
第二章 ROS常用组件
第三章 ROS建模
第四章 ModelArts模型转换
第五章 HiLens模型管理
第六章 HiLens技能部署
第七章 Hilens红绿灯数据获取+socket通信
第八章 Hilens红绿灯数据获取+socket通信(二)
ROS基础部分
前言
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.没有参数计算功能;