【ROS】机械人开发五--ROS基本概念的程序实现

news2024/11/14 11:28:20

机械人开发五--ROS基本概念的程序实现

  • 一、开发工具
  • 二、RoboWare Studio的基本使用
    • 2.1 软件启动
    • 2.2 修改界面语言
    • 2.3 使用
    • 2.4 编译文件
    • 2.5 卸载
  • 三、话题通信
  • 四、话题的代码编写
    • 4.1 发布端
    • 4.2 接收端
    • 4.3 测试
  • 五、自定义消息
    • 5.1 自定义消息类型
    • 5.2 自定义消息发布端
    • 5.3 自定义消息接收端
    • 5.4 测试


一、开发工具

  • ubuntu18.04
  • RoboWare Studio

关于RoboWare Studio的下载,这里给出安装包的下载链接:
链接:https://pan.baidu.com/s/1ypCs18v26PW8Of3aOunDow
提取码:v2se

安装前提:

  • 操作系统为ubuntu
  • 已完成ROS系统的安装配置(前面的文章已经讲了)
  • 安装 python-pip: sudo apt-get install python-pip

下载后将其移动到虚拟机内,打开文件系统,双击安装包就行了,遇到提示就按 Esc 就行了,CSDN上安装教程有很多,这里就不多赘述了。

至于我问什么要安装这个IDE呢?最最主要的原因就是,他可以自动修改CMakeList.txt与其他配置文件的设置,非常方便。


二、RoboWare Studio的基本使用

2.1 软件启动

下载完成后在命令行输入:

roboware-studio

启动软件
在这里插入图片描述


2.2 修改界面语言

① 根据如下图所示,打开对应语言设置文件。
在这里插入图片描述

② 将 "locale":"en" ,修改为 "locale":"zh-CN"
在这里插入图片描述
保存并重启系统,可以看到语言已经修改为中文了。


2.3 使用

① 点击 文件,可新建工作区。
在这里插入图片描述
我这边已经有工作区了,就是上几节创建的 catkin_ws,选择打开工作区就行了。

② 右击工作区下的 src,可以选择 新建ROS包
在这里插入图片描述
③ 右击 新建的ROS包,可以为其添加依赖。
在这里插入图片描述
在这里插入图片描述
④ 右击新建包ROS 目录下 src 目录,可以新建CPP文件
在这里插入图片描述
新建的文件后,会弹出列表,选择 加入新的可执行文件中,IDE工具则会根据CPP文件名创建一个与之同名的可执行文件(ROS节点),此时CMakeList.txt文件会自动更新。
在这里插入图片描述


2.4 编译文件

① 修改上面的编译设置为 Debug。
在这里插入图片描述
② 点击小锤子,进行编译,效果与catkin_make一样。


2.5 卸载

命令行输入:

sudo apt-get remove roboware-studio

可以卸载软件。


三、话题通信

话题通信是ROS节点通信方式的一种,它是一对多、异步的通信,方式在上一节的内容讲过了。
这里不过赘述。
这里讲一下一些话题命令。

  • rostopic echo :打印话题信息
  • rostopic hz : 话题频率
  • rostopic info :话题信息
  • rostopic list :列举话题
  • rostopic pub :往话题输入信息
  • rostopic bw : 话题带宽
  • rostopic find :从数据类型寻找话题
  • rostopic type :查看话题的数据类型

四、话题的代码编写

上几节讲了节点的概念,在ROS中,最小的进程单位称为节点(Node)。每个节点都是一个可执行文件,可以是C++或Python文件,下面这里用C++代码来实现节点。

4.1 发布端

打开编辑器,右击ROS包目录下的src,创建 PubForBeginner.cpp,内容如下:

#include "ros/ros.h"
#include "std_msgs/String.h"

int main(int argc, char **argv)
{
    //initial and name node
    ros::init(argc, argv, "publisher");
    //create nodehandle
    ros::NodeHandle nh;
    //create publisher
    ros::Publisher simplepub = nh.advertise<std_msgs::String>("string_topic",100);
    ros::Rate rate(10);
    //message for publish
    std_msgs::String pubinfo;
    pubinfo.data = "Hello, I'm Publisher!";
    while(ros::ok())
    {
        simplepub.publish(pubinfo);
    }

    return 0;
}
  • ros::init :创建 ros 节点,并命名为 publisher。
  • ros::NodeHandle :创建 节点的句柄。
  • ros::Publisher simplepub:创建发布者,并在主题名为 string_topic 的主题上发布类型为<std_msgs::String>的消息。
  • std_msgs::String pubinfo; 定义的消息类型。
  • simplepub.publish(pubinfo); 发布数据

