ROS专门提供了一种机器人建模方法——URDF,用来描述机器人外观、性能等各方面属性。
ROS中的建模方法叫做URDF,全称是统一机器人描述格式,不仅可以清晰描述机器人自身的模型,还可以描述机器人的外部环境,比如这里的桌子,也可以算作一个模型。
URDF模型文件使用的是XML格式,由一系列尖括号包围的标签和其中的属性组合而成。
在建模中,大臂和小臂就类似机器人的这些独立的刚体部分,称为连杆Link
,手肘就类似于机器人电机驱动部分,称为关节joint
。
所以在URDF建模过程中,关键任务就是通过这里的和,理清楚每一个连杆和关节的描述信息。
标签用来描述机器人某个刚体部分的外观和物理属性,外观包括尺寸、颜色、形状,物理属性包括质量、惯性矩阵、碰撞参数等。
以这个机械臂连杆为例,它的link描述如下:
link标签中的name表示该连杆的名称(link_4),我们可以自定义,未来joint连接link的时候,会使用到这个名称。
link里边的
部分用来描述机器人的外观,比如:
表示几何形状,里边使用
调用了一个在三维软件中提前设计好的蓝色外观,就是这个stl文件,看上去和真实机器人是一致的。
表示坐标系相对初始位置的偏移,分别是x、y、z方向上的平移,和roll、pitch、raw旋转,不需要偏移的话,就全为0。
第二个部分
,描述碰撞参数,里边的内容似乎和
一样,也有
和
,看似相同,其实区别还是比较大的。
部分重在描述机器人看上去的状态,也就是视觉效果;
部分则是描述机器人运动过程中的状态,比如机器人与外界如何接触算作碰撞。
在这个机器人模型中,蓝色部分是通过
来描述的,在实际控制过程中,这样复杂的外观在计算碰撞检测时,要求的算力较高,为了简化计算,我们将碰撞检测用的模型简化为了绿色框的圆柱体,也就是
里边
描述的形状。
1.continuous,描述旋转运动,可以围绕某一个轴无限旋转,比如小车的轮子,就属于这种类型。
2.revolute,也是旋转关节,和continuous类型的区别在于不能无限旋转,而是带有角度限制,比如机械臂的两个连杆,就属于这种运动。
3.prismatic,是滑动关节,可以沿某一个轴平移,也带有位置的极限,一般直线电机就是这种运动方式。
4.fixed,固定关节,是唯一一种不允许运动的关节,不过使用还是比较频繁的,比如相机这个连杆,安装在机器人上,相对位置是不会变化的,此时使用的连接方式就是Fixed。
5.Floating是浮动关节,第六种planar是平面关节,这两种使用相对较少。
在URDF模型中,每一个link都使用这样一段xml内容描述,比如关节的名字叫什么,运动类型是哪一种。
parent标签:描述父连杆;
child标签:描述子连杆,子连杆会相对父连杆发生运动;
origin:表示两个连杆坐标系之间的关系,也就是图中红色的向量,可以理解为这两个连杆该如何安装到一起;
axis表示关节运动轴的单位向量,比如z等于1,就表示这个旋转运动是围绕z轴的正方向进行的;
limit就表示运动的一些限制了,比如最小位置,最大位置,和最大速度等。
最终所有的link和joint标签完成了对机器人每个部分的描述和组合,全都放在一个robot标签中,就形成了完整的机器人模型。
urdf:存放机器人模型的URDF或xacro文件
meshes:放置URDF中引用的模型渲染文件
launch:保存相关启动文件
rviz:保存rviz的配置文件
模型可视化效果
我们先来看下这个模型的效果,尝试逆向分下一下机器人的结构。
执行以下命令;
$ ros2 launch learning_urdf display.launch.py
$ urdf_to_graphviz mbot_base.urdf # 在模型文件夹下运行
该模型文件:
<robot name="mbot">
<link name="base_link">
<visual>
<origin xyz=" 0 0 0" rpy="0 0 0" />
<geometry>
<cylinder length="0.16" radius="0.20"/>
geometry>
<material name="yellow">
<color rgba="1 0.4 0 1"/>
material>
visual>
link>
<joint name="left_wheel_joint" type="continuous">
<origin xyz="0 0.19 -0.05" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="left_wheel_link"/>
<axis xyz="0 1 0"/>
joint>
<link name="left_wheel_link">
<visual>
<origin xyz="0 0 0" rpy="1.5707 0 0" />
<geometry>
<cylinder radius="0.06" length = "0.025"/>
geometry>
<material name="white">
<color rgba="1 1 1 0.9"/>
material>
visual>
link>
<joint name="right_wheel_joint" type="continuous">
<origin xyz="0 -0.19 -0.05" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="right_wheel_link"/>
<axis xyz="0 1 0"/>
joint>
<link name="right_wheel_link">
<visual>
<origin xyz="0 0 0" rpy="1.5707 0 0" />
<geometry>
<cylinder radius="0.06" length = "0.025"/>
geometry>
<material name="white">
<color rgba="1 1 1 0.9"/>
material>
visual>
link>
<joint name="front_caster_joint" type="continuous">
<origin xyz="0.18 0 -0.095" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="front_caster_link"/>
<axis xyz="0 1 0"/>
joint>
<link name="front_caster_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<sphere radius="0.015" />
geometry>
<material name="black">
<color rgba="0 0 0 0.95"/>
material>
visual>
link>
<joint name="back_caster_joint" type="continuous">
<origin xyz="-0.18 0 -0.095" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="back_caster_link"/>
<axis xyz="0 1 0"/>
joint>
<link name="back_caster_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<sphere radius="0.015" />
geometry>
<material name="black">
<color rgba="0 0 0 0.95"/>
material>
visual>
link>
robot>
暂时结束ROS2的学习,开始学习ROS1。Ubuntu22.04对ROS1的适配非常不友好,于是又上网查找资源完成了20.04版本的安装与设置,并成功安装了ROS1。本打算学习gazebo的相关知识,但gazebo11无法安装到arm64架构的22.04虚拟机上,总是会出现安装列表中找不到该包的bug,我多方查找资料(由于家中DDS污染无法使用github(还未解决),又无法到油管上外网搜索教程),却发现国内(51CTO、CSDN、bili上)的解决方法无一适用,而且它们的教程多是针对amd64(inter芯片)来展开的,所以目前放弃了22版本的虚拟机。
看了ROS1的简介,发现它与ROS2大体相同,却仍然需要进行系统学习。古月居的ROS入门21讲显然没有ROS2入门21讲做的用心,但我发现了另外一个系列的课程《Autolabor初级教程》,该教程使用两种语言并行讲解课程内容,细致入微,适合小白及初学者。
忙活了一天(早上9:00-晚上6:00),看了无数教程,却还是敌不过软件适配的困难。由此可见,在学习之初,选择开发环境应“随大众,拒小众”,把大量时间浪费在环境的适配和教程的寻找上,不值得。除需要满足纯软件开发、视频剪辑等特殊需求之外,使用win本还是王道。
如上使用Ubuntu 20.04成功安装并运行gazebo11。
mkdir -p 自定义空间名/src //创建了两个父子文件夹
cd 自定义空间名 //跳转到目标文件夹目录
catkin_make//编译工作空间
cd src
//或者(都是相对路径)
cd ./src
启动vscode(注意需要在工作空间的路径下操作):
code .
成功打开vscode并导入相应目录。
tips:按ctr+shift+B
快捷编译。
在功能包路径下创建scripts
文件夹,在其下新建一个py文件
#!/usr/bin/env python
下面是两种常见的声明解释器的方式:
对于Unix/Linux系统,可以在脚本文件的第一行添加以下内容:#!/usr/bin/env python3
。其中python3表示使用Python 3版本的解释器。
对于Windows系统,可以在脚本文件的第一行添加以下内容:#!C:\path\to\python.exe
。其中C:\path\to\python.exe
需要根据安装路径进行相应修改。
当然,还有其他更多的选项可供选择,比如使用不同的Python版本、自定义解释器等。
#!/usr/bin/env python
import rospy #导包
if __name__=="__main__": #程序入口
#初始化ros节点(括号里是节点名)
rospy.init_node("hello_p")
#输出日志
rospy.loginfo("hello vscode!这是![请添加图片描述](https://img-blog.csdnimg.cn/direct/ede6e7d8063941c2b13209ea66d6755a.png)
python")
在scripts路径下打开终端。
键入命令:
chmod +x *.py
来到功能包里面的CMakeList.txt
文件中,在install部分找到如下语句并放开注释:
catkin_install_python(PROGRAMS
scripts/my_python_script #这是文件路径
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
将my_python_script
改为对应py文件名即可。
如果不配置:(无法修改代码的情况)
执行python文件时会抛出异常:
/usr/bin/env :“python”:没有那个文件或目录
原因:当前ros版本使用python3
解决方法:
1.直接声明解释器为python3(不推荐,无法修改代码时失效)
2.通过软链接 将 python 链接到 python3,通过以下命令即可:(建议)
sudo ln -s /usr/bin/python3 /usr/bin/python
先按ctrl+shift+b
进行编译。然后新建一个终端,运行roscore
。这也是ROS1和ROS2的一大区别,ROS2可以直接运行节点,而ROS1的节点运行都会依赖于ros master(core)的控制。
配置环境变量:
打开终端,至工作空间路径,运行:
source ./devel/setup.bash
运行节点程序:
rosrun <功能包名> <节点名>
一个程序需要启动多个节点,用rosrun逐一运行效率低下。因此使用launch文件可以一次性启动多个节点:
<launch>
<node pkg="turtlesim" type="turtlesim_node" name="turtle_GUI"/>
<node pkg="turtlesim" type="turtle_teleop_key" name="turtle_key"/>
<node pkg="hello_vscode" type="hello_vscode_p" name="my_hello" output="screen"/>
launch>
注意:不要在两个参数间加,
这里两个参数间用空格分割
注意标签以/
结束。
pkg–>功能包名
type–>节点可执行文件名(可跟上后缀.py)
name–>给节点重命名
output–>设置日志输出目标
如果没用使用launch文件,则rqt_graph中的节点名为原初始化;如果使用了launch文件,则rqt_graph中的节点名为新name。rosrun 命令用于直接运行一个包中的节点。rosrun 后面的第二个参数是节点的可执行文件名,而不是节点名。节点名通常在运行时通过命令行参数或者在节点内部指定。
如需要运行打印日志信息的节点则需要加参数output="screen"
.
先配置环境变量再执行以下命令:
roslaunch 功能包名 launch文件名