ROS入門チュートリアル(7) - クライアントライブラリ(下)

roscpp異なるデモのデモ

topic_demo

基本モデルは、テンプレートを参照することができ、同様です。

機能概要:2ノード(座標及び動作状態を含むカスタム形式)解放メッセージシミュレーGPSは、メッセージが受け入れられ、(原点からの距離を計算するために)さらに処理されます。

/gps
传感器
处理器

ステップ:

  1. パッケージ
  2. MSG
  3. talker.cpp
  4. listener.cpp
  5. CMakeList.txt&package.xmlの
1.パッケージ
$ 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

あなたはMSGの作成を完了すると、コンパイラが生成し~/catkin_ws/devel/include/topic_demo/gps.hたファイルを。書き込みコードは、それに含ま

#include<topic_demo/gps.h>
topic_demo::gps msg;
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,<需要publish的类型>
    ros::Rate loop_rate(1.0);   //定义循环发布的频率
    while(ros::ok()){
        msg.x = 1.03 * msg.x;
        msg.y = 1.01 * msg.y;
        ROS_INFO( "Talker: GPS: x = %f, y = %f", msg.x , msg.y);
        pub.publish(msg);  //发布消息
        loop_rate.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)  //ConstPtr &msg定义于gps.h文件中
{
    std_msgs::Float32 distance;
    distance.data = sqrt(pow(msg ->x, 2), pow(msg -> y, 2));
    ROS_INFO( " Listener: Distance to origin = %f, state = %s" , distanace.data, msg -> state.c_str() );
 }
int main(int argc, char** argv){
    ros::init(argc, argv, " listener");
    ros::NodeHandle n;
    ros::Subscribe sub = n.subscribe( "gps_info", 1, gpsCallback);  // 'gpsCallback'为该回调函数的指针,接受到消息后会通过该函数处理
    ros::spin();  //反复调用当前可触发的回调函数(阻塞) 
    return 0;
}

ヒント:スピンを持つROS :: spinOnce()アクションが、それは非ブロッキングです。

5. CMakeLists.txt

ここに画像を挿入説明
ここに画像を挿入説明

そして、あなたは〜コンパイル(catkin_make)及び(rosrun)実行することができます

service_demo

基本モデルは、テンプレートを参照することができ、同様です。

関数の説明:2ノード、解放要求(カスタムフォーマット)、他のメッセージとリターン情報を受信して​​処理します。

response/reply
request
server
client

ステップ:

  1. パッケージ
  2. MSG
  3. server.cpp
  4. client.cpp
  5. CMakeList.txt&package.xmlの
1.パッケージ
$ cd ~/catkin_ws/src
$ catkin_create_pkg service_demo roscpp rospy std_msgs
2. SRV
$ cd service_demo/
$ mkdir srv
$ vi Greeting.srv
# Greeting.srv
string name
int32 age 
---
string feedback

あなたはSRVの作成を完了すると、コンパイラが生成し~/catkin_ws/devel/include/service_demo/Greeting.h.../GreetingRequest.h.../GreetingResponse.hファイル。書き込みコードは、それに含ま

3. server.cpp
#include <ros/ros.h> 
#include <service_demo/Greeting.h> 

bool handle_function(service::demo::Greeting::Request &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, "greetings_server" );    //解析参数,命名节点
    ros::NodeHandle nh;  //创建句柄, 实例化node
    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, " greetings_server" ); //解析参数,命名节点
    ros::NodeHandle nh;
    ros::ServiceClient client = nh.serviceClient<service_demo::Greeting>( "greetings" ); //“greetings”是发送的服务名
    
    service_demo::Greeting srv;
    srv.request.name = "HAN" ; 
    srv.request.age = "20" ; 
    
    if (client.call(srv)){  //call 的返回值就是上面Handle_function 的返回值。
        ROS_INFO( " Feedback from server : %s." , srv.response.feedback );
    }
    else{
        ROS_ERROR ( "Failed to call service greetings.") ; 
        return 1;
    }
    
    return 0;
    
}
5. CMakeLists.txt&のpackage.xml

そして、あなたは〜コンパイル(catkin_make)及び(rosrun)実行することができます

param_demo

APIの二種類:ROS :: PARAMとROS :: NodeHandle

方法のパラメータを設定します:

  • コードで
#include <ros/ros.h>
int main(int argc, char** argv){
    ros::init(argc,argv, "greetings_server");
    ros::NodeHandle nh;
    int param1, param2, param3, param4, param5;
    //获取参数
    ros::param::get ("param1", param1);
    nh.getParam ("param2", param2);
    nh.param ("param3", param3, 123); //123是默认值
    //设置参数
    ros::param::set( "param4" , param4);
    nh.setParam("param5", param5);
    //检查参数是否存在
    ros::param::has("param5");
    nh.hasParam("param6");
    //删除参数
    ros::param::del("param5");
    nh.deleteParam("param6");
    
    return 0;
    
}
  • 起動ファイルで
    ここに画像を挿入説明

ソースを記入してください。
本論文では、「AndroidのOSは、はじめに」MOOCの中国の大学をまとめた
リンク:リンク
ビデオキャプチャプログラムからの写真

公開された43元の記事 ウォン称賛20 ビュー1472

おすすめ

転載: blog.csdn.net/Chen_2018k/article/details/104340524