4.2 接收端

打开编辑器,右击ROS包目录下的src,创建 SubForBeginner.cpp,内容如下:

#include "ros/ros.h"
#include "std_msgs/String.h"

using namespace std;

void subCallback(const std_msgs::String& submsg)
{
    string subinfo;
    subinfo = submsg.data;
    ROS_INFO("The message subscribed is: %s",subinfo.c_str());
}
int main(int argc,char** argv)
{
    //initial and name node
    ros::init(argc,argv,"subscriber");
    //create nodehandle
    ros::NodeHandle nh;
    //create subscriber
    ros::Subscriber sub = nh.subscribe("string_topic",1000,&subCallback);
    ros::spin();
    return 0;
}
  • subCallback:订阅节点的回调函数,对接收的消息进行打印处理。
  • ros::Subscriber sub :订阅 主题名为 string_topic 上的消息,接收到消息后调用回调函数处理。
  • ros::spin(); :ROS消息的回调处理函数,程序运行到这里后不再往下处理。

4.3 测试

① 首先点击编译。
在这里插入图片描述
编译失败,可以在 ②位置处寻找问题,如果是语法问题,编译器里会使用 红线 勾出。

② 打开一个终端输入:

roscore
在这里插入图片描述

③ 再分别打开两个终端,在两个终端分别输入下面的命令:
格式:rosrun 包名 cpp文件名(节点名)

rosrun pub_dis_02 SubForBeginner
在这里插入图片描述
rosrun pub_dis_02 PubForBeginner
在这里插入图片描述

④ 在 接收端可以看到实验结果:
在这里插入图片描述
⑤ 新建一个终端输入命令 rosrun rqt_graph rqt_graph,可以查看节点间通信的通信关系。
在这里插入图片描述


五、自定义消息

根据上面的代码我们知道,发布与接收的消息需要遵循同一种类型,ROS系统已经帮我们定义了一些常用的数据类型。例如上面代码我们使用的。

当有些时候,当系统的消息类型无法满足我们的使用时,我们就需要自定义消息类型来使用。

这里重新建一个ROS包,来演示自定义消息类型。

5.1 自定义消息类型

① 我们又新建了一个ROS包,使用和上面相同的ROS包依赖。在 RoboWare Studio 中,右击ROS包,就可以创建 msg 文件夹,在msg创建自定义消息文件,格式为.msg。或者可以直接敲命令进行创建。但自定义消息文件必须储存在msg文件夹内。
在这里插入图片描述
② 在msg 文件夹内创建 Student.msg。文件名可以自定义。内容包含如下:
在这里插入图片描述

string name
float64 height
float64 weight

内容是:

  • 字符串类型 ,保存学生姓名
  • 64位的数据类型,保存学生的身高
  • 64位的数据类型,保存学生的体重

③ 在创建了自定义类型后,需要在ROS包目录下修改以下内容(如果文件中已经修改了,就不管)
package.xml文件修改:

  • 添加:<build_depend>message_generation</build_depend>
  • 添加:<exec_depend>message_runtime</exec_depend>

CMakeLists.txt文件修改:

  • 修改:find_package (catkin REQUIRED COMPONENTS roscpp std_msgs message_generation),就是添加message_generation
  • 打开注释,且有以下内容:add_message_files( FILES Message1.msg ),Message1为你自己自定义msg文件名
  • 打开注释,且有以下内容:generate_messages( DEPENDENCIES std_msgs )
  • 打开注释,且有以下内容:catkin_package( CATKIN_DEPENDS message_runtime … )

④ 点击编译,就可以在工作空间目录下,的devel目录下找到Student.h。我们使用自定义类型时,包含这个头文件就行了。
在这里插入图片描述


5.2 自定义消息发布端

#include "ros/ros.h"
#include "book_msg_03/Student.h"
#include <cstdlib>

using namespace std;

int main(int argc, char **argv)
{
    //initial and name node
    ros::init(argc, argv, "node_MsgPub");

    if(argc != 4)
    {
        cout << "Error command parameter!\n"\
        << "Please run command eg:\n"\
        << "rosrun book_msg_03 Book_MsgPub name height weight" << endl;
        return -1;
    }

    //create node handle
    ros::NodeHandle nh;

    //create messge publisher
    ros::Publisher MsgPub = nh.advertise<book_msg_03::Student>("MyMsg", 100);
    book_msg_03::Student stdmsg;
    stdmsg.name = argv[1];
    stdmsg.height = atof(argv[2]);
    stdmsg.weight = atof(argv[3]);

    ros::Rate rate(10);
    while(ros::ok())
    {
        MsgPub.publish(stdmsg);
        rate.sleep();
    }
    return 0;
}
  • if(argc != 4) :提醒用户如何使用该节点。
  • ros::Publisher MsgPub = nh.advertise<book_msg_03::Student>(“MyMsg”, 100); 这里我们使用了自定义消息类型,格式为ROS包名::自定义消息类型。
  • rate.sleep(); 固定发送消息的频率。

