0、何为仿真
-
通过计算机对实体机器人系统进行模拟的技术。
1、为何仿真
2、仿真技术的内容与要求
-
1、【建模】学习如何创建 并 显示机器人模型
- 能够独立使用urdf创建机器人模型,并在Rviz与Gazebo中分别显示;
-
2、【搭建环境】学习如何搭建仿真环境
- 能够使用Gazebo搭建仿真环境;
-
3、【感知环境】学习如何实现机器人模型与仿真环境的交互
- 能够使用机器人模型中的传感器【相机、雷达…】获取仿真环境数据Rviz。
2.0、介绍创建ros包的流程。
2.0.1 创建工作空间【并初始化】
mkdir -p catkin_ws/src // 若创建嵌套文件夹,必须使用 -p,创建单个文件夹则不用cd catkin_ws // 进入该工作空间catkin_make // 初始化工作空间
2.0.2 创建Ros包【使用依赖】
cd src // 进入工作空间的src内catkin_create_pkg ros_test roscpp rospy std_msgs
2.0.3 编写源码
cd catkin_ws/src/ros_test/src编写 src 内的源码文件 ***.cppcd catkin_ws/src/ros_test改写 ros_test 内的 CMakeLists.txt 文件
2.0.4 编译Ros包
cd catkin_wscatkin_make
2.0.5 运行Ros包
// 新开终端,执行
roscore//另一终端执行
ca catkin_ws
source devel/setup.bash
rosrun ros_test ros_test_node // rusrun 包名 节点名
2.1 URDF
URDF是 Unified Robot Description Format 的首字母缩写,直译为 统一(标准化)机器人描述格式 ,可以以一种 XML 的方式描述机器人的部分结构,比如底盘、摄像头、激光雷达、机械臂以及不同关节的自由度…,该文件可以被 C++ 内置的解释器转换成可视化的机器人模型,是 ROS 中实现机器人仿真的重要组件。
URDF 不能单独使用,需要结合 Rviz 或 Gazebo,URDF 只是一个文件,需要在 Rviz 或 Gazebo 中渲染成图形化的机器人模型。
2.1.1 URDF 集成 Rviz 流程
- 准备: 新建功能包,导入依赖;
- 创建一个新的功能包,导入依赖 urdf xacro
mkdir -p catkin_ws/src
cd catkin_ws
catkin_makecd catkin_ws/src/
catkin_create_pkg ros_test urdf xacro
- 在当前功能包下,再新建几个目录:
-
- urdf:存储urdf文件的目录
-
- meshes:存储机器人模型渲染文件
-
- config:存储配置文件,比如 **.rviz 文件
-
- launch:存储launch启动文件
cd catkin_ws/src/ros_test
mkdir -p urdf/urdf // 此为创建均为urdf的两层目录,也可以只创建一层urdf目录
mkdir meshes
mkdir config
mkdir launch
- 核心: 编写urdf;
cd catkin_ws/src/ros_test/urdf/urdf
gedit urdf01_HelloWorld.urdf
// 填入如下内容
<robot name="mycar"><link name="base_link"><visual><geometry><box size="0.5 0.2 0.1" /></geometry></visual></link>
</robot>
robot
urdf 中为了保证 xml 语法的完整性,使用了robot标签作为根标签,
所有的 link 和 joint 以及其他标签都必须包含在 robot 标签内,在该标签内可以通过 name 属性设置机器人模型的名称1.属性
name: 指定机器人模型的名称2.子标签其他标签都是子级标签
linkurdf 中的 link 标签用于描述机器人某个部件(也即刚体部分)的外观和物理属性,比如: 机器人底座、轮子、激光雷达、摄像头...每一个部件都对应一个 link, 在 link 标签内,可以设计该部件的形状、尺寸、颜色、惯性矩阵、碰撞参数等一系列属性1.属性name ---> 为连杆命名2.子标签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 ---> 连杆的惯性矩阵在此,只演示visual使用。
案例
需求:分别生成长方体、圆柱与球体的机器人部件
<link name="base_link"><visual><!-- 形状 --><geometry><!-- 长方体的长宽高 --><!-- <box size="0.5 0.3 0.1" /> --><!-- 圆柱,半径和长度 --><!-- <cylinder radius="0.5" length="0.1" /> --><!-- 球体,半径--><!-- <sphere radius="0.3" /> --></geometry><!-- xyz坐标 rpy翻滚俯仰与偏航角度(3.14=180度 1.57=90度) --><origin xyz="0 0 0" rpy="0 0 0" /><!-- 颜色: r=red g=green b=blue a=alpha --><material name="black"><color rgba="0.7 0.5 0 0.5" /></material></visual></link>
jointurdf 中的 joint 标签用于描述机器人关节的运动学和动力学属性,还可以指定关节运动的安全极限,机器人的两个部件(分别称之为 parent link 与 child link)以"关节"的形式相连接,不同的关节有不同的运动形式: 旋转、滑动、固定、旋转速度、旋转角度限制....,比如:安装在底座上的轮子可以360度旋转,而摄像头则可能是完全固定在底座上。joint标签对应的数据在模型中是不可见的
1.属性name ---> 为关节命名type ---> 关节运动形式continuous: 旋转关节,可以绕单轴无限旋转revolute: 旋转关节,类似于 continues,但是有旋转角度限制prismatic: 滑动关节,沿某一轴线移动的关节,有位置极限planer: 平面关节,允许在平面正交方向上平移或旋转floating: 浮动关节,允许进行平移、旋转运动fixed: 固定关节,不允许运动的特殊关节2.子标签parent(必需的)parent link的名字是一个强制的属性:link:父级连杆的名字,是这个link在机器人结构树中的名字。child(必需的)child link的名字是一个强制的属性:link:子级连杆的名字,是这个link在机器人结构树中的名字。origin属性: xyz=各轴线上的偏移量 rpy=各轴线上的偏移弧度。axis属性: xyz用于设置围绕哪个关节轴运动。
案例
需求:创建机器人模型,底盘为长方体,在长方体的前面添加一摄像头,摄像头可以沿着 Z 轴 360 度旋转。
URDF文件示例如下:
<!-- 需求: 创建机器人模型,底盘为长方体,在长方体的前面添加一摄像头,摄像头可以沿着 Z 轴 360 度旋转-->
<robot name="mycar"><!-- 底盘 --><link name="base_link"><visual><geometry><box size="0.5 0.2 0.1" /></geometry><origin xyz="0 0 0" rpy="0 0 0" /><material name="blue"><color rgba="0 0 1.0 0.5" /></material></visual></link><!-- 摄像头 --><link name="camera"><visual><geometry><box size="0.02 0.05 0.05" /></geometry><origin xyz="0 0 0" rpy="0 0 0" /><material name="red"><color rgba="1 0 0 0.5" /></material></visual></link><!-- 关节 --><joint name="camera2baselink" type="continuous"><parent link="base_link"/><child link="camera" /><!-- 需要计算两个 link 的物理中心之间的偏移量 --><origin xyz="0.2 0 0.075" rpy="0 0 0" /><axis xyz="0 0 1" /></joint></robot>
launch文件示例如下:
<launch><param name="robot_description" textfile="$(find urdf_rviz_demo)/urdf/urdf/urdf03_joint.urdf" /><node pkg="rviz" type="rviz" name="rviz" args="-d $(find urdf_rviz_demo)/config/helloworld.rviz" /> <!-- 添加关节状态发布节点 --><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>
- 核心: 在launch文件集成URDF与Rviz;
- 在 launch 目录下,新建一个launch文件,该 launch 文件需要启动 Rviz,并导入 urdf 文件【此处的包名应为 ros_test】,Rviz 启动后可以自动载入解析urdf文件,并显示机器人模型,核心问题:如何导入 urdf 文件? 在 ROS 中,可以将 urdf 文件的路径设置到参数服务器,使用的参数名是:robot_description,示例代码如下:
cd catkin_ws/src/ros_test/launch
gedit urdf01_HelloWorld.launch
// 填入如下内容
<launch><!-- 设置参数 --><param name="robot_description" textfile="$(find 包名)/urdf/urdf/urdf01_HelloWorld.urdf" /><!-- 启动 rviz --><node pkg="rviz" type="rviz" name="rviz" /></launch>
- 1 显示: 在Rviz中显示机器人模型。
roslaunch ros_test urdf01_HelloWorld.launch
- 2.优化 rviz 启动
-
重复启动launch文件时,Rviz 之前的组件配置信息不会自动保存,需要重复执行步骤4的操作,为了方便使用,可以使用如下方式优化:
-
首先,将当前配置保存进config目录
// 在当前路径下:
catkin_ws/src/ros_test/config/
// 保存rivz配置文件
show_mycar.rviz
- 然后,urdf01_HelloWorld.launch文件中 Rviz 的启动配置添加参数:args,值设置为-d 配置文件路径
<launch><param name="robot_description" textfile="$(find 包名)/urdf/urdf/urdf01_HelloWorld.urdf" /><node pkg="rviz" type="rviz" name="rviz" args="-d $(find 报名)/config/rviz/show_mycar.rviz" />
</launch>
- 最后再启动时,就可以包含之前的组件配置了,使用更方便快捷。