ROS编程

124 阅读1分钟

Roscpp Topic_demo

  1. package
$ cd ~/catkin_ws/src
$ catkin_create_pkg topic_demo roscpp rospy std_msgs
  1. msg
$ cd topic_demo
$ mkdir msg
$ cd msg
$ gedit gps.msg
float32 x 
float32 y  
string state
  1. 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;
    topic_demo::gps msg;
    msg.x=1.0;
    msg.y=1.0;
    msg.state="working";
    ros::Publisher pub = nh.advertise<topic_demo::gps>("gps_info",1);
    ros::Rate loop_rate(1.0);
    while(ros::OK){
        msg.x=1.1*msg.x;
        msg.y=1.2*msg.y;
        ROS_INFO("Talker:GPS x=%f, y=%f",msg.x, msg.y);
        pub.Publish(msg);
        loop_rate.sleep();
    }
    return 0;
}
  1. listener.cpp
#include<ros/ros.h>
#include<topic_demo/gps.h>
#include<std_msgs/Float32.h>
void gpsCallback(topic_demo::gps::ConstPtr &msg){
    std_msgs::Float32 distance; 
    distance.data=sqrt(pow(msg.x,2)+pow(msg.y,2));
    ROS_INFO("distence is %f",distance.data);
}
int main(int argc,char **argv){
    ros::init(argc,argv,"listener");
    ros::NodeHandle nh;
    ros::Subscriber sub = nh.Subscribe("gps_info",1,gpscallback);
    ros::spin();
    return 0;
}
  1. CMakeLists.txt和Package.xml
catkin_minimum_required(VERSION 2.8.2)
project(topic_demo)
find_package(catkin REQUIRED COMPONENTS
    roscpp
    rospy
    std_msgs
    message_generation
)
add_message_files(FILES gps.msg)
generation_messages(DEPENDENCIES std_msgs)

catkin_package(CATKIN_DEPENEDS roscpp rospy std_msgs message_runtime)

add_executable(talker src/talker.cpp)
add_dependencies(talker topic_demo_generation_messages_cpp)
target_link_libraries(talker ${catkin_LIBRARIES})

add_executable(listener src/listener.cpp)
add_dependencieslistener topic_demo_generation_message_cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
<build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend>
  1. 编译
$ cd ~/catkin_ws
$ catkin_make

Roscpp service_demo

  1. package
$ cd ~/catkin_ws/src
$ catkin_create_pkg servic_demo roscpp rospy std_msgs
  1. srv
$ cd topic_demo
$ mkdir srv
$ cd srv
$ gedit Greeting.srv
string name 
int32 age  
---
string feedback

3.server.cpp

#include<ros/ross.h>
#include<service_demo/Greeting.h>
bool handle_function(service_demo::Greeting::Request &req,service_Demo::Greeting::Response &res){
    ROS_INFO("Requested from %s, age is %d",req.name,req.age);
    res.feedback = "HI"+req.name,"I'm server!";
    return true;
}
int main(int argc, char** argv){
    ros::init(argc,argv,"greeting_server");
    ros::NodeHandle nh;
    ros::ServiceServer server= nh.advertiseService("greetings",handle_function);
    ros::spin();
    retunrn 0;
}

4.client.cpp

#include<ros/ros.h>
#include<service_demo/Greeting.h>
int main(int argc, char **argv){
    ros::init(argc,argv,"greeting_client");
    ros::NodeHandle nh;
    service_demo::Greeting srv;
    srv.name="HAN";
    srv.age=20;
    ros::ServiceClient client=nh.serviceClient<service_demo::Greeting>("greetings");
    if(client.call(srv)){
        ROS_INFO("my name is %s, age is %d",srv.name,srv.age);
    }
    else{
        ROS_ERROR("Failed");
        return 1;
    }
    return 0;
}

5.CMakeLists.txt和package.xml

project(service_demo)
find_package(catkin REQUIRED COMPONETS
    roscpp
    rospy
    std_msgs
    message_generation
)

add_service_files(FILES Greeting.srv)
generate_messages(DEPENDENCIES std_msgs)

catkin_package(CATKIN_DEPENDS roscpp rospy std_msgs message_runtime)

add_executable(server src/server.cpp)
add_dependencies(server service_demo_generation_message.cpp)
target_link_libraries(server ${catkin_LIBRARIES})

add_executable(client src/client.cpp)
add_dependencies(client service_demo_generation_message.cpp)
target_link_libraries(client ${catkin_LIBRARIES})
<build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend>

6.编译

$ cd ~/catkin_ws
$ catkin_make