本章的源码和教程来源:《ROS机器人开发实践》
下面是注释的urdf代码,学起来更方便,对小白更友好。
注意:以下代码请只用来学习,要用的话直接拿书上提供的源码(别问为什么,都是用头发铺好的路,照做就是)。自己写的话千万注意urdf的格式。
<?xml version="1.0"?>
<!-- 定义一个机器人模型,名称是mrobot_chassis -->
<robot name="mrobot_chassis">
<!-- 描述底盘link,visual标签用来定义底盘的外观属性,在显示和仿真中,rviz或Gazebo会按照这里的描述将机器人模型呈现出来。 -->
<link name="base_link">
<visual>
<!-- origin声明这个底盘在三维空间内的坐标系和旋转姿态 -->
<origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
<geometry>
<!-- cylinder标签定义圆柱的半径和高 -->
<cylinder radius="0.13" length="0.005"/>
</geometry>
<!-- material声明底盘圆柱在空间内的三维坐标位置和旋转姿态 -->
<material name="yellow">
<!-- 这里面的color是黄色的RGBA值 -->
<color rgba="1.0 0.4 0.0 1.0"/>
</material>
</visual>
</link>
<!-- 定义第一个关节joint,用来连接机器人底盘和左边驱动电机 -->
<!-- joint的类型是fixed类型,这种类型的joint是固定的,不允许关节发生运动 -->
<joint name="base_left_motor_joint" type="fixed">
<!-- origin定义了joint的起点,将起点设置在需要安装电机的底盘位置,具体看下面的重点1 -->
<origin xyz="-0.055 0.075 0.0" rpy="0.0 0.0 0.0"/>
<parent link="base_link"/>
<child link="left_motor"/>
</joint>
<!-- 描述左侧电机的模型 -->
<link name="left_motor">
<visual>
<!--
重点1:
电机的的坐标位置是相对于joint计算的。
在上面的name为"base_left_motor_joint"的joint的位置坐标设置中,
已经将joint放置到了安装电机的底盘位置,所以在电机模型的坐标设置中,
不需要位置偏移,放置到坐标(0,0,0)即可。
由于圆柱体默认是垂直地面创建的,需要把圆柱体围绕x轴旋转90°,
才能称为电机的模样。
-->
<!-- 定义起点位置 -->
<origin xyz="0.0 0.0 0.0" rpy="1.5707 0.0 0.0"/>
<geometry>
<!-- 电机外观抽象成圆柱体,半径为0.02m,高为0.08m -->
<cylinder radius="0.02" length="0.08"/>
</geometry>
<!-- 定义外观颜色 -->
<material name="gray">
<color rgba="0.75 0.75 0.75 1"/>
</material>
</visual>
</link>
<!-- 定义电机和轮子之间的joint。joint的类型是continuous型,可以围绕一个轴进行旋转,适合轮子的这种模型 -->
<joint name="left_wheel_joint" type="continuous">
<!-- 起点设置到安装轮子的位置 -->
<origin xyz="0.0 0.0485 0.0" rpy="0.0 0.0 0.0"/>
<parent link="left_motor"/>
<child link="left_wheel_link"/>
<!-- axis定义joint的旋转轴是正y轴,轮子在运动时就会围绕y轴旋转 -->
<axis xyz="0.0 1 0.0"/>
</joint>
<!-- 左轮子 -->
<link name="left_wheel_link">
<visual>
<!-- 旋转90° -->
<origin xyz="0.0 0.0 0.0"rpy="1.5707 0.0 0.0"/>
<geometry>
<cylinder radius="0.033" length="0.017"/>
</geometry>
<material name="white">
<color rgba="1 1 1 0.9"/>
</material>
</visual>
</link>
<!-- 右边的关节,同上 -->
<joint name="base_right_motor_joint" type="fixed">
<!-- 右边电机的位置 -->
<origin xyz="-0.055 -0.075 0.0" rpy="0.0 0.0 0.0"/>
<parent link="base_link"/>
<child link="right_motor"/>
</joint>
<!-- 右边的电机 -->
<link name="right_motor">
<visual>
<origin xyz="0.0 0.0 0.0" rpy="1.5707 0.0 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="right_wheel_joint" type="continuous">
<origin xyz="0.0 -0.0485 0.0" rpy="0.0 0.0 0.0"/>
<parent link="right_motor"/>
<child link="right_wheel_link"/>
<axis xyz="0.0 1 0.0"/>
</joint>
<!-- 右边轮子 -->
<link name="right_wheel_link">
<visual>
<origin xyz="0.0 0.0 0.0" rpy="1.5707 0.0 0.0"/>
<geometry>
<cylinder radius="0.033" length="0.017"/>
</geometry>
<material name="white">
<color rgba="1 1 1 0.9"/>
</material>
</visual>
</link>
<!-- 前轮关节 -->
<joint name="front_castor_joint" type="fixed">
<origin xyz="0.1135 0.0 -0.0165" rpy="0.0 0.0 0.0"/>
<parent link="base_link"/>
<child link="front_castor_link"/>
<!-- 前轮绕y轴转动 -->
<axis xyz="0.0 1 0.0"/>
</joint>
<!-- 前轮 -->
<link name="front_castor_link">
<visual>
<origin xyz="0 0.0 0.0" rpy="1.5707 0.0 0.0"/>
<geometry>
<!-- 前轮是球形的 -->
<sphere radius="0.0165"/>
</geometry>
<material name="black">
<color rgba="0.0 0.0 0.0 0.95"/>
</material>
</visual>
</link>
</robot>
接下来是launch文件
<launch>
<param name="robot_description" textfile="$(find mrobot_description)/urdf/mrobot_chassis.urdf" />
<!-- 设置GUI参数,显示关节控制插件 -->
<param name="use_gui" value="true"/>
<!-- 运行joint_state_publisher节点,发布机器人的关节状态 -->
<!-- pkg定义节点所在的功能包名称,type定义节点的可执行文件,name定义节点运行的名称 -->
<node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher">
</node>
<!-- 运行robot_state_publisher节点,发布TF-->
<node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher">
</node>
<!-- 运行rviz可视化界面 -->
<node pkg="rviz" type="rviz" name="rviz" args="-d $(find mrobot_description)/config/mrobot_urdf.rviz" required="true">
</node>
</launch>
上面两个代码文件分别放到mrobot_description功能包下的urdf文件夹和launch文件夹中
然后运行
roslaunch mrobot_description display_mrobot_chassis_urdf.launch
rviz出现以下错误的话
直接将Global Options 下面的 Fixed Frame 中的map改为base_link,就可以了
然后发现没有机器人模型,点击左下角的Add,添加下面的RobotModel,可以看到模型,添加TF,可以看到坐标轴。
解决方案来源:https://blog.csdn.net/cillian_bao/article/details/116205396
总算成功了,我的头发啊,哎。
此时应响起BGM,怕什么真理无穷,进一寸有一寸的欢喜。
如果解决了您的问题,可以帮忙点个赞嘛~有能力的打赏个鸡腿钱就更好了