机器人工匠阿杰ROS快速入门笔记记录

news2024/9/28 17:35:44

ROS 快速入门教程–机器人工匠阿杰

11. 年轻人的第一个node节点

cd ~/catkin_ws/src ; // 进入工作空间
catkin_create_p kg ssr_pkg rospy roscpp std_msgs ; // 创建一个名为ssr_pkg的工程,依赖包是:rospy roscpp std_msgs
// 此时,利用code指令进入vscode,打开工作空间目录下的ssr_pkg
// 再src下面的目录下,新建一个cpp文件,chao_node.cpp
chao_node.cpp:
	#include<ros/ros.h>
	int main(int argc, char const *argv[]){
        printf("hello, world");
        return 0;
    }
// 注意这时候可能include的文件标红,这时候只需要删除掉.vscode下面的c_cpp_properties.json文件,然后重新打开vscode即可。
// 接下来,打开CMakeList.txt文件(注意这里用的注释格式)
// 找到下面的注释文件中的"build"栏目中一行
add executable(${name}_node src/ssr_pkg_node.cpp) // 后面表示地址和文件名
    // 前面是节点名称
add executable(chao_nodes src/chao_node.cpp)
  	// 注意 每一次修改文件以后,都一定要记得保存
// 然后是ctrl+shift+B来编译。

    
步骤二:
// 打开新的终端
    roscore;
// 配置环境空间
	source ~/catkin_ws/devel/setup.bash;
// 运行超声波传感器节点
    rosrun ssr_pkg chao_node

步骤三:
   // 在主函数中加入ros:init()
   // 构建while循环,循环条件为ros:ok(); ,这样可以直接ctrl + c推出。
   // 在cmake文件中找到设置节点源码的编译规则,"build"的最后面
        target_link_libraries(chao_node
            ${catkin_LIBRIES}
    )
   

请添加图片描述

12 Topic话题和Message消息

请添加图片描述

Topic: 持续通讯的一种形式

Message: 通讯过程中发送的消息。

Publisher: 消息的发送方

Subscriber: 消息的接收方。

注意:一个话题里面一般不会发布多条信息,那样容易让接收者混乱。

所以比如另外有一个传感器也要发布关于姿态信息,那它就必须新建一个Topic,然后在这个Topic中发布message,作为接收者来说,就可以选择性的接受来自Topic的话题。

请添加图片描述

13. Publisher发布者和代码实现

请添加图片描述

注意:以上问题,rostopic话题不能是中文的。

// chao_node的代码
#include<ros/ros.h>
#include<std_msgs/String.h>
int main(int argc, char *argv[])
{
    ros::init(argc, argv, "chao_node");
    /* code */
    ros::NodeHandle nh;
    // 注意:话题名称
    ros::Publisher pub = nh.advertise<std_msgs::String>("go_car_kai_hei", 10); // first : message. seconde : queue
    ros::Rate loop_rate(10); // 设置频率。一秒钟发送十次。
    while(ros::ok()){
        printf("我要发布消息了!\n");
        std_msgs::String msg;
        msg.data = "超声波数据";
        pub.publish(msg);
        loop_rate.sleep(); // 实现延迟阻塞
    }
    
    return 0;
}

rostopic list : 列出系统中活跃的话题

rostopic echo + 主题名称:显示指定话题中发送的信息

rostopic hz + 主题名称:统计指定话题中消息发送频率

同理,复制节点,命名为yao_node.cpp

14. 在ros中,使用c++编写subcriber

#include<ros/ros.h>
#include<std_msgs/String.h>

void chao_callback(std_msgs::String msg){ // 这个接受回溯函数用来处理接受到的信息
    ROS_INFO(msg.data.c_str()); // 带时间戳的信息
}

int main(int argc, char *argv[])
{
    setlocale(LC_ALL, ""); // ""代表跟随系统文字,可以正常输出中文
    /* code */
    ros::init(argc, argv, "ma_node");
    ros::NodeHandle nh;
    ros::Subscriber sub = nh.subscribe("go_car_kai_hei", 10, chao_callback); // 注意:""这里的是对应要接受的topic名称。
    while(ros::ok()){
        ros::spinOnce(); // 这个函数为了让系统把注意力放在接受信息上。
    }
    return 0;
}

