机器人模型:URDF文件
仿真环境模型:Gazebo
数据显示:rviz
一、URDF 与 rviz 集成使用
1 . 在工作空间中新建一个功能包:
catkin_create_pkg learning_rviz urdf xacro
2 . 在 功能包 中创建文件夹:
mkdir xx
urdf:用于放置机器人模型的urdf文件
launch:放置launch文件
meshes:放置机器人换肤文件
config:放置配置文件
3 . 编写 urdf 文件
① 在 urdf 文件夹下再创建 两个 文件夹
urdf:放置urdf文件
xacro:放置升级文件
② 在urdf文件夹下,创建urdf文件
touch robot1.urdf
输入代码:
box size:单位为m
<robot name="mycar">
<link name="base_link">
<visual>
<geometry>
<box size="0.5 0.2 0.1" />
</geometry>
</visual>
</link>
</robot>
4 . 在launch文件夹创建launch文件:
touch robot1.launch
输入代码:
<launch>
<!-- 1.在参数服务器载入urdf文件-->
<!-- textfile 在功能包的目录下,指向urdf文件-->
<param name="robot_description" textfile="$(find learning_rviz)/urdf/urdf/robot1.urdf" />
<!-- 2.启动rviz-->
<node pkg="rviz" type="rviz" name="rviz" />
</launch>
5 . 运行launch文件
roslaunch robot1.launch
6 . 在 Add 中添加 RobotModel 显示刚才创建的机器人,添加 Axes 显示全局坐标系
最后将Fixend Frame 中的map 改为前面命名的 刚体部分名称:base_link
7 . 优化launch文件:不用再手动添加model
① 点击 file 选项,save config as,保存到刚才创建的 config 文件
② 修改launch文件:
<launch>
<!-- 1.在参数服务器载入urdf文件-->
<param name="robot_description" textfile="$(find learning_rviz)/urdf/urdf/robot1.urdf" />
<!-- 2.启动rviz-->
<node pkg="rviz" type="rviz" name="rviz" args="-d $(find learning_rviz)/config/show_mycar.rviz" />
</launch>
③ 再重新启动launch文件,就已经添加好了
二、urdf文件的语法
1 . robot 标签
① 属性
name:机器人模型名称
2 . link 标签
① 属性
name:为连杆命名
② 子标签:
1 . Visual:为部件的形状,尺寸,颜色
2 . Collision:碰撞参数
3 . Inertial:惯性矩阵
visual 描述外观,数据可视化
geometry 设置连杆形状
标签1:box(盒状)
属性:size=长(x) 宽(y) 高(z)
标签2:cylinder(圆柱)
属性:radius=半径 length=高度
标签3:sphere(球体)
属性:radius=半径
标签4:mesh(为连杆添加皮肤)
属性:filename=资源路径(格式为:package://<packagename>/<path>/文件)
origin 设置偏移量与倾斜弧度
属性1:xyz=x偏移 y偏移 z偏移
属性2:rpy=x翻滚 y俯仰 z偏航(单位是弧度)
metrial 设置材料属性(颜色)
属性:name
标签:color
属性:rgba=红绿蓝权重值与透明度(每个权重值以及透明度取值[0,1])
collision 连杆的碰撞属性
inertial 连杆的惯性属性
三、link的建模
代码例程:
<!-- 需求:设置不同形状的机器人部件 -->
<robot name="mycar">
<link name="base_link">
<!-- 可视化标签 -->
<visual>
<!-- 1.形状 -->
<geometry>
<!-- 1.1 立方体 -->
<!--box size="0.3 0.2 0.1" /> -->
<!-- 1.2 圆柱 -->
<!--cylinder radius="0.1" length="2" /> -->
<!-- 1.3 球体 -->
<!-- sphere radius="1" /> -->
<!-- 1.4 皮肤 -->
<mesh filename="package://learning_rviz/meshes/autolabor_mini.stl" />
</geometry>
<!-- 2.偏移量与倾斜弧度 -->
<!--
xyz 设置机器人模型在 x y z 上的偏移量
rpy 设置机器人模型的倾斜弧度 x翻滚 y俯仰-(侧倾) z偏航
-->
<origin xyz="0 0 0" rpy="1.57 0 0" />
<!-- 3.颜色 -->
<!--
rgba:三原色加上透明度:取值均为0-1
-->
<material name="car_color">
<color rgba="0 0 1 0.5" />
</material>
</visual>
</link>
</robot>
四、joint建模
1.属性
name 关节命名
type 关节运动形式
continuous 旋转关节,可以绕单轴无限旋转
revolute 旋转关节,类似与continuous,但是有旋转角度限制
prismatic 滑动关节,沿着某一轴线移动的关节,有位置极限
planer 平面关节,允许在平面正交方向上平移或者旋转
floating 浮动关节,允许进行平移、旋转运动
fixed 固定关节,不允许运动的特殊关节
2.子标签
parent(必须的)
parent link 的名字是一个强制属性:
link:父级连杆的名字,是这个link在机器人结构树中的名字
child(必须的)
child link 的名字是一个强制的属性:
link:子级连杆的名字,是这个link在机器人结构树中的名字
origin
属性:xyz=各轴线上的偏移量 rpy=各轴线上的偏移弧度
axis
属性:xyz用于设置围绕哪个关节轴运动
3 . 代码例程:
<!-- 设置机器人底盘,并添加摄像头-->
<robot name="mycar">
<!-- 添加一个尺寸极小的link,再去关联初始 link 与 base_link,
关节的高度刚好与base_link下沉的高度相同
-->
<link name="base_footprint">
<visual>
<geometry>
<box size="0.001 0.001 0.001" />
</geometry>
</visual>
</link>
<!-- 1.底盘link-->
<link name="base_link">
<visual>
<geometry>
<box size="0.3 0.2 0.1" />
</geometry>
<origin xyz="0 0 0" rpy="0 0 0" />
<material name="car_color">
<color rgba="0.8 0.5 0 0.5" />
</material>
</visual>
</link>
<!-- 2.摄像头link-->
<link name="camera">
<visual>
<geometry>
<box size="0.02 0.05 0.05" />
</geometry>
<!-- 先默认使用,后期需要更改-->
<origin xyz="0 0 0.025" rpy="0 0 0" />
<material name="camera_color">
<color rgba="0 0 1 0.5" />
</material>
</visual>
</link>
<!-- 关联 base_footprint 与 base_link -->
<joint name="link2footprint" type="fixed">
<!-- 父级 link-->
<parent link="base_footprint" />
<!-- 子级 link-->
<child link="base_link" />
<!-- 设置偏移量-->
<origin xyz="0 0 0.025" rpy="0 0 0" />
</joint>
<!-- 3.关节-->
<joint name="camera2base" type="continuous">
<!-- 父级 link-->
<parent link="base_link" />
<!-- 子级 link-->
<child link="camera" />
<!-- 设置偏移量-->
<origin xyz="0.12 0 0.05" rpy="0 0 0" />
<!-- 设置关节旋转参考的坐标轴-->
<axis xyz="0 0 1" />
</joint>
</robot>
五、URDF练习
1 . 在URDF文件夹中,创建.urdf文件
touch robot.urdf
代码:
<!-- 设置机器人底盘-->
<robot name="mycar">
<!--
添加一个尺寸极小的link,再去关联初始 link 与 base_link,
关节的高度刚好与base_link下沉的高度相同
通常偏移都靠 link 偏移
-->
<link name="base_footprint">
<visual>
<geometry>
<sphere radius="0.001" />
</geometry>
</visual>
</link>
<!-- 1.底盘link-->
<link name="base_link">
<visual>
<geometry>
<cylinder radius="0.1" length="0.08" />
</geometry>
<origin xyz="0 0 0" rpy="0 0 0" />
<material name="car_color">
<color rgba="1.0 0.5 0 0.5" />
</material>
</visual>
</link>
<!-- 关联 base_footprint 与 底盘base_link -->
<joint name="link2footprint" type="fixed">
<!-- 父级 link-->
<parent link="base_footprint" />
<!-- 子级 link-->
<child link="base_link" />
<!-- 设置偏移量-->
<origin xyz="0 0 0.055" rpy="0 0 0" />
</joint>
<!-- 2.驱动轮link-->
<link name="left_wheel">
<visual>
<geometry>
<cylinder radius="0.0325" length="0.015" />
</geometry>
<!-- 先默认使用,后期需要更改-->
<origin xyz="0 0 0" rpy="1.5708 0 0" />
<material name="left_wheel_color">
<color rgba="0 0 0 0.5" />
</material>
</visual>
</link>
<link name="right_wheel">
<visual>
<geometry>
<cylinder radius="0.0325" length="0.015" />
</geometry>
<!-- 先默认使用,后期需要更改-->
<origin xyz="0 0 0" rpy="1.5708 0 0" />
<material name="right_wheel_color">
<color rgba="0 0 0 0.5" />
</material>
</visual>
</link>
<!-- 3.驱动轮joint-->
<joint name="left_wheel2base" type="continuous">
<!-- 父级 link-->
<parent link="base_link" />
<!-- 子级 link-->
<child link="left_wheel" />
<!-- 设置偏移量-->
<origin xyz="0 0.1 -0.0225" rpy="0 0 0" />
<!-- 设置关节旋转参考的坐标轴-->
<axis xyz="0 1 0" />
</joint>
<joint name="right_wheel2base" type="continuous">
<!-- 父级 link-->
<parent link="base_link" />
<!-- 子级 link-->
<child link="right_wheel" />
<!-- 设置偏移量-->
<origin xyz="0 -0.1 -0.0225" rpy="0 0 0" />
<!-- 设置关节旋转参考的坐标轴-->
<axis xyz="0 1 0" />
</joint>
<!-- 4.万向轮link-->
<link name="front_wheel">
<visual>
<geometry>
<sphere radius="0.0075" />
</geometry>
<!-- 先默认使用,后期需要更改-->
<origin xyz="0 0 0" rpy="0 0 0" />
<material name="front_wheel_color">
<color rgba="1 0 0 0.5" />
</material>
</visual>
</link>
<link name="back_wheel">
<visual>
<geometry>
<sphere radius="0.0075" />
</geometry>
<!-- 先默认使用,后期需要更改-->
<origin xyz="0 0 0" rpy="0 0 0" />
<material name="back_wheel_color">
<color rgba="1 0 0 0.5" />
</material>
</visual>
</link>
<!-- 5.万向轮joint-->
<joint name="front_wheel2base" type="continuous">
<!-- 父级 link-->
<parent link="base_link" />
<!-- 子级 link-->
<child link="front_wheel" />
<!-- 设置偏移量-->
<origin xyz="0.08 0 -0.0475" rpy="0 0 0" />
<!-- 设置关节旋转参考的坐标轴-->
<axis xyz="0 1 0" />
</joint>
<joint name="back_wheel2base" type="continuous">
<!-- 父级 link-->
<parent link="base_link" />
<!-- 子级 link-->
<child link="back_wheel" />
<!-- 设置偏移量-->
<origin xyz="-0.08 0 -0.0475" rpy="0 0 0" />
<!-- 设置关节旋转参考的坐标轴-->
<axis xyz="0 1 0" />
</joint>
</robot>
2 . 创建 .launch 文件
<launch>
<!-- 1.在参数服务器载入urdf文件-->
<param name="robot_description" textfile="$(find learning_rviz)/urdf/urdf/robot.urdf" />
<!-- 2.启动rviz-->
<node pkg="rviz" type="rviz" name="rviz" args="-d $(find learning_rviz)/config/show_mycar.rviz" />
<!--
只有上述两条语句:
表现:摄像头显示位置与颜色异常
提示:No transform from [camera] to [base_link] 缺少 camera 到 base_link 的坐标转换
原因:rviz 中显示URDF 时,必须发布不同部件之间的 坐标系 关系
解决:ROS 提供了关于机器人模型显示的坐标发布相关节点(节点)
-->
<!-- 关节状态发布节点 -->
<node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" />
<!-- 机器人状态发布节点 -->
<node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" />
<!-- 添加控制关节运动的节点-->
<node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher_gui" />
</launch>
六、URDF工具
check_urdf xx.urdf命令可以检查复杂的 urdf 文件是否存在问题
urdf_to_graphiz xx.urdf命令可以查看 urdf 模型结构,显示不容link的层级关系
安装:sudo apt install liburdfdom-tools