ROS方向第二次汇报(3)

文章目录

  • 1.本方向学习内容:
    • 1.1.URDF:
      • 1.1.1.连杆Link的描述:
      • 1.1.2.关节Joint描述:
      • 1.1.3.创建机器人模型:
    • 1.2.ROS1 HelloWorld实现:(暂时转向,重新学习):
      • 1.2.1.一点小插曲:
      • 1.2.2.流程:
        • 1.创建工作空间并初始化:
        • 2.在src中创建功能包:
        • 3.创建并编写代码文件:
          • 首先需要声明解释器:
          • 再进行主体编写:
          • 然后修改权限:
          • 修改配置文件:(新版本py也需要配置,不可遗漏)
        • 4.设置环境变量并运行节点:
    • 1.3.launch:
      • 1.3.1.需求:
      • 1.3.2.实现:
        • 1.3.2.1.添加launch文件夹:
        • 1.3.2.2.添加launch文件并编辑launch文件内容:
        • 1.3.2.3.运行launch文件及运行结果:

1.本方向学习内容:

1.1.URDF:

ROS专门提供了一种机器人建模方法——URDF,用来描述机器人外观、性能等各方面属性。
ROS方向第二次汇报(3)_第1张图片
ROS中的建模方法叫做URDF,全称是统一机器人描述格式,不仅可以清晰描述机器人自身的模型,还可以描述机器人的外部环境,比如这里的桌子,也可以算作一个模型。
ROS方向第二次汇报(3)_第2张图片
URDF模型文件使用的是XML格式,由一系列尖括号包围的标签和其中的属性组合而成。
在建模中,大臂和小臂就类似机器人的这些独立的刚体部分,称为连杆Link,手肘就类似于机器人电机驱动部分,称为关节joint
所以在URDF建模过程中,关键任务就是通过这里的和,理清楚每一个连杆关节的描述信息。

1.1.1.连杆Link的描述:

标签用来描述机器人某个刚体部分外观物理属性,外观包括尺寸、颜色、形状,物理属性包括质量、惯性矩阵、碰撞参数等。
ROS方向第二次汇报(3)_第3张图片
以这个机械臂连杆为例,它的link描述如下:
ROS方向第二次汇报(3)_第4张图片
link标签中的name表示该连杆的名称(link_4),我们可以自定义,未来joint连接link的时候,会使用到这个名称。
link里边的部分用来描述机器人的外观,比如:
表示几何形状,里边使用调用了一个在三维软件中提前设计好的蓝色外观,就是这个stl文件,看上去和真实机器人是一致的。
表示坐标系相对初始位置的偏移,分别是x、y、z方向上的平移,和roll、pitch、raw旋转,不需要偏移的话,就全为0。
第二个部分,描述碰撞参数,里边的内容似乎和一样,也有,看似相同,其实区别还是比较大的。

部分重在描述机器人看上去的状态,也就是视觉效果;
部分则是描述机器人运动过程中的状态,比如机器人与外界如何接触算作碰撞。
在这个机器人模型中,蓝色部分是通过来描述的,在实际控制过程中,这样复杂的外观在计算碰撞检测时,要求的算力较高,为了简化计算,我们将碰撞检测用的模型简化为了绿色框的圆柱体,也就是里边描述的形状。>坐标系偏移也是类似,可以描述刚体质心的偏移。

1.1.2.关节Joint描述:

URDF中的关节有六种运动类型。
ROS方向第二次汇报(3)_第5张图片

1.continuous,描述旋转运动,可以围绕某一个轴无限旋转,比如小车的轮子,就属于这种类型。
2.revolute,也是旋转关节,和continuous类型的区别在于不能无限旋转,而是带有角度限制,比如机械臂的两个连杆,就属于这种运动。
3.prismatic,是滑动关节,可以沿某一个轴平移,也带有位置的极限,一般直线电机就是这种运动方式。
4.fixed,固定关节,是唯一一种不允许运动的关节,不过使用还是比较频繁的,比如相机这个连杆,安装在机器人上,相对位置是不会变化的,此时使用的连接方式就是Fixed。
5.Floating是浮动关节,第六种planar是平面关节,这两种使用相对较少。
ROS方向第二次汇报(3)_第6张图片
在URDF模型中,每一个link都使用这样一段xml内容描述,比如关节的名字叫什么,运动类型是哪一种。
parent标签:描述父连杆;
child标签:描述子连杆,子连杆会相对父连杆发生运动;
origin:表示两个连杆坐标系之间的关系,也就是图中红色的向量,可以理解为这两个连杆该如何安装到一起;
axis表示关节运动轴的单位向量,比如z等于1,就表示这个旋转运动是围绕z轴的正方向进行的;
limit就表示运动的一些限制了,比如最小位置,最大位置,和最大速度等。
ROS方向第二次汇报(3)_第7张图片