// 对应的编译CMake文件:结尾处加入这个
add_executable(ma_node src/ma_node.cpp)
target_link_libraries(ma_node
    ${catkin_LIBRARIES}
)

请添加图片描述

一个工具:rqt_graph 一个查看节点关系的工具。

15. ROS中,使用launch文件一次性启动多个节点

在上一接中,我们如果要实现接收者接收到多个发布者的信息,就需要打开多个窗口来分别运行,这样比较麻烦,于是launch文件运用而生。只需要用标记语言来对多个节点进行标记,就可以实现一次性运行。

请添加图片描述

接下来,我们来实践操作一下

  • 首先,在pkg文件下,新建一个launch文件夹,然后在这个文件夹下新建一个kai_hei.launch文件。然后编辑如下:
<launch>
    <node pkg="ssr_pkg" type="chao_node" name="chao_node" launch-prefix="gnome-terminal -e"/>
    <node pkg="ssr_pkg" type="yao_node" name="yao_node"/>
    <node pkg="atr_pkg" type="ma_node" name="ma_node" output="screen"/>

</launch>

19. 在ROS中,用C++实现机器人的运动控制

// 1 首先新建一个速度发布节点
cd catkin_ws/src/
catkin_create_pkg vel_pkg roscpp rospy geometry_msgs
// 2 创建一个速度节点 vel_node.cpp
#include<ros/ros.h>
#include<geometry_msgs/Twist.h>

int main(int argc, char *argv[])
{
    /* code */
    // 首先是ros初始化,节点命名
    ros::init(argc, argv, "vel_node");
    // 引入一个ros管家
    ros::NodeHandle n;
    ros::Publisher vel_pub = n.advertise<geometry_msgs::Twist>("/cmd_vel", 10);
    // 新建一个变量来存储数据
    geometry_msgs::Twist vel_msg;
    // Twish 有两个变量:速度、角速度
    vel_msg.linear.x = 0.1; // x轴方向的速度
    vel_msg.linear.y = 0;
    vel_msg.linear.z = 0;
    vel_msg.angular.x = 0; // x轴方向的角速度
    vel_msg.angular.y = 0;
    vel_msg.angular.z = 0;
    // 通过while循环来实现循环播报
    ros::Rate r(30);
    while(ros::ok()){
        vel_pub.publish(vel_msg);
        r.sleep();
    }
    return 0;
}
// 对应的编译文件修改一下
# catkin_add_nosetests(test)
add_executable(vel_node srcel_node.cpp)
add_dependencies(vel_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(vel_node
  ${catkin_LIBRARIES}
)

22. ROS中,使用RViz观测传感器数据

可以使用rviz进行添加模型,然后添加观测机器人的传感器,在左侧的状态栏可以修改传感器的一些参数。

如果要保存rviz的配置,直接file–save as保存为.rviz文件即可,下一次直接打开。

在这个模型里面,可以通过:

roslaunch wpr_simulation wpb_rviz.launch来实现配置好的rviz界面

23 ROS系统中激光雷达的消息包

请添加图片描述

在实际ros项目中,激光雷达的数据如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LJe5mJws-1687785842657)(C:\Users\风净尘\Desktop\QQ图片20230311111300.jpg)]

range是每一个方向的障碍物距离,有360个角度线。 如果超出了范围,就是INF表示无穷大。

请添加图片描述

24. 用C++实现获取激光雷达数据的接收器

首先继续按照之前的方式创建一个pkg,然后创建lidar_node.cpp文件如下:

#include<ros/ros.h>
#include<sensor_msgs/LaserScan.h>

//回调函数
void lidar_callback(sensor_msgs::LaserScan msg){
    float fMidDist = msg.ranges[180]; // 这里指向的是正前方,从6点钟方向来算0度。
    ROS_INFO("前方测距 range[180] = %f 米", fMidDist);
}

int main(int argc, char *argv[])
{
    // 初始化
    setlocale(LC_ALL, ""); // 设置全局语言跟随系统
    ros::init(argc, argv, "lidar_node"); // 节点名字
    // 引入管家
    ros::NodeHandle nh;
    // 创建接受者
    ros::Subscriber lidar_sub = nh.subscribe("/scan", 10, lidar_callback);
    ros::spin(); // 让系统监视这个信息
    return 0;
}

