0、编写msg文件<person.msg>
string name
int32 age
float64 height
1、修改packgae.xml
添加两行:
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
2、修改CMakeList.txt
10 ~15行:添加最后一个
编译依赖
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
51~54行:去除注释、然后修改
add_message_files(
FILES
person.msg
)
71~74:去除注释
generate_messages(
DEPENDENCIES
std_msgs
)
105~110行:去除注释、添加依赖
运行依赖
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES plumbing_pub_sub
CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
# DEPENDS system_lib
)
3、编译
编译成功之后会生成一些中间文件
就是这个persion的.h文件
python版本的也有:
这样大概就没有问题了
4、使用自定义的msg消息类型
ROSmaster已经被封装好了、只需要关注:发布方、接受方、数据
以下程序实现在vscode中实现(VSCODE书写ROS代码):
VSCODE书写ROS代码
1、修改vscode配置文件、以获得代码提示,防止报错。
修改c_cpp_properties.json文件、其实就是主要加入刚才编译生成的person.h头文件的路径
{
"configurations": [
{
"browse": {
"databaseFilename": "",
"limitSymbolsToIncludedHeaders": true
},
"includePath": [
"/opt/ros/noetic/include/**",
"/usr/include/**",
"/xxx/yyy工作空间/devel/include/**" //配置 head 文件的路径
],
"name": "ROS",
"intelliSenseMode": "gcc-x64",
"compilerPath": "/usr/bin/gcc",
"cStandard": "c11",
"cppStandard": "c++17"
}
],
"version": 4
}
2、消息发布方实现:
#include <ros/ros.h>
#include "plumbing_pub_sub/person.h"
int main(int argc,char *argv[]){
setlocale(LC_ALL,"");
ros::init(argc,argv,"talker");
ros::NodeHandle nh;
// node:personData
ros::Publisher pub = nh.advertise<plumbing_pub_sub::person>("personData",10);
// 编写发布逻辑
plumbing_pub_sub::person perData;
perData.age = 1;
perData.name = "cheng";
perData.height = 1.80;
ros::Rate rate(1);
while (ros::ok())
{
perData.age += 1;
pub.publish(perData);
rate.sleep();
// 建议、调用回头函数
ros::spinOnce();
}
return 0;
}
3、订阅者代码实现:
#include <ros/ros.h>
#include "plumbing_pub_sub/person.h"
void doPerson(const plumbing_pub_sub::person::ConstPtr& person_p){
ROS_INFO("订阅的人信息:%s, %d, %.2f", person_p->name.c_str(), person_p->age, person_p->height);
}
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
//1.初始化 ROS 节点
ros::init(argc,argv,"listener_person");
//2.创建 ROS 句柄
ros::NodeHandle nh;
//3.创建订阅对象
ros::Subscriber sub = nh.subscribe<plumbing_pub_sub::person>("personData",10,doPerson);
//4.回调函数中处理 person
//5.ros::spin();
ros::spin();
}
再次修改CMakeList.txt
149~150行:
add_dependencies(demo_pub_person ${PROJECT_NAME}_generate_messages_cpp)
add_dependencies(demo_sub_person ${PROJECT_NAME}_generate_messages_cpp)
以上修改的地方的行数是大概位置