ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

鱼香ros2(二十二)机器人建模

鱼香ros2(二十二)机器人建模

一、机器人建模与仿真的概述

1、概述:

在实际开发过程中将算法和程序部署到真实的机器人之前,往往会采用仿真的机器人进行验证,毕竟不用担心仿真机器人没电或者磕碰到。在没有实体机器人时,仿真依赖是一个不错的选择,但仿真前需要先对我们要仿真的机器人进行建模,因此我们先从建模学起。动手创建一个机器人,然后在软件中完成对该机器人的硬件的仿真。

2、移动机器人结构介绍:

机器人,以扫地机来介绍,是移动机器人。本章的机器人建模仿真就是以常见的机器人用例来学习的。对扫地机器人来说,要完成清扫工作,首先你要有执行器来执行动作(依靠轮子进行移动,依靠刷子进行清扫……),还需要传感器来感知环境(通过相机来识别地毯,通过距离传感器来规避障碍物),对于一个移动机器人来说,常用的执行器就是轮子,依靠轮子才能完成移动,而常用的传感器种类颇多,比如说可以测量距离的激光雷达、超声波和深度相机的传感器、测量轮子速度的轮式编码器、测量加速度信息的惯性传感器……除此之外,还有图像、电量和红外等常见传感器。

在机器人中只有传感器和执行器是不够的,我们还需要一个控制系统,根据传感器的数据进行决策后,然后控制执行器来完成工作,比如控制系统就是通过超声波传感器获取到前方有障碍物的信息,此时就可以控制轮子停下并转向。控制系统的工作流程图如上。

除了控制系统、执行器和传感器之外,机器人还有一些其他的装置,在流程图中没有展示,比如说电源和外壳等等,这些装置之间协调工作,才能使机器人自主完成各种任务,因为控制系统通常由计算机或者微控制器来实现的,所以对于仿真机器人来说,只需要对机器人的传感器、还有执行器以及环境进行仿真即可。

3、常用机器人的仿真平台:

机器人仿真——就是用软件来模拟硬件,在机器人中指的就是各种执行器、传感器及环境。环境仿真指的是对机器人的作业场景、作业对象的仿真,常见的场景比如说工厂、居住环境、甚至水底。本节将对支持ros2且常用的机器人仿真平台进行介绍。

1)Gazebo:

由ros社区开源的一款机器人仿真软件,Gazebo不仅支持多种传感器和执行器,还可以模拟机器人的常用环境的运动和交互。因为Gazebo本身是ROS社区出身,所以Gazebo对ROS的支持无疑是非常友好的,随着ROS的发展,Gazebo也分出了两个不同的分支,第一个是早期的稳定分支——Gazebo Classic,第二个则是技术更为先进和经过优化的Gazebo Harmonic。

但截止《ros2机器人开发从入门到实践》编写及小鱼视频录制时,Gazebo Harmonic的资料较少且不稳定,不适合入门使用。

2)WeBots:

由Cyberbotics维护的机器人仿真软件,WeBots不仅支持多个操作系统和编程语言(C++、Python、Java……),还提供了大量的开箱即用的机器人仿真模型以及场景资源,WeBots提供了自动驾驶仿真机器人及场景。

3)CoppeliaSim:

前身是V-REP(Virtual Robot Experimentation Platform),CoppeliaSim和WeBots相似,都支持多个平台和编程语言,对多种传感器和执行器的支持也非常友好。

4)其他:

除了上面三个外,ROS2 还支持 unity 3D和MATLAB/Simulink等平台,虽然仿真平台有很多且各有利弊,但入门,Gazebo对Ros的支持最友好,而Gazebo Classic较为稳定,所以后续我们将使用Gazebo Classic来完成机器人的仿真。

二、使用URDF创建机器人

仿真的第一步就是要完成一个机器人的建模,虽然不同的仿真平台有着不同的建模语言,但几乎都支持URDF,URDF——通用的机器人描述文件格式,本节使用URDF来完成一个移动机器人的模型。