最终所有的link和joint标签完成了对机器人每个部分的描述和组合,全都放在一个robot标签中,就形成了完整的机器人模型。
ROS方向第二次汇报(3)_第8张图片

1.1.3.创建机器人模型:

功能包结构:
请添加图片描述

ROS方向第二次汇报(3)_第9张图片
urdf:存放机器人模型的URDF或xacro文件
meshes:放置URDF中引用的模型渲染文件
launch:保存相关启动文件
rviz:保存rviz的配置文件
模型可视化效果
我们先来看下这个模型的效果,尝试逆向分下一下机器人的结构。
执行以下命令;

$ ros2 launch learning_urdf display.launch.py

ROS方向第二次汇报(3)_第10张图片
查看URDF模型结构:

$ urdf_to_graphviz mbot_base.urdf  # 在模型文件夹下运行

ROS方向第二次汇报(3)_第11张图片

该模型文件:

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

1.2.ROS1 HelloWorld实现:(暂时转向,重新学习):

1.2.1.一点小插曲:

暂时结束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本还是王道

ROS方向第二次汇报(3)_第12张图片
如上使用Ubuntu 20.04成功安装并运行gazebo11。

1.2.2.流程:

1.创建工作空间并初始化:
mkdir -p 自定义空间名/src //创建了两个父子文件夹
cd 自定义空间名 //跳转到目标文件夹目录
catkin_make//编译工作空间

ROS方向第二次汇报(3)_第13张图片
ROS方向第二次汇报(3)_第14张图片
创建出如上图三个目录。
然后进入src文件夹

cd src
//或者(都是相对路径)
cd ./src

启动vscode(注意需要在工作空间的路径下操作):

code .

ROS方向第二次汇报(3)_第15张图片
成功打开vscode并导入相应目录。
tips:按ctr+shift+B快捷编译。

2.在src中创建功能包:

ROS方向第二次汇报(3)_第16张图片
分别键入功能包名和依赖(不必须但一般有如下图所示几个):
请添加图片描述

请添加图片描述
ROS方向第二次汇报(3)_第17张图片
创建完毕。

3.创建并编写代码文件:

在功能包路径下创建scripts文件夹,在其下新建一个py文件

ROS方向第二次汇报(3)_第18张图片

首先需要声明解释器:
#!/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路径下打开终端。

ROS方向第二次汇报(3)_第19张图片

键入命令:

chmod +x *.py

给当前目录下所有py文件添加可执行权限。
查看权限:ll
ROS方向第二次汇报(3)_第20张图片

修改配置文件:(新版本py也需要配置,不可遗漏)

来到功能包里面的CMakeList.txt文件中,在install部分找到如下语句并放开注释:

 catkin_install_python(PROGRAMS
  scripts/my_python_script #这是文件路径
   DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
 )

my_python_script改为对应py文件名即可。ROS方向第二次汇报(3)_第21张图片
如果不配置:(无法修改代码的情况)
执行python文件时会抛出异常:
/usr/bin/env :“python”:没有那个文件或目录
原因:当前ros版本使用python3
解决方法:
1.直接声明解释器为python3(不推荐,无法修改代码时失效)
2.通过软链接 将 python 链接到 python3,通过以下命令即可:(建议)

sudo ln -s /usr/bin/python3 /usr/bin/python
4.设置环境变量并运行节点:

先按ctrl+shift+b进行编译。然后新建一个终端,运行roscore。这也是ROS1和ROS2的一大区别,ROS2可以直接运行节点,而ROS1的节点运行都会依赖于ros master(core)的控制。
配置环境变量:
打开终端,至工作空间路径,运行:

source ./devel/setup.bash

运行节点程序:

rosrun <功能包名> <节点名>

请添加图片描述
运行成功!

1.3.launch:

1.3.1.需求:

一个程序需要启动多个节点,用rosrun逐一运行效率低下。因此使用launch文件可以一次性启动多个节点:

1.3.2.实现:

1.3.2.1.添加launch文件夹:

选定功能包,添加launch文件夹。
ROS方向第二次汇报(3)_第22张图片

1.3.2.2.添加launch文件并编辑launch文件内容:

ROS方向第二次汇报(3)_第23张图片
ROS方向第二次汇报(3)_第24张图片
launch文件中的根标签可以自动启动roscore。

<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".

1.3.2.3.运行launch文件及运行结果:

先配置环境变量再执行以下命令:

roslaunch 功能包名 launch文件名

你可能感兴趣的:(ROS,python,机器人)