0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ROS操作系统学习笔记4

jf_78858299 来源:机器人网 作者:机器人网 2023-05-19 17:37 次阅读

第3步,设置CMakeLists.txt&package.xmlCMakeLists.txt:

find_package(catkin REQUIRED COMPONENTS
 roscpp
 std_msgs
)//告诉系统编译本包时,需要找到这两个包

catkin_package(
# INCLUDE_DIRS include
# LIBRARIES study
CATKIN_DEPENDS roscpp std_msgs
# DEPENDS system_lib
)//声明依赖本包同时需要里面这两个ros包

add_executable(${PROJECT_NAME}_node src/study_listen_node.cpp)//编译本包生成的可执行文件

add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})//链接可执行文件和依赖库

//一般情况而已,CMakeLists.txt是创建包同时,系统自动生成的,然后,我们需要的工作,一般情况就是把上面基本地方去掉#号就行了(目的告诉系统,关于该包,在哪,依赖是啥)

package.xml:

roscppclass="hljs-name"build_depend>
std_msgsclass="hljs-name"build_depend>
roscppclass="hljs-name"exec_depend>
std_msgsclass="hljs-name"exec_depend>
//主要修改类似样式,当然,本例子比较简单,系统生成的,不需要做其他修改,但是,如果节点添加新的依赖,需要在这些地方添加相应的包

第4步,编译

$ catkin_make  #注意在要做工作空间的一级目录下使用该指令

第5步,验证

$ roscore & #运行一个ROS master
$ rosrun study study_node & #包名+节点名;由于测试listener的节点,所以需要启动一个talker的node才行
$ rostopic echo #study_topic
data: "hello study world!432"
---
data: "hello study world!433" //表示发布成功
#开启一个新终端
$ rosrun study study_listen_node #包名+节点名
[ INFO] [1606043574.419247936]: I can see you again,hello study world!178 //表示监听成功

这时,从零开始创建的listener节点node,成功创建完成

  1. 自定义消息类型并发布演示

这里主要就是定义一个消息类型是重点,然后,在上面创建的talker以及listener包里面头文件包含,然后在CMakeLists.txt&package.xml两文件中,添加新的头文件类型即可使用新定义的消息类型了。

第一步,创建一个包:

$ catkin_create_pkg study_msgs std_msgs roscpp

第二步,在包创建一个msg文件夹( 注意文件夹名称一定是这样子的,否则,在cmakelists要修改很多 )

第三步,在文件夹中新建文件,StudyMsg.msg(注意命名方式以及后缀)

string detail
int32 id

注意,自定义的消息类型,记得一定不能写其他说明性内容进去,否则发生编译错误

第四步,设置CMakeLists.txt&package.xmlCMakeLists.txt:

find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs message_generation
)

## Generate messages in the 'msg' folder//这里可以看出,系统只会在msg文件夹中查找,对应第二步
add_message_files(
  FILES
  StudyMsg.msg
)

## Generate added messages and services with any dependencies listed here
generate_messages(
  DEPENDENCIES
  std_msgs
)

package.xml:

<build_depend>message_generation<span class="hljs-name"build_depend>
  <exec_depend>message_runtime<span class="hljs-name"exec_depend>

第五步,编译,catkin_make

第六步,查看

$ cd include/study_msgs
$ ls
StudyMsg.h   //表示该头文件生成成功

这时候,自定义消息类型生成成功,并且,可以被其他包通过头文件#include"study_msgs/StudyMsg.h"方式,就可以正常使用。下面,以发布一个talker节点来展示,并且发布的topic名称为/study_topic_new当然,CMakeLists.txt&package.xml要做相应的补充,CMakeLists.txt:

find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs study_msgs
)

catkin_package(
# INCLUDE_DIRS include
# LIBRARIES study
CATKIN_DEPENDS roscpp std_msgs study_msgs
# DEPENDS system_lib
)
//两者都是添加新消息类型study_msgs

package.xml:

study_msgsclass="hljs-name"build_depend>
study_msgsclass="hljs-name"exec_depend>
//添加新消息类型study_msgs

此时,study_node.cpp为:

