初学ROS(一)之URDF
首先在下小白刚开始学ROS,写此是为了记录和帮助有可能遇到和我一样问题的人,大佬有问题请指出 0.0
可能大部分人都像我这样穷学生没钱买ROS支持的机器人,不过ROS还是很Nice的考虑到了这一群体,提供了模拟器支持。(明明是为了更快速的软件开发,喂!)
本想从ROS网站的培训教程开始http://wiki.ros.org/urdf/Tutorials开始的,不过本着实践为本的目的,我们还是以《Learning ROS for Robostic Programming》为基础吧。
参考文献
2. 《Learning ROS for Robostic Programming》
软件环境
ubuntu 16.04 lts
ros kinetic full package
准备工作
安装urdf_tutorial包
$sudo apt-get install ros-kinetic-urdf-tutorial
$roscore
$rosrun rviz rviz
新建工作区和包
$mkdir -p ~/catkin_ws/src #创建catkin工作环境
$cd ~/catkin_ws/src #来到src目录
$cd .. #来到catkin_ws目录下
$catkin_init_workspace
$catkin_make
更新环境配置
$source devel/setup.bash
创建Rospackage命名为smartcar:在src目录下面执行以下操作
$catkin_create_pkg smartcar std_msgs rospy roscpp urdf #创建这些格式的目录
在smartcar文件夹中创建launch和urdf分别来存放.launch文件和.urdf文件
当然,没有运行roscore你的rviz也无法启动。不过如果错误显示你的rviz找不到执行文件的话
学习写urdf有几个地方需要注意
- 一定要记住它使用的是右手坐标系。x正方向朝左, y 正方向向内, z轴正方向朝上
- 构建树结构, 即写link和joint
- 每个link的参考坐标系都在它的底部,并与关节的参考坐标系正交,为了添加尺寸,需要指定偏移从一个link到它的关节的子link, 这通过添加origin到每个节点解决。
- 这么说origin表示的是关节相对于父关节的距离和旋转, xyz和rpy
建模使用参数
- <link> tag描述各个部件;
eg:<link name="base_link" />
- <joint> tag描述各个关节;
eg:
<joint name="joint_base_wheel1" type="fixed">
<parent link="base_link"/>
<child link="wheel_1"/>
</joint>
- <parent>和<child>描述关节连接的部件;
- <visual>tag 定义一个link的外观,大小,颜色和材质纹理贴图;用来描述模块的视觉效果;
- <visual>定义:<geometry> 定义了几何形状为一个立方体,三个参数分别为长宽高,单位是米(m). 这里我们指定下层小车板子的板的尺寸。<geometry>可以有好几个选项:<box> 立方体 <cylinder>圆柱体 <sphere>球体
<link name="wheel_1">
<visual>
<geometry>
<cylinder length="0.05" radius="0.05"/>
</geometry>
<origin rpy="0 1.5 0" xyz="0.1 0.1 0"/>
</visual>
</link>
- <inertial> 定义惯性;
- <geometry>tag 用来描述模块的形状和大小;
- <origin>tag用来描述模块的位置;
- 使用<material> tag并且设置<color> tag 上色
- <material> 指定颜色rgb和透明度a. 它们取值范围都是[0,1] 区间。
代码示例:第一个部件必须是base_link非常重要
<robot name="test_robot">
<link name="base_link">
<visual>
<geometry>
<box size="0.2 .3 .1"/>
</geometry>
<origin rpy="0 0 0" xyz="0 0 0.05"/>
<material name="white">
<color rgba="1 1 1 1"/>
</material>
</visual>
</link>
<link name="wheel_1">
<visual>
<geometry>
<cylinder length="0.05" radius="0.05"/>
</geometry>
<origin rpy="0 1.5 0" xyz="0.1 0.1 0"/>
<material name="black">
<color rgba="0 0 0 1"/>
</material>
</visual>
</link>
<link name="wheel_2">
<visual>
<geometry>
<cylinder length="0.05" radius="0.05"/>
</geometry>
<origin rpy="0 1.5 0" xyz="-0.1 0.1 0"/>
<material name="black"/>
</visual>
</link>
<link name="wheel_3">
<visual>
<geometry>
<cylinder length="0.05" radius="0.05"/>
</geometry>
<origin rpy="0 1.5 0" xyz="0.1 -0.1 0"/>
<material name="black"/>
</visual>
</link>
<link name="wheel_4">
<visual>
<geometry>
<cylinder length="0.05" radius="0.05"/>
</geometry>
<origin rpy="0 1.5 0" xyz="-0.1 -0.1 0"/>
<material name="black"/>
</visual>
</link>
<joint name="joint_base_wheel1" type="fixed">
<parent link="base_link"/>
<child link="wheel_1"/>
</joint>
<joint name="joint_base_wheel2" type="fixed">
<parent link="base_link"/>
<child link="wheel_2"/>
</joint>
<joint name="joint_base_wheel3" type="fixed">
<parent link="base_link"/>
<child link="wheel_3"/>
</joint>
<joint name="joint_base_wheel4" type="fixed">
<parent link="base_link"/>
<child link="wheel_4"/>
</joint>
</robot>
我们可以用如下命令来检查urdf文件是否有语法问题。
check_urdf 01_skeleton.urdf
只要得到如下结果就表明语法没问题。
robot name is: test_robot
---------- Successfully Parsed XML ---------------
root Link: base_link has 4 child(ren)
child(1): wheel_1
child(2): wheel_2
child(3): wheel_3
child(4): wheel_4
现在通过如下命令,你就通过rviz查看你的小车模型啦。
roslaunch smartcar_description base.urdf.rviz.launch gui:=true