news 2026/10/27 10:16:37

ros2的学习

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ros2的学习

--------------------2026.10.15

1.1今天学了怎么用话题订阅接收小海龟的当前坐标位置并计算与目标位置之间的距离,通过发布者发布速度数据让小海龟走到目标位置。

1.1.1遇到问题:

编译过程遇到一个问题:cmake里节点文件的路径添加错误,没有将上级文件夹目录写入导致找不到文件

实际小海龟运动遇到一个问题:小海龟不能正确的转向并到达目标位置,一直撞墙

1.2学习怎么自定义通信接口

1.2.1创建步骤

只能用cpp版本的功能包创建消息接口,默认cmake

1.创建ros2工作空间与src文件夹 2.在工作空间的src目录终端输出:ros2 pkg create《包名》(此处可省略ament_cmake) --dependencies 《消息接口所需依赖》创建功能包 3.在刚创建的功能包的目录下创建msg文件夹(!文件夹名一定要是msg!) 4.在msg文件夹下创建消息接口文件《驼峰命名法.msg》 5.在《驼峰命名法.msg》文件下编写消息接口

插眼放图

1.2.2文件如何编写

1.所需依赖(其中msg可不写)(可在终端用ros2 inteface list | grep Time(我找的是时间戳的依赖)查看) + 自己想定义的接口名 2.cpp类型+定义的接口名

插眼放图

1.2.3在cmakelists里添加依赖与在.xml文件添加

插眼放图

1.2.4遇到的问题

插眼放图

1.3节点调用时后缀需是.hpp

---------------------2026.10.16

2.1今天学习了怎么在构建发布者功能包中去调用昨日新建的消息接口依赖来进行消息发布

今天就学了一点,散漫了有一点

2.2节点调用步骤

2.2.1和其它消息接口一样要先声明头文件

2.3期间遇到的问题

一个是一开始添加头文件找不到路径,后面发现后缀没有写成.hpp并且没有在c++拓展中添加path导致报错

-----------------------2026.10.18

3.1今天学了怎么用c++构建client和sercive,并且新建请求和响应,以及怎么调用,然后学习了如何新建一个服务通信的消息接口文件

3.2client如何构建

--

3.3sercive如何构建

--

3.4服务通信的消息接口如何构建

--

3.5遇到的问题

------------------2026.10.19

4.1今天学习了参数通信,并编写c++程序实现小海龟朝目标点巡航,并运行添加参数实时更改回调函数的程序

--

4.2小海龟巡航实现

--

4.3新建参数通信函数并进行实时更改

--------------------2026.10.20

5.1主要是学习了怎么在client客户端上通过发送请求来实现对参数的更新

5.1.1

--

5.2用python来构建launch文件,并通过launch来同时运行多个节点和打印,判断等操作

5.2.1如何用python编写launch文件

首先是在一个功能包下新建launch文件夹,再在launch文件夹下新建《名字》.launch.py文件。然后再在文件中添加launch与launch ros两个头文件-

5.2.2在cmakelists里添加复制的目录

5.2.3如何在终端中运行launch指令同时启动多节点

首先先在工作空间中运行colcon build,source install/setup.bash等指令,然后输入ros2 launch 《包名》 《launch文件名》,其中也可以直接在launch文件夹打开终端输入ros2 launch 《launch文件名》 便可运行

5.2.4launch的进阶用法及运行

5.2.5遇到的问题

------------2026.10.22

6.1主要是学习了坐标变换工具tf和rqt可视化工具的使用

比如已知机器人基坐标系base_link和雷达坐标系base_laser之间的位置关系为(0.1,0.0,0.2),雷达检测到坐标(0.3,0.0,0.0)处有障碍物,则此时因为base_link是基坐标,所以对于他来说障碍物的坐标为雷达坐标➕雷达监测的障碍物坐标(以雷达为基座标)

6.1.1通过命令行使用TF

