ROS学习寄录之知识学习

news2025/1/18 6:53:50

1 ROS核心概念

1.1 节点(Node)

(1)执行具体任务的进程、独立运行的可执行文件

(2)不同节点可以使用不同的语言,可分布式运行在不同的主机

(3)节点在系统中的名称必须是唯一的

1.2 节点管理器(ROS Master)

(1)为节点提供命名和注册服务

(2)跟踪和记录话题/服务通信,辅助节点相互查找、建立连接

(3)提供参数服务器,节点使用此服务器存储和检索运行时的参数

1.3话题(Topic)异步通信机制

(1)节点间用来传输数据的重要总线

(2)使用发布/订阅模型,数据由发布者传输到订阅者,同一个话题的订阅者或发布者可以不唯一

1.4消息(Message)话题数据

(1)具有一定的类型和数据结构,包括ROS提供的标准类型和用户自定义类型

(2)使用编程语言无关的.msg文件定义,编译过程中生成对应的代码文件

1.5服务(Service)同步通信机制

(1)使用客户端/服务器(C/S)模型,客户端发送请求数据,服务端完成处理后返回应答数据

(2)使用编程语言无关的.srv文件定义请求和应答数据结构,编译过程中生成对应的代码文件

1.6 参数(Parameter)全局共享字典

(1)可通过网络访问的共享、多变量字典

(2)字节使用此服务器来存储和检索运行时的参数

(3)适合存储静态、非二进制的配置参数,不适合存储动态配置的数据

2 ROS命令行工具

2.1 小海龟

启动ROS Master

roscore

启动小海龟仿真器

rosrun turtlesim turtlesim_node

启动海归控制节点

rosrun turtlesim turtle_teleop_key

2.2 rqt基于qt的可视化工具

rqt_graph

回车之后出现以下窗口,是以图形显示节点和消息之间的相关关系的工具

2.3 rosnode

2.3.1查看某一个节点的ping值

rosnode ping /节点名称

2.3.2将系统中所有的节点都列出来

rosnode list

2.3.3查看某一个节点的具体信息

rosnode info /节点名称

2.3.4查看运行的机器名称

rosnode machine

2.3.5杀死ros节点

rosnode kill

2.4 rostopic

2.4.1打印系统中所有的话题列表

rostopic list

2.4.2发布数据给某一个topic

rostopic pub /话题名 /话题消息类型

例如小海龟

输入

rostopic pub /turtle1/cmd_vel 按下tab 按下tab

出现以下情况,即可设置小海龟的速度和角度

 在速度x方向改为1之后,海归会前行一段距离即停下,因为执行后默认运行一次,此时需要在pub后加上-r +频率,例如加上-r 10  即以10Hz的频率执行,1s发布10次1m/s的指令

rostopic pub -r 10 /turtle1/cmd_vel 按下tab 按下tab

2.5 rosmsg

查看数据结构,例如查看上一个小海龟的数据结构,show后边的是上边按两次tab出来的

rosmsg show geometru_msgs/Twist

2.6 rosservice

2.6.1 查看所有service的内容

rosservice list

2.6.2产生新的内容

例如小海龟中产生新的海归

rosservice call /spawn Tab

然后更改x、y和名称

2.7 rosbag

记录ros中所有内容并保存下来

rosbag record -a -O cmd_record

话题复现

rosbag play cmd_record.bag

3 工作空间与功能包

3.1 工作空间

工作空间(workspace)是一个存放工程开发相关文件的文件夹

src:代码空间(Source Space)

build:编译空间(Build Space)

devel:开发空间(Development Space)

install:安装空间(Install Space)

3.2 建立过程

3.2.1创建工作空间

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace

3.2.2编译工作空间

cd ~/catkin_ws/
catkin_make

3.2.3产生install文件

catkin_make install

3.2.4设置环境变量

source devel/setup.bash

3.2.5检查环境变量

echo $ROS_PACKAGE_PATH

