ROS方向第二次汇报(3)

1.本方向学习内容:

1.1.URDF:

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

1.1.1.连杆Link的描述:

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

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

1.1.2.关节Joint描述:

URDF中的关节有六种运动类型。
请添加图片描述

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标签中,就形成了完整的机器人模型。
请添加图片描述

1.1.3.创建机器人模型:

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

请添加图片描述
urdf:存放机器人模型的URDF或xacro文件
meshes:放置URDF中引用的模型渲染文件
launch:保存相关启动文件
rviz:保存rviz的配置文件
模型可视化效果
我们先来看下这个模型的效果,尝试逆向分下一下机器人的结构。
执行以下命令;

$ ros2 launch learning_urdf display.launch.py

请添加图片描述
查看URDF模型结构:

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

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本还是王道

使用Ubuntu 20.04成功运行gazebo11
如上使用Ubuntu 20.04成功安装并运行gazebo11。

1.2.2.流程:

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

请添加图片描述
请添加图片描述
创建出如上图三个目录。
然后进入src文件夹

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

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

code .

请添加图片描述
成功打开vscode并导入相应目录。
tips:按ctr+shift+B快捷编译。

2.在src中创建功能包:

请添加图片描述
分别键入功能包名和依赖(不必须但一般有如下图所示几个):
请添加图片描述

请添加图片描述
请添加图片描述
创建完毕。

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

在功能包路径下创建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

给当前目录下所有py文件添加可执行权限。
查看权限:ll
请添加图片描述

修改配置文件:(新版本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
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文件夹。
请添加图片描述

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

请添加图片描述
请添加图片描述
launch文件中的根标签<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>
<node pkg="节点名" type="节点可执行文件名(不带后缀)" name="重命名节点名"
rosrun  节点名 节点可执行文件名

注意:不要在两个参数间加,这里两个参数间用空格分割

注意标签以/结束。

pkg–>功能包名
type–>节点可执行文件名(可跟上后缀.py)
name–>给节点重命名
output–>设置日志输出目标

如果没用使用launch文件,则rqt_graph中的节点名为原初始化;如果使用了launch文件,则rqt_graph中的节点名为新name。rosrun 命令用于直接运行一个包中的节点。rosrun 后面的第二个参数是节点的可执行文件名,而不是节点名。节点名通常在运行时通过命令行参数或者在节点内部指定。
如需要运行打印日志信息的节点则需要加参数output="screen".

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

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

roslaunch 功能包名 launch文件名

请添加图片描述

  • 23
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

碳酸不酸鸭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值