发布一个坐标系到另一个坐标系之间的变换,例如:发布base_link到base_laser之间的变换,ros2 run tf2_ros static_transform_publisher --x 0.1 --y 0.0 --z 0.2 --roll 0.0 --pitch 0.0 --yaw 0.0 --frame_id base_link --child-frame-id base_laser

其中从x到yaw就是两个坐标系直接的坐标关系,xyz是平移,rpy是旋转。frame_id是父坐标,就是以他为基坐标,child-frame-id是子坐标,它是以父亲坐标为基的。

查看坐标可用:ros2 run tf2_ros tf2_echo base_link base_laser

然后可以安装可视化工具来可视化刚刚的坐标:sudo apt install mrpt apps

安装完后调用:3d-rotation-converter 可以打开可视化界面

若要可视化坐标关系可以通过:ros2 run tf2_tools view_frames 来生成坐标关系流程图

6.1.2通过c++发送静态坐标

用于描述不会动的静态坐标,原理即发布/tf_static话题

首先在功能包构建cpp文件,然后链接头文件和包含,声明broadcaster_ 共享指针,然后调用publish_tf()函数发送话题坐标 ,编写完成在cmakelists添加一下,具体代码如下:

6.1.3通过c++发布动态坐标

用于描述会动的动态坐标,原理即发送/tf话题

首先是跟发送静态坐标的流程一样,但是链接的头文件有所区别,静态链接的是静态坐标头文件,动态链接的是动态坐标头文件,然后声明定时器,定时发送坐标,具体代码如下:

6.1.4通过c++查询tf关系

流程跟上述一样,但链接头文件得改成listener监听类,再在public声明两个变量,buffer_和listener_,buffer_用于在固定时间接受缓存,listener_则取buffer_缓存的数据进行监听,time_负责定时器启动,然后执行回调函数,具体代码如下:

6.2学习了数据可视化工具rviz

可以在rviz2工具中显示构建的数据

6.2.1如何打开rviz2工具

在终端中输入rviz2可以打开rviz2工具

6.2.2功能介绍

可以在左下角add添加需要可视化的数据例如tf,robotmodel等

-------------2026.10.23

7.1首先是学习了ros2中的bag工具用于记录数据,及播放数据

比如可以先打开bag开始等待记录,然后启动小海龟用键盘操作他运动,bag会记录数据,记录完毕后会生成一个记录文件,后面再调用这个文件就可以重复执行刚刚小海龟的运动轨迹,这就是记录数据与播放数据

7.1.1首先是开启bag记录数据

在工作空间中打开终端然后调用ros2 bag record 《需要记录的话题类型》,例如我要记录小海龟的数据那么就是ros2 bag record /turtle/cmd_vel,然后就可以开始记录数据了

7.1.2查看生成的记录文件

可以调用ls roa*来查开生成的文件夹和记录包文件,然后可以用cat 《文件夹名》《记录包名》例如cat 《ros2bag2_2024_10_01-20_19_32_0》《记录包名》来查看内容

7.1.3播放记录的数据包

可以用ros2 bag play 《文件夹名》来播放数据包

--

7.2进阶学习了git版本控制的命令行操作指令

7.2.1运用git命令添加保存代码及回溯更改的代码

可用git diff 查看文件被改内容,用git diff 《文件名》查看指定文件并标出被改内容

7.2.2运用git命令撤回更改的代码

若代码没有添加到暂存区只是保存,可用git checkout 《文件名》撤销更改。

若添加到暂存区,可用git reset撤销暂存区的全部更改,再后加文件名即git reset 《文件名》可以撤销占存区指定文件的更改。

若代码已经提交,可先用git log打印出提交日志,然后用git reset 《上一轮提交日志》可以撤销上一轮的提交然后依次可以继续撤销上上轮。

7.2.3git分支

git的分支就是类似从当前代码再开出一条git仓库给他,各分支之间的修改互不影响

