ROS通信(海龜模擬器)

1. 發(fā)布海龜速度指令橄抹,讓海龜圓周運(yùn)動(dòng)

創(chuàng)建一個(gè)Publisher,發(fā)布名為turtle1/cmd_veltopic,其消息類型為geometry_msgs::Twist,通過控制cmd_vellinear下的xangular下的z健无。

geometry_msgs/Vector3 linear
  float64 x
  float64 y
  float64 z
geometry_msgs/Vector3 angular
  float64 x
  float64 y
  float64 z

參考代碼

#include <sstream>
#include "ros/ros.h"
#include "std_msgs/String.h"
#include "geometry_msgs/Twist.h"
int main(int argc, char **argv)
{
    // ROS節(jié)點(diǎn)初始化
    ros::init(argc, argv, "turtle_publisher");

    // 創(chuàng)建節(jié)點(diǎn)句柄
    ros::NodeHandle n;

    // 創(chuàng)建一個(gè)Publisher,發(fā)布名為turtle1/cmd_vel的topic液斜,消息類型為geometry_msgs::Twist累贤,傳輸空間大小1000
    ros::Publisher chatter_pub = n.advertise<geometry_msgs::Twist>("turtle1/cmd_vel", 1000);

    // 設(shè)置循環(huán)的頻率
    ros::Rate loop_rate(10);

    int count = 0;
    while (ros::ok())
    {
        // 初始化geometry_msgs::Twist類型的消息
        geometry_msgs::Twist Twist_msg;

        float linear_x, linear_y, angular_z;
        linear_x = 2;
        linear_y = 0;
        angular_z = 1;
        Twist_msg.linear.x = linear_x;
        Twist_msg.linear.y = linear_y;
        Twist_msg.angular.z = angular_z;

        // 發(fā)布消息
        ROS_INFO("I heard cmd_vel linear.x:[%f] linear.y:[%f] angular.z:[%f]",linear_x, linear_y, angular_z);
        chatter_pub.publish(Twist_msg);

        // 按照循環(huán)頻率延時(shí)
        loop_rate.sleep();
        ++count;
    }

    return 0;
}

2. 定閱海龜?shù)奈恢茫⒃诮K端中周期打印輸出

創(chuàng)建一個(gè)Subscriber少漆,訂閱名為turtle1/posetopic臼膏,其消息類型為turtlesim::Pose,注冊回調(diào)函數(shù)chatterCallback_pose示损,而輸出turtle1/posex渗磅, ytheta就是海龜turtle1的位置检访。

float32 x
float32 y
float32 theta
float32 linear_velocity
float32 angular_velocity

參考代碼:

#include "ros/ros.h"
#include "std_msgs/String.h"
#include "turtlesim/Pose.h"
// 接收到訂閱的消息后夺溢,會(huì)進(jìn)入消息回調(diào)函數(shù)
void chatterCallback_pose(const turtlesim::Pose::ConstPtr& Pose_msg)
{
    // 將接收到的消息打印出來
    float x, y, theta;
    x=Pose_msg->x;
    y=Pose_msg->y;
    theta=Pose_msg->theta;
    ROS_INFO("I heard pose x:[%f] y:[%f] z:[%f]",x, y, theta);
}

int main(int argc, char **argv)
{
    // 初始化ROS節(jié)點(diǎn)
    ros::init(argc, argv, "turtle_subscriber");

    // 創(chuàng)建節(jié)點(diǎn)句柄     
    ros::NodeHandle n;

    // 創(chuàng)建一個(gè)Subscriber,訂閱名為turtle1/pose的topic烛谊,注冊回調(diào)函數(shù)chatterCallback_pose
    ros::Subscriber sub = n.subscribe("turtle1/pose", 1000, chatterCallback_pose);

    // 循環(huán)等待回調(diào)函數(shù)
    ros::spin();

    return 0;
}

3. 創(chuàng)建新海龜?shù)姆?wù)风响,在仿真器中產(chǎn)生一只新海龜

