机器人系统仿真

ops/2024/9/24 0:25:09/

0、何为仿真

  • 通过计算机对实体机器人系统进行模拟的技术。

 
 

1、为何仿真

  • 低成本: 机器人实体一般价格昂贵,为降低机器人学习、调试的成本;
  • 高效: 搭建的环境更为多样且灵活,可以提高测试效率以及测试覆盖率;
  • 高安全性: 仿真环境下,无需要考虑耗损问题。

 
 

2、仿真技术的内容与要求

 
 

2.0、介绍创建ros包的流程。

  1. 创建工作空间

  2. 创建Ros包

  3. 编写源码

  4. 编译

  5. 运行包

 

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 流程

  1. 准备: 新建功能包,导入依赖;
  • 创建一个新的功能包,导入依赖 urdf xacro

mkdir -p catkin_ws/src
cd catkin_ws
catkin_makecd catkin_ws/src/
catkin_create_pkg ros_test urdf xacro
  • 在当前功能包下,再新建几个目录:
    • urdf:存储urdf文件的目录
    • config:存储配置文件,比如 **.rviz 文件
    • launch:存储launch启动文件
cd catkin_ws/src/ros_test
mkdir -p urdf/urdf    // 此为创建均为urdf的两层目录,也可以只创建一层urdf目录
mkdir meshes
mkdir config
mkdir launch
  1. 核心: 编写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.子标签其他标签都是子级标签

```cpp

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>
  1. 核心: 在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. 1 显示: 在Rviz中显示机器人模型。
roslaunch ros_test urdf01_HelloWorld.launch
  • rviz 启动后,会发现并没有盒装的机器人模型,这是因为默认情况下没有添加机器人显示组件,需要手动添加,添加方式如下:
    在这里插入图片描述
    在这里插入图片描述
    设置完毕后,可以正常显示了
  1. 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>
  • 最后再启动时,就可以包含之前的组件配置了,使用更方便快捷。

http://www.ppmy.cn/ops/37702.html

相关文章

Java面试八股文(MySQL篇)

数据库三范式 数据库事务介绍 索引介绍 SQL优化手段 mysql union 与 union all 语法及用法 并发事务带来的问题 大表如何优化 索引类型介绍 MYSQL数据库锁介绍

【自动驾驶|毫米波雷达】逻辑化讲清快时间与慢时间傅里叶变换

碎碎念&#xff1a;实习过程中发现在进行雷达知识交流时&#xff0c;大部分同事都会用英文简称代替中文的一些称呼&#xff0c;比如Chirp、FFT等等。起初我觉得是因为很多英伟达、TI芯片的开发教程都是英文的&#xff0c;所以看得多了大家都习惯这样称呼&#xff0c;后来在和指…

数据库命令

基础命令&#xff1a; 1.Create database 库名 创建库名 Show tables 查看库 删除: drop datebase 库名&#xff1b; 切换&#xff1a; use 库名&#xff1b; 查看表 select * from 表名 &#xff1b; Create table 表名 创建表&…

【数据结构】基于顺序表实现通讯录

世界会向那些有目标和远见的人让路。&#x1f493;&#x1f493;&#x1f493; 目录 •&#x1f319;说在前面 &#x1f34b;基于顺序表的通讯录 • &#x1f330;1.技术要点 • &#x1f330;2.通讯录流程设计 &#x1f34b;通讯录基本量设计 • &#x1f330;1.定义联系…

uniapp开发小程序使用vue的v-html解析富文本图片过大过宽显示超过屏幕解决办法

如果没有设置的话&#xff0c;就会导致图片溢出&#xff0c;过宽显示或者错位显示&#xff0c;显示效果非常的丑陋&#xff1a; 修改后显示的效果&#xff1a; 网上比较low的解决办法&#xff1a;网上各种解决方法核心思想就是在数据层把数据模板上的img数据加上style样式&…

Isaac Sim 3(学习笔记5.8)

Isaac Sim 利用深度学习获取mask掩码图 参考内容 Kubernetes官网 在 Linux 系统中安装并设置 kubectl | Kubernetes准备开始 kubectl 版本和集群版本之间的差异必须在一个小版本号内。 例如&#xff1a;v1.30 版本的客户端能与 v1.29、 v1.30 和 v1.31 版本的控制面通信。 用…

MySQL mydumper工具

目录 1. mydumper介绍 2. mydumper参数解释 3. 备份例子 3.1 备份全库(未包含其他) 3.2 备份全库(包含其他) 3.3 备份指定数据库(-B或--database) 3.4 导出指定表(-T或--tables-list) 3.5 只导出表结构&#xff0c;不导出表数据(-d或--no-data) 3.6 只导出表数据&#…

Win11任务栏通知很不明显的解决方案

Win11流行起来后&#xff0c;不少用户抱怨Win11的任务栏通知闪烁的颜色很不明显&#xff0c;经常微信来消息了看不到。虽然有右下角的微信图标会闪烁&#xff0c;但是提醒舒适度还是觉得不如Win10舒服显眼。 默认的颜色是这样子的&#xff0c;可以看得出Win11的任务栏提醒颜…