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;
}