3.3 创建功能包

3.3.1创建功能包

catkin_create_pkg <package name> [depend1] [depend2] [depend3]

cd ~/catkin_ws/src
catkin_create_pkg test_pkg std_msgs rospy roscpp

3.3.2编译功能包

cd ~/catkin_ws
catkin_make
source ~/catkin_ws/devel/setup.bash

4 发布者Publisher编程实现

通过编程使海龟动起来

4.1创建一个功能包并编译

cd ~/catkin_ws/src
catkin_create_pkg learning_topic roscpp rospy std_msgs geometry_msgs turtlesim.
cd ..
catkin_make

4.2 如何实现一个发布者

(1)初始化ROS节点

(2)向ROS Master注册节点信息,包括发布的话题名和话题中的消息类型

(3)创建消息数据

(4)按照一定的频率循环发布信息

4.3代码实现

在创建的功能包learning_topic功能包中的src中创建一个cpp文件velocity_publisher.cpp

/**
 * 该例程将发布turtle1/cmd_vel话题,消息类型geometry_msgs::Twist
 */
 
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>

int main(int argc, char **argv)
{
    // ROS节点初始化
    ros::init(argc, argv, "velocity_publisher");

    // 创建节点句柄
    ros::NodeHandle n;

    // 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10
    ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);

    // 设置循环的频率
    ros::Rate loop_rate(10);

    int count = 0;
    while (ros::ok())
    {
        // 初始化geometry_msgs::Twist类型的消息
        geometry_msgs::Twist vel_msg;
        vel_msg.linear.x = 0.5;
        vel_msg.angular.z = 0.2;

        // 发布消息
        turtle_vel_pub.publish(vel_msg);
        ROS_INFO("Publsh turtle velocity command[%0.2f m/s, %0.2f rad/s]", 
                vel_msg.linear.x, vel_msg.angular.z);

        // 按照循环频率延时
        loop_rate.sleep();
    }

    return 0;
}

添加CMakeLists.txt中编译规则

add_executable(velocity_publisher src/velocity_publisher.cpp)
target_link_libraries(velocity_publisher ${catkin_LIBRARIES})

add_executable:将第二个位置的文件编译成第一个可执行文件

target_link_libraries:将ROS的可执行文件与ROS的库进行链接

编译并运行发布者

cd ~/catkin_ws
catkin_make
source devel/setup.bash
roscore

rosrun turtlesim turtlesim_node

source devel/setup.bash
rosrun learning_topic velocity_publisher

5 订阅者Subscriber编程实现

使用订阅者定位海龟的位置信息

 5.1 如何实现一个订阅者

(1)初始化ROS节点

(2)订阅需要的话题

(3)循环等待话题消息,接收到消息后进入回调函数

(4)在回调函数中完成消息处理

5.2 代码实现

/**
 * 该例程将订阅/turtle1/pose话题,消息类型turtlesim::Pose
 */
 
#include <ros/ros.h>
#include "turtlesim/Pose.h"

// 接收到订阅的消息后,会进入消息回调函数
void poseCallback(const turtlesim::Pose::ConstPtr& msg)
{
    // 将接收到的消息打印出来
    ROS_INFO("Turtle pose: x:%0.6f, y:%0.6f", msg->x, msg->y);
}

int main(int argc, char **argv)
{
    // 初始化ROS节点
    ros::init(argc, argv, "pose_subscriber");

    // 创建节点句柄
    ros::NodeHandle n;

    // 创建一个Subscriber,订阅名为/turtle1/pose的topic,注册回调函数poseCallback
    ros::Subscriber pose_sub = n.subscribe("/turtle1/pose", 10, poseCallback);

    // 循环等待回调函数
    ros::spin();

    return 0;
}

 添加CMakeLists.txt中编译规则

add_executable(pose_subscriber src/pose_subscriber.cpp)
target_link_libraries(pose_subscriber ${catkin_LIBRARIES})