創(chuàng)建一個(gè)clientservice消息類型是turtlesim::Spawn丹禀,向服務(wù)端傳入設(shè)置好的海龜位置和名稱(x y theta name)状勤。

Node: /turtlesim
URI: rosrpc://10.0.2.15:60487
Type: turtlesim/Spawn
Args: x y theta name

參考代碼:

#include "ros/ros.h"
#include "std_srvs/SetBool.h"
#include "turtlesim/Spawn.h"
#include <stdlib.h>             /* srand, rand */
#include <time.h>               /* time */
int main(int argc, char **argv)
{
    // ROS節(jié)點(diǎn)初始化
    ros::init(argc, argv, "turtle_client");
    
    // set argv[1] not null
    if(argv[1] == NULL){
        argv[1] = "";
    }
    ROS_INFO("argv: %s", argv[1]);
    // 創(chuàng)建節(jié)點(diǎn)句柄
    ros::NodeHandle n;

    // 創(chuàng)建一個(gè)client鞋怀,service消息類型是turtlesim::Spawn  turtlesim/Spawn
    ros::service::waitForService("/spawn");
    ros::ServiceClient client = n.serviceClient<turtlesim::Spawn>("/spawn");

    // 創(chuàng)建turtlesim::Spawn類型的service消息
    turtlesim::Spawn srv;
    srand (time(NULL));
    srv.request.x = rand()%10;
    srv.request.y = rand()%10;
    srv.request.theta = rand()%10*0.5;
    srv.request.name = argv[1];

    // 發(fā)布service請求,等待應(yīng)答結(jié)果
    if (client.call(srv))
    {
        ROS_INFO("Response : ok");
    }
    else
    {
        ROS_ERROR("Failed to call service spawn");
        return 1;
    }
    return 0;
}

4. 控制特定海龜?shù)乃俣却笮?/h4>

這里和1中的實(shí)現(xiàn)方式相似持搜,可以在終端輸入控制的參數(shù)argv密似,然后由這些參數(shù)控制海龜狀態(tài)。

ps:有時(shí)候在編譯時(shí)會(huì)出現(xiàn)warning: Clock skew detected. Your build may be incomplete.這樣的警告葫盼。這是時(shí)鐘同步問題残腌,可以

find . -type f | xargs -n 5 touch

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市贫导,隨后出現(xiàn)的幾起案子抛猫,更是在濱河造成了極大的恐慌,老刑警劉巖孩灯,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闺金,死亡現(xiàn)場離奇詭異,居然都是意外死亡峰档,警方通過查閱死者的電腦和手機(jī)败匹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來讥巡,“玉大人掀亩,你說我怎么就攤上這事』肚辏” “怎么了槽棍?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長吱涉。 經(jīng)常有香客問我刹泄,道長,這世上最難降的妖魔是什么怎爵? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任特石,我火速辦了婚禮,結(jié)果婚禮上鳖链,老公的妹妹穿的比我還像新娘姆蘸。我一直安慰自己,他們只是感情好芙委,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布逞敷。 她就那樣靜靜地躺著,像睡著了一般灌侣。 火紅的嫁衣襯著肌膚如雪推捐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天侧啼,我揣著相機(jī)與錄音牛柒,去河邊找鬼堪簿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛皮壁,可吹牛的內(nèi)容都是我干的椭更。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼蛾魄,長吁一口氣:“原來是場噩夢啊……” “哼虑瀑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起滴须,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤舌狗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后描馅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體把夸,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡而线,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年铭污,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膀篮。...
    茶點(diǎn)故事閱讀 40,615評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嘹狞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出誓竿,到底是詐尸還是另有隱情磅网,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布筷屡,位于F島的核電站涧偷,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏毙死。R本人自食惡果不足惜燎潮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扼倘。 院中可真熱鬧确封,春花似錦、人聲如沸再菊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纠拔。三九已至秉剑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間稠诲,已是汗流浹背侦鹏。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工候址, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人种柑。 一個(gè)月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓岗仑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親聚请。 傳聞我的和親對象是個(gè)殘疾皇子荠雕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容