ROS——c++学习笔记

代码均在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文件的名称。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值