RViz學(xué)習(xí)筆記(六) - 交互式marker:Simple_marker.cpp分析

Simple_marker

源碼

/*
 * Copyright (c) 2011, Willow Garage, Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *     * Neither the name of the Willow Garage, Inc. nor the names of its
 *       contributors may be used to endorse or promote products derived from
 *       this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */


// %Tag(fullSource)%
#include <ros/ros.h>

#include <interactive_markers/interactive_marker_server.h>

void processFeedback(
    const visualization_msgs::InteractiveMarkerFeedbackConstPtr &feedback )
{
  ROS_INFO_STREAM( feedback->marker_name << " is now at "
      << feedback->pose.position.x << ", " << feedback->pose.position.y
      << ", " << feedback->pose.position.z );
}

int main(int argc, char** argv)
{
  ros::init(argc, argv, "simple_marker");

  // create an interactive marker server on the topic namespace simple_marker
  interactive_markers::InteractiveMarkerServer server("simple_marker");

  // create an interactive marker for our server
  visualization_msgs::InteractiveMarker int_marker;
  int_marker.header.frame_id = "base_mk";
  int_marker.header.stamp=ros::Time::now();
  int_marker.name = "my_marker";
  int_marker.description = "Simple king Control";

  // create a grey box marker
  visualization_msgs::Marker box_marker;
  box_marker.type = visualization_msgs::Marker::CUBE;
  box_marker.scale.x = 0.45;
  box_marker.scale.y = 0.45;
  box_marker.scale.z = 0.45;
  box_marker.color.r = 1.0;
  box_marker.color.g = 0.0;
  box_marker.color.b = 0.0;
  box_marker.color.a = 1.0;

  // create a non-interactive control which contains the box
  visualization_msgs::InteractiveMarkerControl box_control;
  box_control.always_visible = true;
  box_control.markers.push_back( box_marker );

  // add the control to the interactive marker
  int_marker.controls.push_back( box_control );

  // create a control which will move the box
  // this control does not contain any markers,
  // which will cause RViz to insert two arrows
  visualization_msgs::InteractiveMarkerControl rotate_control;
  rotate_control.name = "move_x";
  rotate_control.interaction_mode =
      visualization_msgs::InteractiveMarkerControl::MOVE_AXIS;

  // add the control to the interactive marker
  int_marker.controls.push_back(rotate_control);

  // add the interactive marker to our collection &
  // tell the server to call processFeedback() when feedback arrives for it
  server.insert(int_marker, &processFeedback);

  // 'commit' changes and send to all clients
  server.applyChanges();

  // start the ROS main loop
  ros::spin();
}
// %Tag(fullSource)%

分析

#include <ros/ros.h>

#include <interactive_markers/interactive_marker_server.h>

首先包含了頭文件延刘,主要是包含了<interactive_markers/interactive_marker_server.h>


void processFeedback(
    const visualization_msgs::InteractiveMarkerFeedbackConstPtr &feedback )
{
  ROS_INFO_STREAM( feedback->marker_name << " is now at "
      << feedback->pose.position.x << ", " << feedback->pose.position.y
      << ", " << feedback->pose.position.z );
}

這個在運行的時候就可以看出,是返回交互信息的。

主函數(shù)里:

ros::init(argc, argv, "simple_marker");

ros初始化魏保。

interactive_markers::InteractiveMarkerServer server("simple_marker");

首先建立一個服務(wù)器,它負責(zé)把所有改動告知rviz.

  visualization_msgs::InteractiveMarker int_marker;
  int_marker.header.frame_id = "base_mk";
  int_marker.header.stamp=ros::Time::now();
  int_marker.name = "my_marker";
  int_marker.description = "Simple king Control";

創(chuàng)建一個交互式marker——int_marker;定義了它的frame_id什么的摸屠。

  visualization_msgs::Marker box_marker;
  box_marker.type = visualization_msgs::Marker::CUBE;
  box_marker.scale.x = 0.45;
  box_marker.scale.y = 0.45;
  box_marker.scale.z = 0.45;
  box_marker.color.r = 1.0;
  box_marker.color.g = 0.0;
  box_marker.color.b = 0.0;
  box_marker.color.a = 1.0;

這個只是個方塊囱淋,用來包含我們的交互式marker,好有個外形餐塘。下面的設(shè)定前面都見過。我現(xiàn)在知道的也不多皂吮,有新的理解再來補充戒傻。

  visualization_msgs::InteractiveMarkerControl box_control;
  box_control.always_visible = true;
  box_control.markers.push_back( box_marker );