5.3 自定义消息接收端

#include "ros/ros.h"
#include "book_msg_03/Student.h"

// custom defined message callback function
void MsgCallback(const book_msg_03::Student &stdInfo)
{
    ROS_INFO("The student information is:\n name:%s--height:%f--weight:%f",
        stdInfo.name.c_str(),
        stdInfo.height,
        stdInfo.weight);

}

int main(int argc, char *argv[])
{
    //initial and name node
    ros::init(argc, argv, "node_MsgSub");
    //create node handle
    ros::NodeHandle nh;
    //create subscriber
    ros::Subscriber MsgPub = nh.subscribe("MyMsg" ,100, &MsgCallback);
    ros::spin();

    return 0;
}

类似之前的接收端程序,不过这里使用的是自定义的学生消息数据类型。


5.4 测试

① 首先点击编译。
在这里插入图片描述
编译失败,可以在 ②位置处寻找问题,如果是语法问题,编译器里会使用 红线 勾出。

② 打开一个终端输入:

roscore
在这里插入图片描述

③ 再分别打开两个终端,在两个终端分别输入下面的命令:
格式:rosrun 包名 cpp文件名(节点名)

rosrun book_msg_03 Book_MsgSub
在这里插入图片描述
rosrun book_msg_03 Book_MsgPub xiaoming 180 74
在这里插入图片描述

④ 在 接收端可以看到实验结果:
在这里插入图片描述

⑤ 新建一个终端输入命令 rosrun rqt_graph rqt_graph,可以查看节点间通信的通信关系。
在这里插入图片描述


到这里就结束啦!
在这里插入图片描述

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

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

相关文章

el-menu动态加载路由,菜单的解决方案

先看需要实现的效果 这里有一级也有二级菜单&#xff0c;注意二级菜单的父目录&#xff08;”选项设置“点击不会跳转&#xff0c;只是展开目录&#xff09;&#xff0c;然后点击去详情页&#xff0c;需要跳到一个隐藏的路由&#xff0c;不在菜单展示的路由 还有一点要注意&…

LaTex常用技巧5:公式太长换行并加大括号

使用LaTex做笔记的时候发现公式太长&#xff0c;一行会超出页面&#xff0c;于是想到换行。 原来的代码&#xff0c;这里使用了包bm&#xff0c;测试的时候前面请使用\usepackage{bm}。 \begin{equation}_{i}^{G} {\bm{a}}\begin{cases} _{i}^{i-1}\ddot{\bm{p}}, &i1\\_…

web课程设计网页规划与设计 html+css+javascript+jquery+bootstarp响应式游戏网站Bootstrap模板(24页)

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

网址,URL,域名,IP地址,DNS,域名解析(转载)

一、基本常识 互联网上的所有数据都是存储在主机(服务器)上互联网中的所有主机都拥有唯一的IP地址互联网中任意两台主机通信都是通过IP地址来实现 上网的实质 就是获取网址对应主机上的数据并在用户主机上进行展示(浏览器上) 疑问&#xff1a;互联网中的任意两台主机通信是依…

详细介绍百度ERNIE:通过知识集成增强表示

文章目录ERNIE简介相关工作采用矢量表示单词 &#xff0c;上下文无关的表示采用上下文来预测丢失的单词&#xff0c;没有考虑先验知识采用异构数据ERNIE的详细实现Transformer编码器知识整合基本级别掩码短语级别掩码实体级别掩码实验异构语料库预训练DLM&#xff08;对话语言模…

python自动化:桌面壁纸下载器,满足你对桌面壁纸的无限畅想!

随着计算机性能的提升&#xff0c;人们对计算机个性化的要求也越来越高了&#xff0c;自己使用的计算机当然要设置成自己喜欢的风格&#xff01; 对于桌面壁纸有着强烈要求的朋友们有福了&#xff0c;推荐一个微软免费畅玩无限高清壁纸的官网。 https://cn.bing.com/images/t…

深入学习数组

目录 一、一维数组 1、数组的创建和初始化 2、一维数组的使用 3、*一维数组在内存中的存储 二、二维数组 1、二维数组的创建和初始化 2、二维数组的使用 3、*二维数组在内存中的存储 三、数组越界 一、一维数组 1、数组的创建和初始化 数组是一组相同类型元素的集合。 数组…

