一、学习前提
首先,你需要了解一下URDF文件,这是我Linux系统和ROS都不太熟时学习的笔记,可以先做简单了解,里面的操作都是小白方法,如果学习完之前的内容再看就显得笨且糊里糊涂的,但那也是一个过程
好啦,看完上面的资料,只记住基础知识,忘掉练习的操作,开始今天的内容吧
Unified Robot DescriptionFormat,统一机器人描述格式
非常重要的机器人模型描述格式
可以解析URDF文件中使用XML格式描述的机器人模型
ROS同时也提供URDF文件的C++解析器
URDF的一些参数
< link >
描述机器人某个刚体部分的外观和物理属性>尺寸(size)、颜色(color),形状(shape)、惯性矩阵(inertial matrix)、碰撞参数(collision properties)等
< visual >:描述机器人link部分的外观参数
< inertiab >︰描述link的惯性参数
< collision>︰描述link的碰撞属性
< joint >
描述机器人关节的运动学和动力学属性
包括关节运动的位置和速度限制
根据关节运动形式,可以将其分为六种类型
关节类型 | 描述 |
---|---|
continuous | 旋转关节,可以围绕单轴无限旋转 |
revolute | 旋转关节,类似于continuous,但是有旋转的角度极限 |
prismatic | 滑动关节,沿某一轴线移动的关节,带有位置极限 |
planar | 平面关节,允许在平面正交方向上平移或者旋转 |
floating | 浮动关节,允许进行平移、旋转运动 |
fixed | 固定关节,不允许运动的特殊关节 |
< calibration>:关节的参考位置,用来校准关节的绝对位置
< dynamics>∶描述关节的物理属性,例如阻尼值、物理静摩擦力等,经常在动力学仿真中用到
< limit>︰描述运动的一些极限值,包括关节运动的上下限位置、速度限制、力矩限制等
< mimic>︰描述该关节与已有关节的关系
< safety_controller>∶描述安全控制器参数
< robot>:完整机器人模型的最顶层标签,< link>和< joint>标签都必须包含在< robot>标签内,一个完整的机器人由一系列的< link>和< joint>构成
二、实战
在完成ROS基础(8)——机器人建模实战的学习后,接着来吧~
可以跟着自己写来一遍,也可以用已经弄好的包:提取码:bf7y
不过和我下面做的有出入,仔细看,做适当的更改
1、功能包的准备
cd try_ws/src/ # 到达工作空间指定路径
catkin_create_pkg mybot_des urdf xacro # 创建自己的包且添加两个依赖
#会在自己的内自动生成两个文件:
#Created file mybot_des/package.xml
#Created file mybot_des/CMakeLists.txt
#Successfully created files in /home/ubuntu/try_ws/src/mybot_des. Please adjust the values in package.xml.
cd mybot_des/ # 来到自己的包内
mkdir urdf # 创建存放机器人模型的文件
mkdir launch # 创建启动文件
mkdir meshes # 创建存放渲染机器人模型的文件
mkdir config # 创建存放rviz配置的文件
2、launch文件
首先到launch文件下创建启动launch文件
ubuntu@ubuntu:~/try_ws/src/mybot_des$ cd launch/
ubuntu@ubuntu:~/try_ws/src/mybot_des/launch$ gedit ./display_mbot_base_urdf.launch
将下列内容输入到display_mbot_base_urdf.launch
文件中
<launch>
<param name="robot_description" textfile="$(find mybot_des)/urdf/mbot_base.urdf" />
# textfile告知调用哪个路径下的urdf文件
<param name="use_gui" value="true"/>
# 启用插件:设置GUI参数,value="true"为显示关节控制插件
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
# 运行joint_state_publisher节点,发布机器人的关节状态。pkg包名,type可执行程序
<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
# 运行robot_state_publisher节点,发布tf。
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find mybot_des)/config/mbot_urdf.rviz" required="true" />
# 运行rviz可视化界面。参数args标定路径,required="true"表示rviz必须启动
# 这里要注意你需要提前安装好rviz的插件哦~
# rviz的文件内容在这里不写了,看我给的资源包里面直接复制,放到相应的文件里
</launch>
3、urdf文件
到达指定路径,创建文件的指令应该都烂熟于心的,所以后面就不写了,不会参照上面
创建 mbot_base.urdf
文件,内容如下:
看懂上面的备注,下面也就懂了
<?xml version="1.0" ?> # XML文件的第一行,声明这是一个XML文件,version属性是必须写的
<robot name="mbot"> # 机器人的名字
# 车身
<link name="base_link"> # 连杆名字:主关节(起始1)
<visual> # 视觉信息(起始2)
<origin xyz=" 0 0 0" rpy="0 0 0" /> # 连杆的起点:xyz为相对的位置,rpy为相对的方向
<geometry> # 几何形状(起始3)
<cylinder length="0.16" radius="0.20"/> # link的形状:圆柱 高 半径
</geometry> # (结束3)
<material name="yellow"> # 素材:黄色 (起始4)
<color rgba="1 0.4 0 1"/> # 黄色的代码和配置,1 0.4 0表达颜色,1表达透明度
</material> # (结束4)
</visual> # (结束2)
</link> # (结束1)
# 左轮连接轴
<joint name="left_wheel_joint" type="continuous"> # 关节名字和类型,continuous为旋转关节,可围绕单轴无限旋转
<origin xyz="0 0.19 -0.05" rpy="0 0 0"/> # 关节的起点:xyz为相对的位置,rpy为相对的方向
<parent link="base_link"/> # 父连杆
<child link="left_wheel_link"/> # 子连杆
<axis xyz="0 1 0"/> # axis为基准轴在本坐标系中的姿态
</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>
4、运行
(1)编译
cd try_ws/
catkin_make
source ./devel/setup.bash
(2)运行
roslaunch mybot_des display_mbot_base_urdf.launch
会飘红,是因为还有许多文件我们包含进去了但还没有做,所以把该有的文件补齐就可以了
后面的文件不一一带着做了,上面的资料已给,先自己都补充好,如果是按着我的步骤来的,记得把launch文件里的路径都改成mybot_bas或者改成自己设置的文件名称
补充完整后再运行roslaunch mybot_des display_mbot_base_urdf.launch
这个命令可能会遇到的问题:
出现问题一:ERROR: cannot launch node of type [robot_state_publisher/state_publisher]: robot_state_publisher
解决办法:安装缺少的依赖
sudo apt-get install ros-kinetic-robot-state-publisher
出现问题二:[WARN] [1626935612.937225]: The ‘use_gui’ parameter was specified, which is deprecated.
解决办法:先安装依赖
sudo apt-get install ros-kinetic-joint-state-publisher-gui
/home/ubuntu/try_ws/src/mybot_des/launch文件中的display_mbot_base_urdf.launch文件里的这一行需要更改如下:
<node name="joint_state_publisher" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" />
出现问题三:运行出来的模型没轮子
报错:ERROR: cannot launch node of type [joint_state_publisher_gui/joint_state_publisher_gui]: joint_state_publisher_gui
rviz报错:No tf data. Actual error: Fixed Frame [base_link] does not exist
其实和问题二是异曲同工,解决办法也一样:
sudo apt-get install ros-kinetic-joint-state-publisher-gui
最后成功运行呈现如下
三、以小见大
1、添加相机
以上我们建立了简单的模型,那么如果还要往上加东西呢?比如相机
先在try_ws/src/mybot_des/launch
文件里建一个启动文件:display_mbot_with_camera_urdf.launch
<launch>
<!-- 注意这里的模型文件换了 -->
<param name="robot_description" textfile="$(find mybot_des)/urdf/mbot_with_camera.urdf" />
<param name="use_gui" value="true"/>
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find mybot_des)/config/mbot_urdf.rviz" required="true" />
</launch>
然后在try_ws/src/mybot_des/urdf
文件里建一个模型文件:mbot_with_camera.urdf
<?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>
<? 此处添加了相机的模型 ?>
<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>
</robot>
运行就可以看到相机在模型上了
roslaunch mybot_des display_mbot_with_camera_urdf.launch
2、添加相机纹理
先在try_ws/src/mybot_des/launch
文件里建一个启动文件:display_mbot_with_kinect_urdf.launch
<launch>
<param name="robot_description" textfile="$(find mybot_des)/urdf/mbot_with_kinect.urdf" />
<!-- 设置GUI参数,显示关节控制插件 -->
<param name="use_gui" value="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 mybot_des)/config/mbot_urdf.rviz" required="true" />
</launch>
然后在try_ws/src/mybot_des/urdf
文件里建一个模型文件:mbot_with_kinecct.urdf
<?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>
<? 这里的相机很不同 ?>
<link name="kinect_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 1.5708"/>
<geometry>
<mesh filename="package://mybot_des/meshes/kinect.dae" />
<? 最开始在try_ws/src/mybot_des下创建的meshes文件夹里的东西用到了 ?>
</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>
</robot>
meshes文件夹里的东西从我给的资源量下,这里不操作
运行再看是不是就像模像样了呀
roslaunch mybot_des display_mbot_with_kinect_urdf.launch