28. IMU惯性测量单元

请添加图片描述

注意区别,这里的是线性加速度x,y,z轴。

orientation——covariance:协方差矩阵

38 ROS中的栅格地图

请添加图片描述

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

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

相关文章

html 高频面试题

文章目录 1. html 元素的类型2. <!DOCTYPE html>3. HTML、XML 和 XHTML 有什么区别&#xff1f;解释关系区别 4. 超链接和锚点的区别&#xff1f;5. iframe6. title和h17. html58. html5语义化是什么&#xff1f;9.DataList10.SVG是什么&#xff1f;11.src和href的区别12…

为何大伙都不愿意去外包,离职出来都说自己都废了呢....

先说一下自己的情况。大专生&#xff0c;17年通过校招进入湖南某软件公司&#xff0c;干了接近2年的点点点&#xff0c;今年年上旬&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个0舒适的环境会让一个人堕落&#xff01;而我已经在一个企业干了五年的功能测…

Qt停靠/浮动窗口的使用以及保存修改后的记录

目录 1、停靠窗口(dock windows)2、尝试编写一个停靠窗口3、保存停靠窗口状态并且能够恢复3.1、使用QSettings保存记录3.2 测试效果3.3、注册表查看配置 1、停靠窗口(dock windows) 停靠窗口(dock window)是指一些可以停靠在 OMainWindow 中或是浮动为独立窗口的窗口。OMainWi…

如何使用mock.js实现接口测试的自动化?

目录 Mock.js 基础用法介绍 安装 基础用法 随机生成一个用户信息 随机生成一个用户信息数组 Mock.js API 生成随机数据 生成数据模板指定的数据 模拟接口请求 设置Ajax请求响应时间 总结 Mock.js 基础用法介绍 Mock.js是一个常用于生成随机数据和拦截Ajax请求的Java…

【Vue FlatPickr Component】中文配置示例

【Vue FlatPickr Component】配置示例 核心代码 :config"{allowInput: true, locale: zh, enableTime: true, dateFormat: Y-m-d H:i:S, time_24hr: true, enableSeconds: true }" 详情 locale: zh&#xff1a;使用中文 enableTime: true&#xff1a;开启选择时间 …

【数据结构】——图的相关习题

目录 一、选择填空判断题题1题2题3 二、应用题题1 一、选择填空判断题 题1 1、无向图G&#xff08;V&#xff0c;E&#xff09;&#xff0c;其中&#xff1a;V{a&#xff0c;b&#xff0c;c&#xff0c;d&#xff0c;e&#xff0c;f}&#xff0c;E{&#xff08;a&#xff0c;b…

Spring Boot 中如何使用 Swagger

在 Spring Boot 中使用 Swagger 介绍 在开发 Web 应用时&#xff0c;API 文档的编写和维护是一项非常重要的工作。Swagger 是一款非常流行的 API 文档工具&#xff0c;可以自动生成 API 文档&#xff0c;并提供一系列的交互式工具&#xff0c;如测试界面、调试界面等&#xf…

在线选座票务系统开发 座位预先选出行更方便

我们平时去影院剧场观看电影演出的时候&#xff0c;去早了要等很久才开始&#xff0c;去晚了好座位都被别人占了&#xff0c;自己只能挤在角落里&#xff0c;影响观感体验。影院剧场在线选座APP小程序系统开发就很好的解决了这一问题&#xff0c;可以满足用户在线订座、在线选座…

【动态规划算法练习】day6

文章目录 一、53. 最大子数组和1.题目简介2.解题思路3.代码4.运行结果 二、918. 环形子数组的最大和1.题目简介2.解题思路3.代码4.运行结果 三、152. 乘积最大子数组1.题目简介2.解题思路3.代码4.运行结果 总结 一、53. 最大子数组和 1.题目简介 53. 最大子数组和 给你一个整…

【Java】Java 纪录类(Record Class)及代码示例

本文仅供学习交流使用&#xff01; Java Record Class相关文章地址&#xff1a; https://www.liaoxuefeng.com/wiki/1252599548343744/1331429187256353 https://www.baeldung.com/java-record-keyword https://www.developer.com/java/java-record-class/ Java中的记录类是什么…