UNIAPP实战项目笔记42 购物车页面新增收货地址

UNIAPP实战项目笔记42 购物车页面新增收货地址 设置新增收货地址页面布局和功能 具体内容图片自己替换哈&#xff0c;随便找了个图片的做示例 用到了vuex的状态机,具体位置见目录结构 代码 my-add-path.vue 页面部分 my-add-path.vue 设置页面布局 用到了vuex的状态机 <te…

steam搬砖副业,月入2万+,内含全套讲解

Steam平台是一款国外知名的数字游戏社交平台&#xff0c;steam游戏平台起初只是一个整合游戏的下载平台&#xff0c;随着软件的发展&#xff0c;逐渐演变为了游戏社交平台&#xff0c;steam是世界上目前最大的游戏平台之一&#xff0c;而「网易BUFF」是一款由网易公司推出&…

Unity3D简陋版跑酷游戏

目录 功能演示 功能简介 制作步骤 功能演示 链接&#xff1a;https://pan.baidu.com/s/1E_2JXWlVJNf3S5l-dH2UuQ提取码&#xff1a;dm5e 视频教学:Unity3D大作业 超级简陋版的跑酷游戏_哔哩哔哩_bilibili 功能简介 本次跑酷游戏主要从跑道&#xff0c;UI设计&#xff0c;…

[附源码]java毕业设计小区宠物管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

MyBatis--获取参数值

MyBatis获取参数值的两种方式 &#xff1a; ${} 和 #{} ${}的本质是字符串 &#xff0c;#{}的本质是占位符赋值 ${}使用字符串拼接的方式拼接sql &#xff0c;若为字符串类型或日期类型的字段进行赋值时&#xff0c;需要手动加单引号。 #{}使用占位符赋值的方式拼接sql &#x…

[附源码]java毕业设计小锅米线点餐管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【Spring Cloud实战】Spring Cloud Bus消息总线

gitee地址&#xff1a;https://gitee.com/javaxiaobear/spring-cloud_study.git 在线阅读地址&#xff1a;https://javaxiaobear.gitee.io/ 1、概述 Spring Cloud Bus将分布式系统的节点与轻量级消息代理链接。这可以用于广播状态更改&#xff08;例如配置更改&#xff09;或其…

15.PyQt5中的事件系统之事件(QEvent)简介

PyQt5中的事件系统 一、什么是Qt中的事件 事件&#xff08;event&#xff09;是由窗口系统或者Qt自身产生的事情或动作的通称。当用户按下或者松开键盘或鼠标的按键时&#xff0c;就可以产生一个键盘或者鼠标事件&#xff1b;当某个窗口第一次显示的时候&#xff0c;就会产生一…

Pytorch的入门操作(二)

2、Pytorch 2.1 Pytorch的介绍和安装 目标&#xff1a; 知道如何安装Pytorch 2.1.1 Pytorch的介绍 Pytorch是Facebook发布的深度学习框架&#xff0c;由其易用性&#xff0c;友好性&#xff0c;深受广大用户青睐 2.1.2 Pytorch的版本 2.1.3 Pytorch的安装 安装地址介绍&…

Matlab论文插图绘制模板第65期—带等高线的曲面图(Surfc)

在之前的文章中&#xff0c;分享了Matlab曲面图的绘制模板&#xff1a; 这一次&#xff0c;再来分享一下带等高线的曲面图的绘制模板。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;Matlab论文插图绘制模板系列&#xff0c;旨在降低大家使用Matlab进行科研绘图的门槛…

【数据结构与算法】最小生成树与最短路径

&#x1f525; 本文由 程序喵正在路上 原创&#xff0c;CSDN首发&#xff01; &#x1f496; 系列专栏&#xff1a;数据结构与算法 &#x1f320; 首发时间&#xff1a;2022年11月21日 &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f43e…

棋盘覆盖问题(Java)

文章目录棋盘覆盖问题&#xff08;Java&#xff09;1、问题描述2、算法设计思路3、代码实现4、复杂度分析5、参考棋盘覆盖问题&#xff08;Java&#xff09; 1、问题描述 在一个2k2k个方格组成的棋盘中,若恰有一个方格与其他方格不同,则称该方格为一特殊方格,且称该棋盘为一个…

D. Radio Towers(斐波那契+逆元)

Problem - 1452D - Codeforces 在一条坐标线上有n2个城镇&#xff0c;编号从0到n1。第i个城镇位于第i点。 你在1,2,......,n个镇上各建一座无线电塔&#xff0c;概率为12&#xff08;这些事件是独立的&#xff09;。之后&#xff0c;你想把每个塔的信号功率设置为1到n的某个整…