代码均在vscode中编写
注意:在创建一个新的工作空间时,应该先在进行一项工作:例如我的工作空间叫ws01,那么在/ws01/.vscode/c_cpp_properties.json下,找到cppStandard,将其后面的标准改为c++17,不然在编写程序时包含头文件ros/ros.h就会报错。
话题通信:
1.非自定义消息类型
发布方基本代码:
#include"ros/ros.h"
#include"std_msgs/String.h"
#include"sstream"
int main(int argc, char *argv[])
{
ros::init(argc,argv,"pub01");
ros::NodeHandle nh;
ros::Publisher pub=nh.advertise<std_msgs::String>("topic",10);
std_msgs::String msg;
ros::Rate rate(10);
int count=0;
std::string str="hello";
while(ros::ok())
{
std::stringstream ss;
ss<<str<<count;
msg.data=ss.str();
pub.publish(msg);
rate.sleep();
count++;
}
return 0;
}
注意事项:
1.使用vscode的main函数格式时,main函数的第二个参数会写成char const *argv[ ],需要将const删掉,不然后续程序运行会出错。
2.在实例化发布方对象时,调用节点句柄的成员函数advertise时后面一定要加上尖括号声明模板类型(声明的是发布的消息的数据类型),因为在实例化订阅方时不需要加,所以容易忘,例如这里的消息类型就是std_msgs作用域下的String类型。
订阅方基本代码:
#include"ros/ros.h"
#include"std_msgs/String.h"
void domsg(const std_msgs::String::ConstPtr &msg)
{
ROS_INFO("订阅方接收的消息为%s",msg->data.c_str());
}
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
ros::init(argc,argv,"sub01");
ros::NodeHandle nh;
ros::Subscriber sub =nh.subscribe("topic",10,domsg);
ros::spin();
return 0;
}
注意事项:
1.如果需要在终端中打印中文时,需要加一行代码setlocale(LC_ALL,"");
2.有回调函数,那么就必须得在回调函数后加上spin()函数
3.定义回调函数时,其参数是指向常量消息的智能指针,具体格式为:
const <message_type>::ConstPtr& <msg_name>
2.自定义消息类型
首先需要在功能包下新建一个msg文件夹,在该文件夹下新建一个.msg文件
.msg文件格式
string name
int32 age
float32 height
第一列是数据类型,第二列是数据名称,格式十分简单
编写c++代码时自定义消息类型与非自定义的相差无几,编写好.msg文件后需要首先进行编译,编译好后工作空间下的devel目录下的include目录下就会生成头文件,需要将该头文件地址写进c_cpp_properties.json下(具体格式如下图),建议直接写成include/**,这样的话同一个工作空间下的只需添加一次地址即可
{
"configurations": [
{
"browse": {
"databaseFilename": "${default}",
"limitSymbolsToIncludedHeaders": false
},
"includePath": [
"/opt/ros/noetic/include/**",
"/usr/include/**",
"/home/robot/ws01/devel/include/**"
],
"name": "ROS",
"intelliSenseMode": "gcc-x64",
"compilerPath": "/usr/bin/gcc",
"cStandard": "gnu17",
"cppStandard": "c++17"
}
],
"version": 4
}
如果不添加头文件地址,头文件会报错,c++包含自定义消息的头文件的格式为例:#include“pub_sub/Person.h”,这里pub_sub是功能包名称,Person是.msg文件的名称。
1622

被折叠的 条评论
为什么被折叠?