這個是非交互式控制,是為了在移動方塊時仍然能顯示方塊蜂筹。最后一句需纳,把這個控制塊添加到了前面建的方塊marker box_marker上。應(yīng)該是把方塊添加到了這個控制上艺挪。

int_marker.controls.push_back( box_control );

又把非交互式控制添加到了交互的marker上不翩。

 visualization_msgs::InteractiveMarkerControl rotate_control;
  rotate_control.name = "move_x";
  rotate_control.interaction_mode =
      visualization_msgs::InteractiveMarkerControl::MOVE_AXIS;

又創(chuàng)建了一個交互,用來移動方塊,最后一句口蝠,是創(chuàng)建兩個箭頭來移動器钟。

int_marker.controls.push_back(rotate_control);

把這個控制也添加給交互式marker。

server.insert(int_marker, &processFeedback);

把int_marker添加到了服務(wù)器的收集器妙蔗,并且讓服務(wù)器在有feedback到來的時候調(diào)用反饋函數(shù)傲霸。

server.applyChanges();

服務(wù)器提交改變并發(fā)送到所有的客戶端。

ros::spin();

開啟ROS主循環(huán)

總結(jié)

整個交互式的marker分為以下幾部分:

  • 交互式部分:就是交互式marker的主體眉反,所有的其他部分都要添加到它上面來昙啄,組成一個交互式主體,它的信息也就是主體信息寸五。
  • Marker部分:這個是顯示的主體梳凛,相當(dāng)于是個外包裝。
  • non-control部分:它是用來承載marker部分的梳杏。
    我原本想把中間一段程序改成這樣:
// create a non-interactive control which contains the box
  //visualization_msgs::InteractiveMarkerControl box_control;
  //box_control.always_visible = true;
  //box_control.markers.push_back( box_marker );

  // add the control to the interactive marker
  //int_marker.controls.push_back( box_control );
  int_marker.markers.push_back( box_marker );

結(jié)果發(fā)現(xiàn)int_marker沒有markers這個屬性韧拒,所以需要一個non-control。

  • 一個control,這個control就是用來控制可交互marker的

最后裁赠,將marker注冊到服務(wù)器的collection摩桶,服務(wù)器會監(jiān)視它的狀態(tài),它有什么改變雇初,都會被通告服務(wù)器調(diào)用processFeedback

然后使服務(wù)器將改變發(fā)送到所有客戶端。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末减响,一起剝皮案震驚了整個濱河市靖诗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌支示,老刑警劉巖刊橘,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異颂鸿,居然都是意外死亡促绵,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門嘴纺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來败晴,“玉大人,你說我怎么就攤上這事栽渴〖饫ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵闲擦,是天一觀的道長慢味。 經(jīng)常有香客問我场梆,道長,這世上最難降的妖魔是什么纯路? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任或油,我火速辦了婚禮,結(jié)果婚禮上感昼,老公的妹妹穿的比我還像新娘装哆。我一直安慰自己,他們只是感情好定嗓,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布蜕琴。 她就那樣靜靜地躺著,像睡著了一般宵溅。 火紅的嫁衣襯著肌膚如雪凌简。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天恃逻,我揣著相機與錄音雏搂,去河邊找鬼。 笑死寇损,一個胖子當(dāng)著我的面吹牛凸郑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播矛市,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼芙沥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了浊吏?” 一聲冷哼從身側(cè)響起而昨,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎找田,沒想到半個月后歌憨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡墩衙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年务嫡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漆改。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡植袍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出籽懦,到底是詐尸還是另有隱情,我是刑警寧澤氛魁,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布暮顺,位于F島的核電站厅篓,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏捶码。R本人自食惡果不足惜羽氮,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惫恼。 院中可真熱鬧档押,春花似錦、人聲如沸祈纯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腕窥。三九已至粒没,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間簇爆,已是汗流浹背癞松。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留入蛆,地道東北人响蓉。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像哨毁,于是被迫代替她去往敵國和親枫甲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理挑庶,服務(wù)發(fā)現(xiàn)言秸,斷路器,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,510評論 25 707
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案迎捺? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J的外補...
    _Yfling閱讀 13,728評論 1 92
  • 巧書的確是很巧举畸,用了很多很巧的方法讓我們直面自己,直面自己一直想掩蓋的凳枝,或者無意掩蓋抄沮,但是卻沒有意識的自我。 今天...
    慧子永遠沒有太晚的開始閱讀 414評論 2 5
  • 文/愛貓的胖妞 從我記事起,就能深刻感到國人的愛好總是扎堆成群的蹋订,隨之產(chǎn)生的熱潮也總是一波一波的率挣。 近期國內(nèi)掀起了...
    愛貓的胖妞閱讀 300評論 0 0