用命令行指令git branch可以查看当前有多少个分支,用git branch 《分支名》可以新建一个分支,并且可以用git checkout 《分支名》来切换到指定分支

若一个分支修改了代码比较好,而另一个分支还没有修改,可以通过分支合并来将没修改好的分支变成修改好的分支,可在需要合并其它分支的分支下调用git merge 《要与其合并的分支名》来进行合并。但是如果两个分支都修改了相同的代码,则会出现代码冲突,这需要一步步的细心去修改代码。

最后可以用git branch -D 《分支名字》来删除分支

--

8.1仿真--使用URDF创建机器人

URDF使用xml(可拓展标记语言)来描述机器人的几何结构,传感器,和执行器等信息 下面是urdf文件的编写格式

《

<?xml version=“1.0”?> 是xml的版本号

<robot name=“first_robot> robot是标签 name是它的属性

<!-- XML 注释 --> xml的注释格式

<link name="base_link"></link> link是robot下的子标签

</robot>

》

8.1.1如何通过URDF构建一个机器人

首先先构建一个功能包,然后在功能包下新建个urdf文件夹,再在urdf文件夹里构建.urdf文件。接着就是按照上面的格式来补充完整机器人的身体结构等属性

8.1.2使用工具构建urdf文件

在终端通过urdf_to_graphviz 《urdf文件》,例如urdf_to_graphviz first_robot来构建出.pdf和.gv文件,其中.pdf文件可以输出可视化的结构图

8.2在Rviz中显示机器人

可以在rviz2数据可视化工具中显示出刚刚构建的机器人的实物3D图

8.2.1通过文件在rviz2中显示

首先在终端输入rviz2打开工具,然后在左下角的add里添加robotmodel,打开后在..source中可选择是通过topic传递数据还是文件传输,因为目前还没有构建话题,所以选择打开刚刚编写好的urdf文件,就可以看到可视化的数据模型了,其中在左上方的Fixed Frame可以选择固定框架,比如选择base_link,但是不会自动加载部件的关系

8.2.2通过launch发送节点话题加载tf关系

首先是在刚刚的功能包下构建launch文件夹,在launch文件夹下构建.launch.py文件,然后在launch里提供urdf文件的路径,并将其转换为urdf文件的内容再转换为参数值内容,然后将文件内容传递给robot_state_publisher节点,该节点的作用是将urdf文件转换为tf2消息。依次,再新建一个发布节点,将urdf文件转换为joint_state消息。再新建一个发布节点,将joint_state消息发布到rviz2。最后编译构建无误后在当前工作空间通过ros2 launch 《功能包名》《.launch.py文件名》来打开rviz2,打开后source默认是topic,在下方可以选择是来自哪个功能包。

----------2026.10.24

9.1使用xacro简化urdf

xacro是基于xml的宏语言,用于简化urdf文件的创建和维护,可以用他将部件定义为宏,需要时调用即可

9.1.1创建xacro文件及编写要素

在urdf文件夹下新建一个.xacro文件,然后可以将urdf文件编写的内容复制到.xacro文件下修改。首先先在总标签添加xacro的链接

<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="first_robot">

然后xacro宏的编写规则是在一对

<xacro:macro name="base_link" params="参数1 参数2">

内容

参数格式为:${参数}

</xacro:macro>

</robot>

中编写宏,其中name为这个宏的名字,有且只能有一个,然后params则为包含的内容的可修改参数,可直接调用宏填写

9.1.2xacro宏的调用

在<robot>内容<robot>里填写,调用格式为:

<xacro:base_link 参数1=“” 参数2=“”/>

其中因为宏名只能有一个,所以要是要调用多个相同部件,可以将部件的名字设置为参数

9.1.3xacro指令的使用

