ROS操作系统学习笔记4

电子说

1.2w人已加入

描述

第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的回调函数,注意是无返回类型的;重新自定义一个消息类型,注意文件夹命名以及文件后缀名称。基本是这些。

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分