SSMP整合案例(7) MybatisPlus快速service业务层开发

上文 SSMP整合案例(6) 业务service层逻辑编写我们创建并编写了service业务层代码 但是 这样一个一个去写 确实是有点麻烦 重复性工作 但其实这个已经有人帮我们考虑好了 MP就帮我们做了一个 service快捷开发的方式 我们在项目中的service包下创建一个接口 叫 IBookService 其实…

fscan安装以及使用

windows安装 1.go语言下载。 下载msi版本&#xff0c;直接安装就可以不用配置环境变量&#xff0c;默认是帮你安装配合好的 https://go.dev/dl/ 2.配置go环境 使用默认配置的话&#xff0c;下载速度过慢&#xff0c;导致无法完成编译。故需要配置代理。 在cmd命令行中…

RocketMQ --- 基础篇

一、MQ介绍 1.1、为什么要用MQ 消息队列是一种“先进先出”的数据结构 其应用场景主要包含以下3个方面 1.1.1、应用解耦 系统的耦合性越高&#xff0c;容错性就越低。以电商应用为例&#xff0c;用户创建订单后&#xff0c;如果耦合调用库存系统、物流系统、支付系统&…

Shapley值法介绍及实例计算

Shapley值法介绍及实例计算 为解决多个局中人在合作过程中因利益分配而产生矛盾的问题,属于合作博弈领域。应用 Shapley 值的一大优势是按照成员对联盟的边际贡献率将利益进行分配,即成员 i 所分得的利益等于该成员为他所参与联盟创造的边际利益的平均值。 本文从Shapl…

【裸机开发】EPIT 定时器 —— 按键消抖

实际工程中&#xff0c;不能直接通过延时来消抖 ! 这里我们采用定时器来消抖&#xff0c;这也是内核处理消抖的一种方式。 目录 一、基本原理 1、延时消抖的弊端 2、定时器消抖原理 二、按键消抖实现 1、按键中断 2、定时器中断 三、附加&#xff1a;按键 / 定时器中断初…

熊哥保佑你 计算机组成原理复习

移码是符号位取反 . . Cache——主存地址映像&#xff1a; 全相联&#xff1a;块号字块内地址 直接映射&#xff1a;标记行号字块内地址 组相联&#xff1a;标记组号字块内地址 一个单元一个字节 2路组相联&#xff1a; 全相联&#xff1a; 直接映射&#xff1a; . …

代码随想录算法训练营第四十七天| 198.打家劫舍、 213.打家劫舍II 、 337.打家劫舍III

打家劫舍 题目链接&#xff1a;力扣 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i]&#xff1a;截至到i位置的房屋&#xff0c;最多可以偷窃的金额为dp[i]。确定递推公式 决定dp[i]的关键因素就是第i房间偷还是不偷。如果偷第i房间&#xff0c;那么dp[i] …

Ceph分布式存储系统搭建

目录 安装部署示例 &#xff08;一&#xff09;准备环境 1). 设置主机名 2). 关闭防火墙 3).添加sdb磁盘并格式化 4).配置hosts解析文件 5).配置免密登录 6).同步时区 7). 安装 Ceph 包 &#xff08;二&#xff09;创建 Ceph 集群 1、 安装ceph-deploy管理工具 2、 …

【C++】STL——string类的基本介绍、string常见的使用、string类的接口说明、string类的容量操作

文章目录 1.C语言的字符串2.C标准库中的string类2.1string类2.2string类的常用接口说明2.3string类对象的容量操作 1.C语言的字符串 在C语言中&#xff0c;字符串被表示为字符数组。C语言中的字符串以’\0’字符&#xff08;null字符或字符串结束符&#xff09;结尾&#xff0c…

了解 Splashtop 的多层安全防护措施

随着技术的进步&#xff0c;如何确保数据安全也越来越重要。Splashtop 作为行业领先的远程访问软件供应商&#xff0c;对这一点非常了解。Splashtop 基于信任、客观性、监控和隐私搭建安全框架&#xff0c;致力于保护所有数据交互和用户设备。 了解 Splashtop 安全性的核心 S…