可以在终端使用xacro 《.xacro文件的路径》来将.xacro文件解析成urdf文件,同理则可以在launch文件中将“cat ”替换成“xacro ”,这样就可以将路径的文件直接解析成urdf文件

然后通过命令行ros2 launch 包名 《launch文件名》model:=《需解析的xacro文件路径》,就可以解析成urdf文件并打开rviz2进行可视化展示了

--

9.2创建机器人及传感器部件

将机器人的各个部件都分成一个xacro文件,每个xacro文件复制一个部件,随后再通过一个总的xacro文件链接其它部件的文件路径,统一发送

9.2.1如何构建部件的xacro文件

首先先在urdf中新建一个.xacro文件,然后在文件中写上

<?xml version="1.0"?>

<robot xmlns:xacro="http://www.ros.org/wiki/xacro" >

<link>

部件信息

</link>

<joint>

加入关系

</joint>

</xacro:macro>

</robot>

这个结构,其中这个和一起打包的区别在于robot后不用写name

9.2.2如何链接和发送各个部件.xacro文件

首先新建一个总的.xacro文件,然后添加

<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="first_robot">

</xacro:macro>

</robot>

结构,在这个结构里进行链接和调用。然后是链接刚刚的部件文件形式为:<xacro:include filename="$(功能包名)/urdf/部件文件的路径/部件的.xacro文件">

依次链接所需要包含和调用的部件,然后再通过<xacro:base_name> 参数1="" 参数2=""

的形式进行调用即可

9.2.3通过launch来发送和打开rviz2显示

然后现在是调用我们之前写的launch文件来将urdf显示在rviz2上,:ros2 launch 包名 .launch.py文件 model:=刚刚那个总.xacro文件的文件路径

运行即可在rviz2中打开并显示构建的机器人

9.2.4给机器人添加虚拟部件

虚拟部件就是相当于给机器人能有一个视觉地的现象,因为正常来说显示的平面是以机器人的中心为基准。

操作就是在机器人主体部件的link上加多一个<link name="base_footprint"/>即可,然后在rviz2页面固定框架选择这个虚拟部件即可

9.2.5防撞属性

防撞属性就是让机器人能有在碰到物体时能感应到碰撞。

添加防撞属性操作:即在每个部件的</visual>

下添加一组

<collision>

直接复制visual的内容

</collision>

即可,然后在rviz2上勾选collision enable即可打开防撞属性

9.2.6质量与惯性

质量与惯性就是给机器人的部件加上质量属性,让它有物理层面的效应。

操作:先在总xacro文件同级目录下添加common_inertia.xacro文件,再在里面填写以下内容:

然后在每一个需要添加质量与惯性属性的部件文件中的<robot>下方添加 <xacro:include filename="$(包名)"/common_inertia.xacro文件路径/> 。 然后,再在link下调用<xacro:box_inertia m="" 参数1=“”/> 其中box为此部件的形状 参数则填部件的外形参数 m为质量。然后打开rviz2中可以在Mass Properties下勾选质量或惯性的启动

-----------2026.10.25

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/27 10:13:56

链表的相关介绍

1.链表常用技巧和操作总结 一、常用技巧&#xff1a;1.画图--->直观形象&#xff0c;便于我们理解。2.引入虚拟头结点--->便于处理边界情况&#xff0c;方便我们对链表操作。3.不要吝啬空间&#xff0c;大胆去定义变量。比如&#xff1a; 来一个变量一定义就不用考虑连接…

作者头像 李华
网站建设 2026/10/27 10:13:13

营销技能实战拆解:从用户洞察到转化率优化的完整能力指南

写一篇内容扎实的营销技能拆解并不容易&#xff0c;市面上讲“营销思维”的文章很多&#xff0c;但落到具体能学、能练、能上手的能力项&#xff0c;反而没几个人讲透。这篇内容不是一个“营销大纲”&#xff0c;而是基于我这么多年从执行到带项目的实操经验&#xff0c;把营销…

作者头像 李华