add_executable:将第二个位置的文件编译成第一个可执行文件

target_link_libraries:将ROS的可执行文件与ROS的库进行链接

编译并运行发布者

cd ~/catkin_ws
catkin_make
source devel/setup.bash
roscore

rosrun turtlesim turtlesim_node

source devel/setup.bash
rosrun learning_topic pose_subscriber

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/178106.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML总结

web开发是创建Web页面或App等前端界面呈现给用户的过程。web开发开发是从网页制作演变而来&#xff0c;早期网站主要内容都是静态&#xff0c;用户使用网站的行为也以浏览为主。随着互联网技术的发展&#xff0c;各种终端设备应用程序与用户沟通交互的界面&#xff0c;都是由We…

Java基础 Stream流方法引用异常文件

Stream流 引例 需求&#xff1a;按照下面要求完成集合的创建和遍历 创建一个集合&#xff0c;存储多个字符串元素 1. 把所有以“曹”开头的元素存储到新集合中 2. 把曹开头&#xff0c;长度为3的元素存储到新集合中 List<String> list List.of("曹操", "…

关于2倍图的理解

在电脑端1个css像素1个物理像素 所以一个长宽都是100px的照片&#xff0c;需要100✖100px的物理像素 而在移动端存在多倍图的关系&#xff0c;假如是2倍图的关系 即&#xff1a;1个css像素需要2个物理发光点 假如现在有一个长宽都是100px像素的照片 放在手机上也是长宽也是100…

TCP/IP IP地址概念与应用

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.什么是IP地址 二.IP地址的组成 三.IP地址分类 A类IP地址 …

雅睿生物在创业板IPO终止:安信证券为保荐人,曾计划募资7.5亿元

近日&#xff0c;深圳证券交易所创业板披露的信息显示&#xff0c;苏州雅睿生物技术股份有限公司&#xff08;下称“雅睿生物”&#xff09;提交了关于撤回首次公开发行股票并在创业板上市申请文件的申请&#xff0c;保荐人提交了撤回保荐的申请。 据贝多财经了解&#xff0c;雅…

Heatmap关键点检测算法

** Heatmap 方法汇总 高斯热图与坐标回归方法探讨 L1与 L2 Loss的对比分析 关键点之热力图Heatmap与坐标FC回归 Heatmap-based和Regression-based 一般来说&#xff0c;我们可以把姿态估计任务分成两个流派&#xff1a;Heatmap-based和Regression-based。 其主要区别在于监…

GROMACS 教程--水中的溶菌酶

GROMACS 教程–水中的溶菌酶 中文教程&#xff1a;http://jerkwin.github.io/ 英文教程&#xff1a;http://www.mdtutorials.com 此示例将指导新用户完成模拟系统的设置过程&#xff0c;该模拟系统在一盒水和离子中包含蛋白质&#xff08;溶菌酶&#xff09;。每个步骤都将包含…

学习3dmax多边形建模挤出操作

新建一个长方体&#xff0c;右键&#xff0c;转换为可编辑多边形&#xff1b; 右键以后&#xff0c;这个Convert To菜单&#xff0c;有时有有时没有&#xff0c;我还没弄清&#xff0c; 操作层级选中如下&#xff0c; 选中挤出命令&#xff0c;Extrude&#xff0c; 挤了一下&a…

元宇宙3D设计系统【构思与展望】

Metaverse 似乎是一个迷人的未来主义命题&#xff0c;“有一天”我们将拥有数十亿人愿意“生活在其中”的虚拟世界。 显然&#xff0c;我们还没有看到真正的“元宇宙”产品&#xff0c;3-5 年内也不太可能看到这样的产品。 那么&#xff0c;是什么阻碍了元宇宙在短期内成为现实…

ccflow 代码分析

ccflow 代码分析目录概述需求&#xff1a;设计思路实现思路分析1.参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challenge Survive. happ…

