ROS机器人 (一) : 从零构建URDF四轮小车模型
1. 初识URDF机器人建模的乐高说明书第一次接触URDF时我把它想象成机器人的乐高说明书。就像用文字描述如何拼接积木一样URDF通过XML格式的文本文件精确描述机器人每个零件的形状、颜色、位置以及它们之间的连接方式。这种描述方式最大的优势是硬件无关性——你可以在没有实物的情况下先用代码搭建出虚拟机器人模型。URDF全称Unified Robot Description Format统一机器人描述格式是ROS中定义机器人模型的标配语言。一个典型的URDF文件包含两大核心元素link标签描述机器人的刚性部件比如小车的底盘、轮子、摄像头等joint标签定义这些部件之间的连接关系比如轮子如何固定在底盘上举个生活中的例子组装宜家家具时说明书会告诉你哪个木板link该用哪种螺丝joint连接。URDF文件就是机器人的组装说明书只不过用的是XML语法而不是图示。2. 开发环境准备搭建ROS游乐场2.1 基础软件安装在开始拼装我们的代码乐高之前需要准备好开发环境。我推荐使用Ubuntu 20.04 ROS Noetic组合这是目前最稳定的搭配。如果是新手可以直接安装ROS官方推荐的桌面完整版sudo apt install ros-noetic-desktop-full安装完成后别忘了运行这个魔法命令来激活ROS环境source /opt/ros/noetic/setup.bash2.2 创建工作空间我习惯为每个机器人项目创建独立的工作空间就像给不同乐高套装准备单独的收纳盒。按照以下步骤创建mkdir -p ~/smartcar_ws/src cd ~/smartcar_ws/src catkin_init_workspace cd .. catkin_make这组命令会创建一个标准的ROS工作空间结构。当看到####输出时说明你的机器人游乐场已经搭建好了。2.3 安装必要工具包我们需要两个关键工具urdf_tutorial包含URDF示例文件rviz3D可视化工具安装命令如下sudo apt install ros-noetic-urdf-tutorial ros-noetic-rviz3. 构建四轮小车模型从底盘开始3.1 创建URDF文件在我们的项目包中创建urdf目录然后新建smartcar.urdf文件cd ~/smartcar_ws/src catkin_create_pkg smartcar urdf rospy roscpp cd smartcar mkdir urdf launch gedit urdf/smartcar.urdf3.2 定义底盘(base_link)底盘是机器人的身体所有其他部件都直接或间接连接在它上面。让我们用box几何体定义一个长30cm、宽20cm、高5cm的矩形底盘link namebase_link visual geometry box size0.3 0.2 0.05/ /geometry origin rpy0 0 0 xyz0 0 0.025/ material nameblue color rgba0 0.2 0.8 1/ /material /visual /link这里有几个关键参数需要注意size定义盒子的长(x)、宽(y)、高(z)尺寸origin设置几何体的位置和旋转。这里我们把底盘抬高2.5cm(z0.025)因为高度是5cm这样底盘下表面刚好接触地面material给底盘赋予蓝色外观RGBA值分别代表红、绿、蓝和透明度3.3 添加四个轮子轮子适合用cylinder几何体表示。我们先定义一个通用轮子模板link namewheel visual geometry cylinder radius0.05 length0.03/ /geometry material nameblack color rgba0 0 0 1/ /material /visual /link然后通过joint将四个轮子实例安装到底盘上。这里有个实用技巧使用xacro:macro可以避免重复代码不过为了教学清晰我们先展示完整写法link namewheel_1 visual geometry cylinder radius0.05 length0.03/ /geometry origin rpy1.5708 0 0 xyz0.15 0.1 -0.025/ material nameblack/ /visual /link joint namewheel_1_joint typecontinuous parent linkbase_link/ child linkwheel_1/ origin xyz0.15 0.1 -0.05/ axis xyz0 1 0/ /joint注意几个关键点rpy1.5708 0 0将圆柱体旋转90度使其轴向与车体前进方向一致typecontinuous表示这个关节可以无限旋转适合轮子axis xyz0 1 0定义旋转轴为Y轴按照相同方式添加其他三个轮子只需调整xyz坐标即可。前轮坐标分别为(0.15, -0.1)、(0.15, 0.1)后轮为(-0.15, 0.1)、(-0.15, -0.1)。4. 模型验证与可视化让小车活起来4.1 语法检查写完URDF文件后第一件事是检查语法是否正确。ROS提供了方便的检查工具check_urdf urdf/smartcar.urdf如果看到类似下面的输出说明你的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_44.2 创建launch文件为了让模型能在RViz中显示我们需要创建一个launch文件launch param namerobot_description textfile$(find smartcar)/urdf/smartcar.urdf / node namerobot_state_publisher pkgrobot_state_publisher typerobot_state_publisher / node namerviz pkgrviz typerviz args-d $(find smartcar)/launch/display.rviz / /launch4.3 在RViz中查看模型启动launch文件roslaunch smartcar display.launch在RViz中需要进行以下设置将Fixed Frame改为base_link点击Add按钮添加RobotModel显示类型根据需要添加TF显示以查看坐标系如果一切正常你将在3D视图中看到一个蓝色底盘、四个黑色轮子的小车模型。用鼠标可以旋转、缩放视图从各个角度查看你的作品。5. 常见问题排查我踩过的那些坑5.1 模型显示不全或位置错误当发现轮子飘在空中或者位置不对时通常是因为origin或joint的xyz参数设置有问题。记住visual中的origin是相对于当前link坐标系的joint中的origin是父link到子link的变换5.2 RViz中看不到模型如果RViz一片空白检查以下方面确认robot_description参数加载正确检查Fixed Frame是否设置为你的根link通常是base_link查看终端是否有错误输出5.3 性能优化技巧当模型复杂时RViz可能会卡顿。几个实用优化方法简化复杂几何体的面数使用mesh代替基本几何体时选择低多边形模型在不需要时关闭不必要的显示插件6. 进阶扩展让模型更逼真6.1 添加碰撞属性目前我们的模型只有视觉表现如果要用于物理仿真需要添加碰撞属性link namewheel_1 visual !-- 视觉定义 -- /visual collision geometry cylinder radius0.05 length0.03/ /geometry origin rpy1.5708 0 0 xyz0 0 0/ /collision /link6.2 使用Xacro简化代码当模型复杂时可以使用Xacro宏来避免重复。例如定义一个轮子宏xacro:macro namewheel paramsname xyz link name${name} !-- 轮子定义 -- /link joint name${name}_joint typecontinuous parent linkbase_link/ child link${name}/ origin xyz${xyz}/ axis xyz0 1 0/ /joint /xacro:macro !-- 使用宏实例化四个轮子 -- xacro:wheel namewheel_1 xyz0.15 0.1 -0.05/ xacro:wheel namewheel_2 xyz0.15 -0.1 -0.05/ !-- 后轮省略 --6.3 添加传感器和装饰可以继续扩展模型比如添加摄像头link增加激光雷达设计车体装饰件这些扩展遵循相同的原则定义link然后用joint连接到父link上。