电子说
第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,成功创建完成
这里主要就是定义一个消息类型是重点,然后,在上面创建的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的回调函数,注意是无返回类型的;重新自定义一个消息类型,注意文件夹命名以及文件后缀名称。基本是这些。
全部0条评论
快来发表一下你的评论吧 !