线段树的原理和应用

目录 一、前言 二、线段树的概念 1、区间最值问题RMQ (Range Minimum/Maximum Query) &#xff08;1&#xff09;暴力法 &#xff08;2&#xff09;高效的办法&#xff1a;线段树 &#xff08;3&#xff09;把数列放在二叉树上 &#xff08;4&#xff09;查询最小值的复…

反向放大电路并联电容与积分电路并联电阻的区别?

运放反相比例放大电路中反馈电阻两端经常并联一个电容&#xff0c;而运放积分电路的反馈电容上常常并联一个电阻&#xff0c;两者电路结构相似&#xff0c;如下所示&#xff08;隐去阻容值&#xff09;&#xff0c;二者有何区别呢&#xff1f;电阻、电容分别又起到什么作用&…

djangorestframework全解

这里写目录标题drf安装与使用ApiView继承自原生View的基类基本使用源码分析drf的Request对象响应模块&#xff08;一般不用管&#xff09;内置渲染器局部使用全局使用解析器&#xff08;一般不用管&#xff09;全局使用解析器局部使用解析器同时使用多个解析器&#xff08;默认…

雅克比行列式补充和曲面的参数方程求导表示法向量

接上篇的雅克比行列式部分。其实对于任何变量x,y, dxdy描述的是一个抽象的“面积”。比如&#xff0c;如果x是力F&#xff0c;y是时间t&#xff0c;那么“面积”Ft其实就是做功。所以我们可以认识到&#xff0c;对于dxdy和dudv之间&#xff0c;如果自变量u&#xff0c;v的改变量…

【网络安全】ip地址、公网、私网

一、IP地址 ip地址相当于收发快递时的收货地址和发货地址 IPV4的地址&#xff1a;192.168.0.1 11000000.10101000.00000000.00000001 windows使用>ipconfig&#xff1b;linux使用ifconfig 可以看到IPV4地址/inet旁边的就是IP地址 IP地址的分类 IP地址有32位&#xff0…

React事件和原生事件的执行顺序

React在内部对事件做了统一的处理&#xff0c;合成事件是一个比较大的概念 为什么要有合成事件 在传统的事件里&#xff0c;不同的浏览器需要兼容不同的写法&#xff0c;在合成事件中React提供统一的事件对象&#xff0c;抹平了浏览器的兼容性差异React通过顶层监听的形式&am…

ROS学习寄录之环境搭建

1 创建ROS工作空间 1.1 创建工作空间 &#xff08;1&#xff09;创建工作空间 mkdir catkin_ws &#xff08;2&#xff09;进入catkin_ws文件夹&#xff0c;然后创建一个src文件夹 cd catkin_ws mkdir src &#xff08;3&#xff09;进入src文件夹&#xff0c;生成CMakeL…

JavaScript typeof

文章目录JavaScript typeof, null, 和 undefinedtypeof 操作符NullUndefinedUndefined 和 Null 的区别JavaScript typeof, null, 和 undefined JavaScript typeof, null, undefined, valueOf()。 typeof 操作符 你可以使用 typeof 操作符来检测变量的数据类型。 实例 typeof …

2.2 标识符与关键字

文章目录1 标识符2 关键字1 标识符 标识符可以简单的理解成一个名字。 在Java中&#xff0c;我们需要给代码中的很多元素起名&#xff0c;包括类名、方法名、字段名、变量名等等。我们给对应元素起的名称就被称为标识符&#xff0c;一个正确的标识符需要遵循以下规则&#xff…

【蓝桥杯】简单数论4——丢番图方程

1、二元线性丢番图方程 方程ax by c被称为二元线性丢番图方程&#xff0c;其中a、b、c是已知整数&#xff0c;x、y是变量,问是否有整数解。 ax by c实际上是二维x-y平面上的一条直线&#xff0c;这条直线上如果有整数坐标点&#xff0c;方程就有解&#xff0c;如果没有整数坐…