#include"ros/ros.h"
#include"std_msgs/String.h"
#include
#include"study_msgs/StudyMsg.h"//使用自定义消息类型

int main(int argc,char **argv){
   ros::init(argc,argv,"study_talker");//node's attribute name
   ros::NodeHandle n;
   ros::Publisher study_pub=n.advertise

终端查看:

$ rostopic echo /study_topic_new
---
detail: "hello study world! new"
id: 29975
---

4.** 参数中心rosparam的使用演示**

开始展示之前,一定要记得在study_listen包的CMakeLists.txt&package.xml做好跟上面的talker包study一样准备,保证可以使用自定义消息类型。

study_node.cpp:

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

int main(int argc,char **argv){
   ros::init(argc,argv,"study_talker");//node's attribute name
   ros::NodeHandle n;
   ros::Publisher study_pub=n.advertise

study_listen_node.cpp:

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


void studyCallback(const std_msgs::String::ConstPtr& msg){
  ROS_INFO("I can see you again,%s ",msg->data.c_str());
}//测试是监听study_topic成功与否

void studyCallback_new(const study_msgs::StudyMsg::ConstPtr& msg){
  ROS_INFO("I think I cant forget you,%s,%d",msg->detail.c_str(),msg->id);
}//测试监听自定义消息成功与否

void studyCallback_param(const study_msgs::StudyMsg::ConstPtr& msg){
  ROS_INFO("I think I cant forget you,%s,%d",msg->detail.c_str(),msg->id);
}//测试rosparam参数中心是否工作成功

int main(int argc,char ** argv){
  ros::init(argc,argv,"study_listener");
  ros::NodeHandle n;
  ros::Subscriber sub=n.subscribe("/study_topic",10,studyCallback);
  ros::Subscriber sub_new=n.subscribe("study_topic_new",10,studyCallback_new);
  ros::Subscriber sub_param=n.subscribe("/params_topic",10,studyCallback_param);
  ros::spin();
  return 0;
}

修改了上面的两个文件,接下来就是编译整个工作空间并成功,接着在终端执行

$ roscore &  #启动ros master
$ rosrun study study_node & #启动talker节点
$ rosrun study_listen study_listen_node #启动listener节点
[ INFO] [1606047990.464340880]: I can see you again,hello study world!99
[ INFO] [1606047990.464436530]: I think I cant forget you,hello study world! new,100
[ INFO] [1606047990.476383810]: I think I cant forget you,cc,100

这时候我们发现,上面我们定义的回调函数,都成功调用了(表示上面的talker/listener/自定义消息 类型都是编写并运行正常的)当我们在终端2启动参数中心rosparam设置参数:

$ rosparam set /myparam "yqy"

终端1的显示调整为:

[ INFO] [1606048163.371016634]: I can see you again,hello study world!368
[ INFO] [1606048163.371113447]: I think I cant forget you,hello study world! new,369
[ INFO] [1606048163.394940978]: I think I cant forget you,yqy,369

也就是将周期第三个,cc调整为yqy了。

本章小结:创建一个包,需要定义好CmakeLists.txt 、package.xml两个文件,主要就是告诉系统,我这个包编译和运行时依赖是什么;talker和listener的编写也是基本套路一样的,重新发布的主题以及消息类型以及内容就发布ok了;listener的回调函数,注意是无返回类型的;重新自定义一个消息类型,注意文件夹命名以及文件后缀名称。基本是这些。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 仿真
    +关注

    关注

    50

    文章

    3872

    浏览量

    132161
  • 调试
    +关注

    关注

    7

    文章

    527

    浏览量

    33625
  • ROS
    ROS
    +关注

    关注

    1

    文章

    271

    浏览量

    16681
收藏 人收藏

    评论

    相关推荐

    嵌入式Linux操作系统学习规划,不看肯定后悔

    嵌入式Linux操作系统学习规划,不看肯定后悔
    发表于 04-28 06:22

    探讨嵌入式操作系统

    嵌入式操作系统学习笔记
    发表于 10-27 06:56

    嵌入式系统学习笔记相关资料推荐

    嵌入式系统学习笔记
    发表于 10-27 07:43

    嵌入式Linux操作系统学习规划

    嵌入式Linux操作系统学习规划ARM+LINUX路线,主攻嵌入式Linux操作系统及其上应用软件开发目标:(1) 掌握主流嵌入式微处理器的结构与原理(初步定为arm9)(2) 必须掌握一个嵌入式
    发表于 11-05 06:45

    Linux操作系统下的Python语言程序设计

    文章目录前言导引前言由于本专栏涉及内容较多,如果大家希望系统学习Linux操作系统下的Python语言程序设计,可参考此文章。按本文章所列文章内容进行学习即可,其它文章作为辅助参考资料使用。导引(1
    发表于 12-22 06:17

    UCOSII操作系统的简介

    前言这是我将UCOSII操作系统移植在STM32单片机上后进行UCOSII操作系统学习的一些笔记与理解,此文最后会附上我自己在UCOSII操作系统下使用STM32写
    发表于 01-12 06:00

    ROS操作系统有何作用

    ROS是什么?ROS操作系统有何作用?
    发表于 02-11 07:40

    ROS的含义与机器人操作系统ROS的介绍

    Operating System 的缩写,原本是斯坦福大学的一个机器人项目,后来由 WillowGarage 公司发展,目前由 OSRF(Open Source Robotics Foundation,Inc)公司维护的开源项目。 1、首先是一个操作系统 根据 wikipedia 定义,
    发表于 09-26 14:08 12次下载

    嵌入式操作系统学习笔记

    嵌入式操作系统学习笔记
    发表于 10-20 13:51 3次下载
    嵌入式<b class='flag-5'>操作系统学习</b><b class='flag-5'>笔记</b>

    51操作系统学习笔记(三):建立一个属于自己的AVR的RTOS(1)

    这篇笔记虽然是“51操作系统学习笔记”,但没有找到合适的代码。用杨明记的感觉还有点难度。因而转学《建立一个属于自己的AVR的RTOS》这篇文章绝对是学操作系统入门经典之作。经典之处在于
    发表于 11-15 18:36 9次下载
    51<b class='flag-5'>操作系统学习</b><b class='flag-5'>笔记</b>(三):建立一个属于自己的AVR的RTOS(1)

    51操作系统学习笔记(四):建立一个属于自己的AVR的RTOS(2)

    承接51操作系统学习笔记(三):建立一个属于自己的AVR的RTOS(1),在avr中调试一下下面的程序.为了加深学习应用,决定把代码全部输一遍,比复制的学些效果应该好一些吧。打开Avr studio
    发表于 11-15 21:06 7次下载
    51<b class='flag-5'>操作系统学习</b><b class='flag-5'>笔记</b>(四):建立一个属于自己的AVR的RTOS(2)

    ROS基本介绍

    近来找到的实习主要是做智能车控制,用到的也就是ROS机器人操作系统ROS需要运行在一个操作系统上,这个操作系统常用的就是Linux,而公司
    的头像 发表于 05-19 17:07 5125次阅读
    <b class='flag-5'>ROS</b>基本介绍

    ROS操作系统学习笔记1

    机器人操作系统(Robot operating system ,ROS)是一个应用于机器人上的基础框架,它把原本松散的零部件耦合在一起,提供通信的架构,近似上ROS是一个中间件。 ros
    的头像 发表于 05-19 17:20 558次阅读
    <b class='flag-5'>ROS</b><b class='flag-5'>操作系统学习</b><b class='flag-5'>笔记</b>1

    ROS操作系统学习笔记2

    机器人操作系统(Robot operating system ,ROS)是一个应用于机器人上的基础框架,它把原本松散的零部件耦合在一起,提供通信的架构,近似上ROS是一个中间件。 ros
    的头像 发表于 05-19 17:21 403次阅读

    ROS操作系统学习笔记3

    摘要:这篇文章主要介绍ROS常用工具、ROSPY和ROSCPP常用模块,完全看完三篇文章,可以说ROS就基本入门,可以自己动手做实验了。 **ROS常用工具** ROS工具
    的头像 发表于 05-19 17:37 774次阅读
    <b class='flag-5'>ROS</b><b class='flag-5'>操作系统学习</b><b class='flag-5'>笔记</b>3