1、URDF介绍:

URDF使用XML(Extensible Markup Language,可扩展标记语言)来描述机器人的几何结构、传感器和执行器等信息。

文件格式:

<?xml version="1.0"?>

<robot name="first_robot">

<!--XML注释-->

<link name="base_link"></link>

</robot>

<?xml version="1.0"?>:当前文件符合Xml1.0的规范,是一个XML格式的文件。

<robot……</robot>:标签,name="first_robot":标签的属性。

<link name="base_link"></link>:robot的一个子标签。

这一段URDF的意思是:定义一个名字为first_robot的机器人,机器人有一个名为base_link的部件。

2、创建功能包

ros2 pkg create bot_description --build-type ament_cmake --license Apache-2.0

创建功能包的时候不需要添加任何的依赖,因为URDF本身就不需要使用任何客户端库,所有就没有添加任何依赖。

3、编写:

一般情况下,我们会把机器人的模型文件会放到功能包的urdf文件夹下。

base_link和imu_link怎么固定的呢?假如我们把base_link当做机器人的几何中心,imu_link一般我们会把他放到机器人的几何中心,所以我们要把imu_link固定到base_link上面,因此用到机器人的关节(用来组合机器人的部件)。

type="revolute":关节类型,能动还是不可以动,fixed——固定死的。

<parent link="base_link"/> 、<child link="imu_link"/>:父子标签,标识将imu_link固定到base_link上。

4、关系结构可视化:

urdf_to_graphviz first_robot.urdf

三、在Rviz中显示机器人:

1、打开Rviz:

rviz2

2、使用urdf:

3、问题解决:

1)base_link的TF报错问题:

2)imu_link TF报错问题:

imu_link和base_link的关系从哪里来呢?不需要我们手动去发布,也不需要手动去写代码,因为我们在urdf中已经描述了,我们可以使用率另外两个组件加载urdf文件,然后自动的去发布他们坐标间的关系。

Ros2为我们提供了两个组件,一个是/robot_state_publisher,还一个/joint_state_publisher 。

/robot_state_publisher:运行起来后是个节点,你需要给他提供urdf文件路径,它会把文件加载到他节点里面,然后把文件内容通过/robot_description话题发布出去,同时会扫描urdf文件的内容,然后去找到/tf (比如这里我们把imu_link和base_link通过不是fixed,不是固定的一个关节,变动的,这时就会通过这个话题把他们两个间的坐标关系发布出去)、/tf_static(比如这里我们把imu_link和base_link通过fixed固定的一个关节,这时就会通过这个话题把他们两个间的坐标关系发布出去)。

/joint_state_publisher:数据来源,订阅/robot_description话题,去自动扫描urdf中所有的动态的关系,然后把他们的关节的数值通过/joint_states话题给发布出去,然后/robot_state_publisher再去订阅这关节的数值,把他复制到/tf(动态TF再发布出去)。

解决:

①安装插件:

sudo apt install ros-$ROS_DISTRO-joint-state-publisher

sudo apt install ros-$ROS_DISTRO-robot-state-publisher

②编写launch:

因为要同时启动多个话题,所以用launch来管理,里面有太多原理的东西了,只能看我的代码备注,后续遇到可以直接使用。

以上代码运行中,如果遇到问题可以使用:

ros2 launch display_robot.launch.py --debug

查看BUG。

launch写完后,可以source,下,然后使用launch文件

ros2 launch bot_description display_robot.launch.py

③配置中arguments和parameters区别:

parameters:只将参数数据传递给节点的键值对(ros2 run rviz2 rviz2 --ros-args -p ***: =***value)

arguments:是命令行+东西(例如:ros2 run rviz2 rviz2 -d ****)

3)保存配置

四、使用Xacro简化URDF

1、Xacro介绍:

Xacro(XML Macro)是基于XML的宏语言,用于简化URDF文件的创建和维护。使用它可以将部件等定义为宏,在需要使用的时候进行调用即可。

