![](https://img-blog.csdnimg.cn/20210301220202247.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
ROS入门-理论与实践
文章平均质量分 56
零基础学习的ROS教程,有手就行——《ROS入门-理论与实践》
赵虚左
这个作者很懒,什么都没留下…
展开
-
5.1.2 静态坐标变换
ROS入门 5.1.2 静态坐标变换《ROS入门-理论与实践》视频教程镇楼所谓静态坐标变换,是指两个坐标系之间的相对位置是固定的。需求描述:现有一机器人模型,核心构成包含主体与雷达,各对应一坐标系,坐标系的原点分别位于主体与雷达的物理中心,已知雷达原点相对于主体原点位移关系如下: x 0.2 y0.0 z0.5。当前雷达检测到一障碍物,在雷达坐标系中障碍物的坐标为 (2.0 3.0 5.0),请问,该障碍物相对于主体的坐标是多少?结果演示:实现分析:坐标系相对关系,可以通过发布方发布原创 2021-03-21 21:57:10 · 1331 阅读 · 2 评论 -
5.1.1 坐标msg消息
ROS入门 5.1.1 坐标msg消息《ROS入门-理论与实践》视频教程镇楼订阅发布模型中数据载体 msg 是一个重要实现,首先需要了解一下,在坐标转换实现中常用的 msg:geometry_msgs/TransformStamped和geometry_msgs/PointStamped前者用于传输坐标系相关位置信息,后者用于传输某个坐标系内坐标点的信息。在坐标变换中,频繁的需要使用到坐标系的相对关系以及坐标点信息。1.geometry_msgs/TransformStamped命令行键入:原创 2021-03-21 21:55:51 · 343 阅读 · 0 评论 -
5.1 TF坐标变换
ROS入门 5.1 TF坐标变换《ROS入门-理论与实践》视频教程镇楼机器人系统上,有多个传感器,如激光雷达、摄像头等,有的传感器是可以感知机器人周边的物体方位(或者称之为:坐标,横向、纵向、高度的距离信息)的,以协助机器人定位障碍物,可以直接将物体相对该传感器的方位信息,等价于物体相对于机器人系统或机器人其它组件的方位信息吗?显示是不行的,这中间需要一个转换过程。更具体描述如下:场景1:雷达与小车现有一移动式机器人底盘,在底盘上安装了一雷达,雷达相对于底盘的偏移量已知,现雷达检测到一障碍物原创 2021-03-21 21:55:16 · 1152 阅读 · 0 评论 -
第 5 章 ROS常用组件
第 5 章 ROS常用组件《ROS入门-理论与实践》视频教程镇楼在ROS中内置一些比较实用的工具,通过这些工具可以方便快捷的实现某个功能或调试程序,从而提高开发效率,本章主要介绍ROS中内置的如下组件:TF坐标变换,实现不同类型的坐标系之间的转换;rosbag 用于录制ROS节点的执行过程并可以重放该过程;rqt 工具箱,集成了多款图形化的调试工具。本章预期达成的学习目标:了解 TF 坐标变换的概念以及应用场景;能够独立完成TF案例:小乌龟跟随;可以使用 rosbag 命令或编码原创 2021-03-21 21:53:39 · 327 阅读 · 0 评论 -
4.8 本章小结
ROS入门 4.8 本章小结《ROS入门-理论与实践》视频教程镇楼本章主要介绍了ROS的运行管理机制,内容如下:如何通过元功能包关联工作空间下的不同功能包使用 launch 文件来管理维护 ROS 中的节点在 ROS 中重名是经常出现的,重名时会导致什么情况?以及怎么避免重名?如何实现 ROS 分布式通信?本章的重点是"重名"相关的内容:包名重复,会导致覆盖。节点名称重复,会导致先启动的节点关闭话题名称重复,无语法异常,但是可能导致通信实现出现逻辑问题参数名称重复,会导致参原创 2021-03-19 21:42:48 · 190 阅读 · 0 评论 -
4.7 ROS分布式通信
ROS入门 4.7 ROS分布式通信《ROS入门-理论与实践》视频教程镇楼ROS是一个分布式计算环境。一个运行中的ROS系统可以包含分布在多台计算机上多个节点。根据系统的配置方式,任何节点可能随时需要与任何其他节点进行通信。因此,ROS对网络配置有某些要求:所有端口上的所有机器之间必须有完整的双向连接。每台计算机必须通过所有其他计算机都可以解析的名称来公告自己。实现1.准备先要保证不同计算机处于同一网络中,最好分别设置固定IP,如果为虚拟机,需要将网络适配器改为桥接模式;2.配置原创 2021-03-19 21:42:30 · 1168 阅读 · 1 评论 -
4.6.3 编码设置参数
ROS入门 4.6.3 编码设置参数《ROS入门-理论与实践》视频教程镇楼编码的方式可以更方便的设置:全局、相对与私有参数。1.C++实现在 C++ 中,可以使用 ros::param 或者 ros::NodeHandle 来设置参数。1.1ros::param设置参数设置参数调用API是ros::param::set,该函数中,参数1传入参数名称,参数2是传入参数值,参数1中参数名称设置时,如果以 / 开头,那么就是全局参数,如果以 ~ 开头,那么就是私有参数,既不以 / 也不以 ~原创 2021-03-18 21:48:32 · 420 阅读 · 0 评论 -
4.6.2 launch文件设置参数
ROS入门 4.6.2 launch文件设置参数《ROS入门-理论与实践》视频教程镇楼通过 launch 文件设置参数的方式前面已经介绍过了,可以在 node 标签外,或 node 标签中通过 param 或 rosparam 来设置参数。在 node 标签外设置的参数是全局性质的,参考的是 / ,在 node 标签中设置的参数是私有性质的,参考的是 /命名空间/节点名称。1.设置参数以 param 标签为例,设置参数<launch> <param name="p原创 2021-03-18 21:48:14 · 722 阅读 · 0 评论 -
4.6.1 rosrun设置参数
ROS入门 4.6.1 rosrun设置参数《ROS入门-理论与实践》视频教程镇楼rosrun 在启动节点时,也可以设置参数:语法: rosrun 包名 节点名称 _参数名:=参数值1.设置参数启动乌龟显示节点,并设置参数 A = 100rosrun turtlesim turtlesim_node _A:=1002.运行rosparam list查看节点信息,显示结果:/turtlesim/A/turtlesim/background_b/turtlesim/backgro原创 2021-03-18 21:47:27 · 2540 阅读 · 0 评论 -
4.6 ROS参数名称设置
ROS入门 4.6 ROS参数名称设置《ROS入门-理论与实践》视频教程镇楼在ROS中节点名称话题名称可能出现重名的情况,同理参数名称也可能重名。当参数名称重名时,那么就会产生覆盖,如何避免这种情况?关于参数重名的处理,没有重映射实现,为了尽量的避免参数重名,都是使用为参数名添加前缀的方式,实现类似于话题名称,有全局、相对、和私有三种类型之分。全局(参数名称直接参考ROS系统,与节点命名空间平级)相对(参数名称参考的是节点的命名空间,与节点名称平级)私有(参数名称参考节点名称,是原创 2021-03-18 21:46:38 · 226 阅读 · 0 评论 -
4.5.3 编码设置话题名称
ROS入门 4.5.3 编码设置话题名称《ROS入门-理论与实践》视频教程镇楼话题的名称与节点的命名空间、节点的名称是有一定关系的,话题名称大致可以分为三种类型:全局(话题参考ROS系统,与节点命名空间平级)相对(话题参考的是节点的命名空间,与节点名称平级)私有(话题参考节点名称,是节点名称的子级)结合编码演示具体关系。1.C++ 实现演示准备:1.初始化节点设置一个节点名称ros::init(argc,argv,"hello")2.设置不同类型的话题3.启动节点时,传原创 2021-03-17 20:58:42 · 140 阅读 · 0 评论 -
4.5.2 launch文件设置话题重映射
ROS入门 4.5.2 launch文件设置话题重映射《ROS入门-理论与实践》视频教程镇楼launch 文件设置话题重映射语法:<node pkg="xxx" type="xxx" name="xxx"> <remap from="原话题" to="新话题" /></node>实现teleop_twist_keyboard与乌龟显示节点通信方案由两种:1.方案1将 teleop_twist_keyboard 节点的话题设置为/turtle原创 2021-03-17 20:56:28 · 613 阅读 · 0 评论 -
4.5.1 rosrun设置话题重映射
ROS入门 4.5.1 rosrun设置话题重映射《ROS入门-理论与实践》视频教程镇楼rosrun名称重映射语法: rorun 包名 节点名 话题名:=新话题名称实现teleop_twist_keyboard与乌龟显示节点通信方案由两种:1.方案1将 teleop_twist_keyboard 节点的话题设置为/turtle1/cmd_vel启动键盘控制节点:rosrun teleop_twist_keyboard teleop_twist_keyboard.py /cmd_vel:=/原创 2021-03-17 20:55:42 · 515 阅读 · 0 评论 -
4.5 ROS话题名称设置
ROS入门 4.5 ROS话题名称设置《ROS入门-理论与实践》视频教程镇楼在ROS中节点名称可能出现重名的情况,同理话题名称也可能重名。在 ROS 中节点终端,不同的节点之间通信都依赖于话题,话题名称也可能出现重复的情况,这种情况下,系统虽然不会抛出异常,但是可能导致订阅的消息非预期的,从而导致节点运行异常。这种情况下需要将两个节点的话题名称由相同修改为不同。又或者,两个节点是可以通信的,两个节点之间使用了相同的消息类型,但是由于,话题名称不同,导致通信失败。这种情况下需要将两个节点的话题原创 2021-03-17 20:54:50 · 1139 阅读 · 0 评论 -
4.4.3 编码设置命名空间与重映射
ROS入门 4.4.3 编码设置命名空间与重映射《ROS入门-理论与实践》视频教程镇楼如果自定义节点实现,那么可以更灵活的设置命名空间与重映射实现。1.C++ 实现:重映射1.1名称别名设置核心代码:ros::init(argc,argv,"zhangsan",ros::init_options::AnonymousName);1.2执行会在名称后面添加时间戳。2.C++ 实现:命名空间2.1命名空间设置核心代码 std::map<std::string, std::st原创 2021-03-16 21:39:36 · 230 阅读 · 0 评论 -
4.4.2 launch文件设置命名空间与重映射
ROS入门 4.4.2 launch文件设置命名空间与重映射《ROS入门-理论与实践》视频教程镇楼介绍 launch 文件的使用语法时,在 node 标签中有两个属性: name 和 ns,二者分别是用于实现名称重映射与命名空间设置的。使用launch文件设置命名空间与名称重映射也比较简单。1.launch文件<launch> <node pkg="turtlesim" type="turtlesim_node" name="t1" /> <no原创 2021-03-16 21:38:50 · 504 阅读 · 0 评论 -
4.4.1 rosrun设置命名空间与重映射
4.4.1 ROS入门 rosrun设置命名空间与重映射《ROS入门-理论与实践》视频教程镇楼1.rosrun设置命名空间1.1设置命名空间演示语法: rosrun 包名 节点名 __ns:=新名称rosrun turtlesim turtlesim_node __ns:=/xxxrosrun turtlesim turtlesim_node __ns:=/yyy两个节点都可以正常运行1.2运行结果rosnode list查看节点信息,显示结果:/xxx/turtlesim原创 2021-03-16 21:38:07 · 929 阅读 · 0 评论 -
4.4 ROS节点名称重名
ROS入门 4.4 ROS节点名称重名《ROS入门-理论与实践》视频教程镇楼场景:ROS 中创建的节点是有名称的,C++初始化节点时通过API:ros::init(argc,argv,"xxxx");来定义节点名称,在Python中初始化节点则通过 rospy.init_node("yyyy") 来定义节点名称。在ROS的网络拓扑中,是不可以出现重名的节点的,因为假设可以重名存在,那么调用时会产生混淆,这也就意味着,不可以启动重名节点或者同一个节点启动多次,的确,在ROS中如果启动重名节点的话,原创 2021-03-16 21:37:16 · 3731 阅读 · 2 评论 -
4.3 ROS工作空间覆盖
ROS入门 4.3 ROS工作空间覆盖《ROS入门-理论与实践》视频教程镇楼所谓工作空间覆盖,是指不同工作空间中,存在重名的功能包的情形。ROS 开发中,会自定义工作空间且自定义工作空间可以同时存在多个,可能会出现一种情况: 虽然特定工作空间内的功能包不能重名,但是自定义工作空间的功能包与内置的功能包可以重名或者不同的自定义的工作空间中也可以出现重名的功能包,那么调用该名称功能包时,会调用哪一个呢?比如:自定义工作空间A存在功能包 turtlesim,自定义工作空间B也存在功能包 turtle原创 2021-03-15 21:19:13 · 540 阅读 · 0 评论 -
4.2.8 launch文件标签之arg
ROS入门 4.2.8 launch文件标签之arg《ROS入门-理论与实践》视频教程镇楼<arg>标签是用于动态传参,类似于函数的参数,可以增强launch文件的灵活性1.属性name=“参数名称”default=“默认值” (可选)value=“数值” (可选)不可以与 default 并存doc=“描述”参数说明2.子级标签无3.示例launch文件传参语法实现,hello.lcaunch<launch> &原创 2021-03-15 21:18:53 · 2859 阅读 · 1 评论 -
4.2.7 launch文件标签之group
ROS入门 4.2.7 launch文件标签之group《ROS入门-理论与实践》视频教程镇楼<group>标签可以对节点分组,具有 ns 属性,可以让节点归属某个命名空间1.属性ns=“名称空间” (可选)clear_params=“true | false” (可选)启动前,是否删除组名称空间的所有参数(慎用…此功能危险)2.子级标签除了launch 标签外的其他标签...原创 2021-03-15 21:18:29 · 1500 阅读 · 1 评论 -
4.2.6 launch文件标签之rosparam
ROS入门 4.2.6 launch文件标签之rosparam《ROS入门-理论与实践》视频教程镇楼<rosparam>标签可以从 YAML 文件导入参数,或将参数导出到 YAML 文件,也可以用来删除参数,<rosparam>标签在<node>标签中时被视为私有。1.属性command=“load | dump | delete” (可选,默认 load)加载、导出或删除参数file="$(find xxxxx)/xxx/yyy…"加载或导出原创 2021-03-14 20:38:07 · 536 阅读 · 0 评论 -
4.2.5 launch文件标签之param
ROS入门 4.2.5 launch文件标签之param《ROS入门-理论与实践》视频教程镇楼<param>标签主要用于在参数服务器上设置参数,参数源可以在标签中通过 value 指定,也可以通过外部文件加载,在<node>标签中时,相当于私有命名空间。1.属性name=“命名空间/参数名”参数名称,可以包含命名空间value=“xxx” (可选)定义参数值,如果此处省略,必须指定外部文件作为参数源type=“str | int | double |原创 2021-03-14 20:37:47 · 1247 阅读 · 0 评论 -
4.2.4 launch文件标签之remap
ROS入门 4.2.4 launch文件标签之remap《ROS入门-理论与实践》视频教程镇楼用于话题重命名1.属性from=“xxx”原始话题名称to=“yyy”目标名称2.子级标签无原创 2021-03-14 20:37:23 · 332 阅读 · 0 评论 -
4.2.3 launch文件标签之include
ROS入门 4.2.3 launch文件标签之include《ROS入门-理论与实践》视频教程镇楼include标签用于将另一个 xml 格式的 launch 文件导入到当前文件1.属性file="$(find 包名)/xxx/xxx.launch"要包含的文件路径ns=“xxx” (可选)在指定命名空间导入文件2.子级标签env 环境变量设置arg 将参数传递给被包含的文件...原创 2021-03-13 21:24:13 · 2280 阅读 · 0 评论 -
4.2.2 launch文件标签之node
ROS入门 4.2.2 launch文件标签之node《ROS入门-理论与实践》视频教程镇楼<node>标签用于指定 ROS 节点,是最常见的标签,需要注意的是: roslaunch 命令不能保证按照 node 的声明顺序来启动节点(节点的启动是多进程的)1.属性pkg=“包名”节点所属的包type=“nodeType”节点类型(与之相同名称的可执行文件)name=“nodeName”节点名称(在 ROS 网络拓扑中节点的名称)args=“xxx xxx原创 2021-03-13 21:23:37 · 1002 阅读 · 0 评论 -
4.2.1 launch文件标签之launch
ROS入门 4.2.1 launch文件标签之launch《ROS入门-理论与实践》视频教程镇楼<launch>标签是所有 launch 文件的根标签,充当其他标签的容器1.属性deprecated = "弃用声明"告知用户当前 launch 文件已经弃用2.子级标签所有其它标签都是launch的子级...原创 2021-03-13 21:22:58 · 192 阅读 · 0 评论 -
4.2 ROS节点运行管理launch文件
ROS入门 4.2 ROS节点运行管理launch文件《ROS入门-理论与实践》视频教程镇楼关于 launch 文件的使用我们已经不陌生了,在第一章内容中,就曾经介绍到:一个程序中可能需要启动多个节点,比如:ROS 内置的小乌龟案例,如果要控制乌龟运动,要启动多个窗口,分别启动 roscore、乌龟界面节点、键盘控制节点。如果每次都调用 rosrun 逐一启动,显然效率低下,如何优化?采用的优化策略便是使用roslaunch 命令集合 launch 文件启动管理节点,并且在后续教程中,也多原创 2021-03-13 21:22:19 · 271 阅读 · 0 评论 -
4.1 ROS元功能包
ROS入门 4.1 ROS元功能包《ROS入门-理论与实践》视频教程镇楼**场景:**完成ROS中一个系统性的功能,可能涉及到多个功能包,比如实现了机器人导航模块,该模块下有地图、定位、路径规划…等不同的子级功能包。那么调用者安装该模块时,需要逐一的安装每一个功能包吗?显而易见的,逐一安装功能包的效率低下,在ROS中,提供了一种方式可以将不同的功能包打包成一个功能包,当安装某个功能模块时,直接调用打包后的功能包即可,该包又称之为元功能包(metapackage)。概念MetaPackag原创 2021-03-11 21:13:24 · 956 阅读 · 1 评论 -
第 4 章 ROS运行管理
ROS入门 第 4 章 ROS运行管理《ROS入门-理论与实践》视频教程镇楼ROS是多进程(节点)的分布式框架,一个完整的ROS系统实现:可能包含多台主机;每台主机上又有多个工作空间(workspace);每个的工作空间中又包含多个功能包(package);每个功能包又包含多个节点(Node),不同的节点都有自己的节点名称;每个节点可能还会设置一个或多个话题(topic)…在多级层深的ROS系统中,其实现与维护可能会出现一些问题,比如,如何关联不同的功能包,繁多的ROS节点应该如何原创 2021-03-11 21:12:06 · 423 阅读 · 0 评论 -
3.3 Python模块导入
ROS入门 3.3 Python模块导入《ROS入门-理论与实践》视频教程镇楼与C++类似的,在Python中导入其他模块时,也需要相关处理。需求:首先新建一个Python文件A,再创建Python文件UseA,在UseA中导入A并调用A的实现。实现:新建两个Python文件,使用 import 实现导入关系;添加可执行权限、编辑配置文件并执行UseA。1.新建两个Python文件并使用import导入文件A实现(包含一个变量):#! /usr/bin/env pythonnu原创 2021-03-11 21:10:42 · 169 阅读 · 1 评论 -
3.2 ROS中的头文件与源文件
ROS入门 3.2 ROS中的头文件与源文件《ROS入门-理论与实践》视频教程镇楼本节主要介绍ROS的C++实现中,如何使用头文件与源文件的方式封装代码,具体内容如下:设置头文件,可执行文件作为源文件;分别设置头文件,源文件与可执行文件。在ROS中关于头文件的使用,核心内容在于CMakeLists.txt文件的配置,不同的封装方式,配置上也有差异。3.2.1 自定义头文件调用3.2.2 自定义源文件调用...原创 2021-03-10 21:07:24 · 454 阅读 · 0 评论 -
3.2.2 自定义源文件调用
ROS入门 3.2.2 自定义源文件调用《ROS入门-理论与实践》视频教程镇楼需求:设计头文件与源文件,在可执行文件中包含头文件。流程:编写头文件;编写源文件;编写可执行文件;编辑配置文件并执行。1.头文件头文件设置于 3.2.1 类似,在功能包下的 include/功能包名 目录下新建头文件: haha.h,示例内容如下:#ifndef _HAHA_H#define _HAHA_Hnamespace hello_ns {class My {public:原创 2021-03-10 21:04:19 · 290 阅读 · 0 评论 -
3.2.1 自定义头文件调用
ROS入门 3.2.1 自定义头文件调用《ROS入门-理论与实践》视频教程镇楼需求:设计头文件,可执行文件本身作为源文件。流程:编写头文件;编写可执行文件(同时也是源文件);编辑配置文件并执行。1.头文件在功能包下的 include/功能包名 目录下新建头文件: hello.h,示例内容如下:#ifndef _HELLO_H#define _HELLO_Hnamespace hello_ns{class HelloPub {public: void run原创 2021-03-10 21:03:49 · 2216 阅读 · 3 评论 -
3.1.5 其他函数
ROS入门 3.1.5 其他函数《ROS入门-理论与实践》视频教程镇楼在发布实现时,一般会循环发布消息,循环的判断条件一般由节点状态来控制,C++中可以通过 ros::ok() 来判断节点状态是否正常,而 python 中则通过 rospy.is_shutdown() 来实现判断,导致节点退出的原因主要有如下几种:节点接收到了关闭信息,比如常用的 ctrl + c 快捷键就是关闭节点的信号;同名节点启动,导致现有节点退出;程序中的其他部分调用了节点关闭相关的API(C++中是ros::sh原创 2021-03-09 20:41:23 · 161 阅读 · 0 评论 -
3.1.4 时间
ROS入门 3.1.4 时间《ROS入门-理论与实践》视频教程镇楼ROS中时间相关的API是极其常用,比如:获取当前时刻、持续时间的设置、执行频率、休眠、定时器…都与时间相关。C++1.时刻获取时刻,或是设置指定时刻:ros::init(argc,argv,"hello_time");ros::NodeHandle nh;//必须创建句柄,否则时间没有初始化,导致后续API调用失败ros::Time right_now = ros::Time::now();//将当前时刻封装成对象R原创 2021-03-09 20:41:00 · 649 阅读 · 0 评论 -
3.1.3 回旋函数
ROS入门 3.1.3 回旋函数《ROS入门-理论与实践》视频教程镇楼C++在ROS程序中,频繁的使用了 ros::spin() 和 ros::spinOnce() 两个回旋函数,可以用于处理回调函数。1.spinOnce()/** * \brief 处理一轮回调 * * 一般应用场景: * 在循环体内,处理所有可用的回调函数 * */ROSCPP_DECL void spinOnce();2.spin()/** * \brief 进入循环处理回调 *原创 2021-03-09 20:40:41 · 838 阅读 · 0 评论 -
3.1.2 话题与服务相关对象
ROS入门 3.1.2 话题与服务相关对象《ROS入门-理论与实践》视频教程镇楼C++在 roscpp 中,话题和服务的相关对象一般由 NodeHandle 创建。NodeHandle有一个重要作用是可以用于设置命名空间,这是后期的重点,但是本章暂不介绍。1.发布对象对象获取:/*** \brief 根据话题生成发布对象** 在 ROS master 注册并返回一个发布者对象,该对象可以发布消息** 使用示例如下:** ros::Publisher pub = hand原创 2021-03-08 17:24:30 · 234 阅读 · 0 评论 -
3.1.1 初始化
ROS入门 3.1.1 初始化《ROS入门-理论与实践》视频教程镇楼C++初始化/** @brief ROS初始化函数。 * * 该函数可以解析并使用节点启动时传入的参数(通过参数设置节点名称、命名空间...) * * 该函数有多个重载版本,如果使用NodeHandle建议调用该版本。 * * \param argc 参数个数 * \param argv 参数列表 * \param name 节点名称,需要保证其唯一性,不允许包含命名空间 * \param options原创 2021-03-08 17:23:23 · 198 阅读 · 0 评论 -
3.1 常用API
ROS入门 3.1 常用API《ROS入门-理论与实践》视频教程镇楼首先,建议参考官方API文档或参考源码:ROS节点的初始化相关API;NodeHandle 的基本使用相关API;话题的发布方,订阅方对象相关API;服务的服务端,客户端对象相关API;时间相关API;日志输出相关API。参数服务器相关API在第二章已经有详细介绍和应用,在此不再赘述。另请参考:http://wiki.ros.org/APIshttps://docs.ros.org/en/api/ros原创 2021-03-08 17:22:33 · 306 阅读 · 0 评论