roscpp学习笔记

roscpp主要包括

ros::init():解析传入的ros参数,使用roscpp第一步需要用到的函数

ros::NodeHandle():和topic、sevice、param等交互的公共接口

ros::master():包含从master查询信息的函数

ros::this_node:包含查询这个进程(node)的函数

ros::service:包含查询服务的函数

ros::param:包含查询参数服务器的函数,而不需要用到NodeHandle

ros::names:包含处理ros图资源名称的函数

ros::NodeHandle Class常用成员函数

//创建话题的publisher
ros::Publisher advertise(cosnt string &topic,uint32_t queue size);
//创建话题的subscriber
ros::Subscriber subscribe(cosnt string &topic,uint32_t queue_size,void(*)(M));

1、roscpp的topic写法

topic_demo

功能描述:两个node,一个发布模拟的GPS消息(格式为自定义,包括坐标和工作状态),另一个接收并处理该信息(计算到原点的距离)。

步骤:
1、packege

$ cd ~/catkin_ws/src
$ catkin_create_pkg topic_demo roscpp rospy std_msgs

2、msg

$ cd topic_demo/
$ mkdir msg
$ cd msg
$ vi gps.msg

gps.msg

float32 x
float32 y
string state

3、talker.cpp

#include<ros/ros.h>
#include<topic_demo/gps.h>
int main(int argc,char** argv){
    ros::init(argc,argv,"talker");    //解析参数,命名节点
    ros::NodeHandle nh;               //创建句柄,实例化node 
    topic_demo::gps msg;              //创建gps消息  
    msg.x=1.0;
    msg.y=1.0;
    msg.state="working";
    ros::Publisher pub=nh.advertise<topic_demo::gps>("gps_info",1);    //创建publisher
    ros::Rate loop_rate(1.0);        //定义循环发布的频率
    while(ros::ok()){
        msg.x=1.03*msg.x;            //以指数增长,每隔1秒
        msg.y=1.03*msg.y;
        ROS_INFO("Talker:GPS:x=%f,y=%f",msg.x,msg.y);        //输出当前msg
        pub.publish(msg);            //发布消息
        loop_rate.sleep();           //根据定义的发布频率,sleep
    }
    return 0;
}

4、listener.cpp

#include<ros/ros.h>
#include<topic_demo/gps.h>
#include<std_msgs/Float32.h>

void gpsCallback(const topic_demo::gps::ConstPtr &msg){
    std_msgs::Float32 distance;
    distance.data=sqrt(pow(msg->x,2),pow(msg->y,2));
    ROS_INFO("Listener:Distance to origin=%f,state=%s",distance.data,msg->state.c_str());
}

int main(int argc,char** argv){
    ros::init(argc,argv,"listener");
    ros::NodeHandle nh;
    ros::Subscriber sub=nh.subscriber("gps_info",1,gpsCallback);    //创建subscriber
    ros::spin();        //反复调用当前可触发的回调函数,阻塞
    return 0;
}

5、CMakeList.txt&package.xml(以下部分为需要添加或修改的部分)

find_package(catkin REQUIRED COMPONENTS message_generation roscpp rospy std_msgs)#指定依赖项
add_message_files(FILES gps.mag)    #添加自定义的msg
generate_message(DEPENDENCIES std_msgs)    #生成msg对应的头文件


add_executable(talker src/talker.cpp)    #生成可执行文件
add_dependencies(talker topic_demo_generate_messages_cpp)    #添加依赖,必须有此句以生成msg
target_link_libraries(talker ${catkin_LIBRARIES})    #链接

add_executable(listener src/listener.cpp)
add_dependencies(listen topic_demo_generate_messages_cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
<bulid_depend>message_generation</bulid_depend>
<run_depend>message_runtime</run_depend>

2、roscpp的service写法

功能描述:两个node,一个发布请求(格式自定义),另一个接收处理该信息,并返回信息。

步骤:
1、packege

$ cd ~/catkin_ws/src
$ catkin_create_pkg service_demo roscpp rospy std_msgs

2、srv

$ cd service_demo/
$ mkdir srv
$ vi Greeting.src

 Greeting.src

string name
int32 age
string feedback

3、service.cpp

#include<ros/ros.h>
#include<service_demo/Greeting.h>

bool handle_funciton(service::demo::Greeting::Requst &req,service::demo::Greeting::Response &res){
    //显示请求信息
    ROS_INFO("Request from %s with age %d",req.name().c_str(),req.age);
    //处理请求,结果写入response
    res.feedback="Hi"+req.name+".I'm server!";
    //返回true,正确处理了请求
    return true;
}

int main(int argc,char** argv){
    ros::init(argc,argv,"greeting_service");
    ros::NodeHandle nh;
    ros::ServiceServer service=nh.advertiseService("greetings",handle_function);
    ros::spin();
    return 0;
}

4、client.cpp

#include<ros/ros.h>
#include<service_demo/Greeting.h>

int main(int argc,char** argv){
    ros::init(argc,argv,"greeting_server");
    ros::NodeHandle nh;
    ros::ServiceClient client=nh.serviceClient<service_demo::Greeting>("greetings");
    service_demo::Greeting_srv;
    srv.request.name="HAN";
    srv.request.age=20;
    
    if(client.call(srv){
        ROS_INFO("Feedback from server:%s.",srv.response.feedback);
    }else{
        ROS_ERROR("Failed to call service greetings.");
        return 1;    
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值