2、编写:

xmlns:xacro="http://www.ros.org/wiki/xacro"——xmlns:表示命令空间;xacro——用这个命令空间;http://www.ros.org/wiki/xacro——网址。之后就可以使用xacro来代替这些。用来告诉大家,这个URDF使用了xacro宏语言。

3、使用

1)先转换为URDF格式:

安装工具:sudo apt install ros-$ROS_DISTRO-xacro

使用:xacro 绝对路径

转换成功

2)修改launch文件:

3)运行:

colcon build

source install/setup.bash

ros2 launch bot_description display_robot.launch.py model:=/home/gaolu/learn_ws/chapt6/chapt6_ws/src/bot_description/urdf/first_robot.xacro

五、创建机器人及传感器部件

1、FishBot机器人模型:

创建机器人身体部分以及传感器部分,传感器部分主要有imu、雷达还有相机这三部分组成。

2、编写base:

3、编写imu:

4、编写camera:

5、编写laser:

6、编写fishbot:

7、转换:

8、运行:

六、完善机器人执行器部件

1、FishBot介绍:

FishBot分为多个系列,其中最基础的系列为拥有两个驱动轮的差速模型,只有两个轮子没办法保持直立,所以一般都会采用万向轮作为支撑轮子来使用。我们采用圆柱表示驱动轮,球体表示外向轮,接下来我们分别创建驱动轮和外向轮作为机器人的执行器,就是可以动的这一部分。

2、编写wheel:

3、编写caster:

4、修改fishbot:

5、运行:

colcon build

ros2 launch bot_description display_robot.launch.py model:=/home/gaolu/learn_ws/chapt6/chapt6_ws/src/bot_description/urdf/fishbot/fishbot.urdf.xacro

七、贴合地面,添加虚拟部件

1、为什么添加:

在rviz中,我们的base_link是固定到整个机器人的中心的,作为一个固定坐标系,此时我们的轮子跑到地面下面了,这样不符合实际情况,因此我们要把轮子调整到水平面上,这里我们就可以通过添加虚拟部件来解决这个问题,所谓虚拟部件,是有link,也有joint,但是没有实体(内容),也看不到的这样一个部件。

2、编写:

3、运行:

八、添加碰撞属性

1、为什么添加?

上节完成了机器人各组件的建模,让机器人看起来像那么一回事,但还少了一些物理属性,真正的机器人部件是有重量的,也会有惯性,机器人的关节肯定是有力矩的。我们接下来给机器人添加物理属性。

在实际的仿真中当机器人与其他物体进行接触时,难免会发生碰撞,比如轮子和地面接触,也可以视为一种碰撞,所以为了能让机器人和其他物体交互时,更加准确和安全,就需要给机器人部件添加碰撞属性,可以直接在link部件下添加collision标签来添加碰撞属性,建议每个部件都添加。

2、为每个部件添加碰撞属性:

在每个urdf文件里的visual标签下添加<collision>标签,标签内容和当前文件的<visual>标签内容一致。

3、运行:

4、查看:

九、添加质量与惯性

1、为什么?

为机器人部件添加质量与惯性,真是的机器人部件肯定是有质量的,既然有质量,那么在运动的时候就会有惯性。质量可以直接使用多少千克表示,而旋转惯性则需要使用一个3*3的矩阵表示。

2、编写common_inertial.xacro

3、修改各部分urdf

以base.urdf.xacro为例

引入文件:

<xacro:include filename="$(find bot_description)/urdf/fishbot/common_inertial.xacro"/>

使用文件:

<xacro:cylinder_inertia m="1.0" r="${radius}" h="${length}"/>

依次为其他各部件添加质量和惯性,只是要记得区分惯性的形状,base是圆柱的用的是cylinder_inertia;对应球使用sphere_inertia;长方体、正方体使用box_inertia;

4、运行:

5、查看:

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进