ROS:從入門(mén)到放棄(二) 發(fā)布接收不同類(lèi)型消息1

發(fā)布接收int類(lèi)型消息

第一篇文章我們發(fā)布接收了string類(lèi)型的消息.我們提到在ROS里發(fā)布的消息必須是在ROS中定義了的.就是如果你要發(fā)布一個(gè)string類(lèi)型的消息拢蛋,你不能直接發(fā)布一個(gè)std::string,你得發(fā)布一個(gè)std_msgs::String類(lèi)型的消息.后者在ROS中才有定義.那么發(fā)布其他類(lèi)型的消息我該怎么辦呢弱恒?比如現(xiàn)在如果我想發(fā)布一個(gè)int8類(lèi)型的消息缠导,Int8是8位整型的消息凯楔,范圍從-128到127.可以想象欺栗,代碼在很大程度上應(yīng)該和發(fā)布string類(lèi)型的代碼相似.咱們先直接貼上代碼,然后來(lái)找不同.首先打開(kāi)一個(gè)terminal.輸入下面內(nèi)容

cd ~/catkin_ws/src/pub_sub_test/src
touch pub_int8.cpp
touch sub_int8.cpp

咱們創(chuàng)建了用來(lái)發(fā)布8位整型message的發(fā)布程序和接收程序.接著寒瓦,打開(kāi)pub_int8.cpp,把下面的代碼粘貼進(jìn)去坪仇,保存再退出.

#include "ros/ros.h"
#include "std_msgs/Int8.h" //#include "std_msgs/String.h"

#include <sstream>

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

  ros::NodeHandle n;

  ros::Publisher chatter_pub = n.advertise<std_msgs::Int8>("chatter", 1000); //ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);

  ros::Rate loop_rate(10);

  int count = 0;
  while (ros::ok())
  {
    std_msgs::Int8 msg; //std_msgs::String msg;

    // std::stringstream ss;
    // ss << "hello world " << count;
    msg.data = count;// msg.data = ss.str();


    ROS_INFO("%d", msg.data); //ROS_INFO("%f", msg.data.c_str())

    chatter_pub.publish(msg);

    ros::spinOnce();

    loop_rate.sleep();
    ++count;
  }


  return 0;
}

接著杂腰,把下面的接收程序粘貼到sub_int8.cpp里,保存并退出

#include "ros/ros.h"
#include "std_msgs/Int8.h" //#include "std_msgs/String.h"

void chatterCallback(const std_msgs::Int8::ConstPtr& msg) //void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
  ROS_INFO("I heard: [%d]", msg->data); //ROS_INFO("I heard: [%f]", msg->data.c_str());
}

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

  ros::NodeHandle n;

  ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);

  ros::spin();

  return 0;
}

程序?qū)懞煤笠挝模蜕弦徽乱粯游购埽阈枰砑拥紺MakeLists里編譯,在terminal中輸入下面的內(nèi)容

cd ~/catkin_ws/src/pub_sub_test
gedit CMakeLists.txt

有些同學(xué)可能喜歡直接從文件夾一步步進(jìn)入到pub_sub_test文件夾去打開(kāi)文件皆刺,有的可能喜歡用其他編譯器打開(kāi)文件少辣,這個(gè)都不重要了,總之打開(kāi)pub_sub_test這個(gè)文件夾里的CMakeLists.txt文件就行了.
在上一章里為了編譯發(fā)布和接收string消息的程序你在CMakeLists.txt里添加了下面的內(nèi)容

add_executable(pub_string src/pub_string.cpp)
target_link_libraries(pub_string ${catkin_LIBRARIES})
add_executable(sub_string src/sub_string.cpp)
target_link_libraries(sub_string ${catkin_LIBRARIES})

現(xiàn)在羡蛾,為了編譯發(fā)布和接收int8的消息毒坛,根據(jù)你寫(xiě)好的程序,你在他們下面添加(添加哈林说,不是替換煎殷,不然就不能編譯之前的pub和sub string的程序了)下面的內(nèi)容

add_executable(pub_int8 src/pub_int8.cpp)
target_link_libraries(pub_int8 ${catkin_LIBRARIES})
add_executable(sub_int8 src/sub_int8.cpp)
target_link_libraries(sub_int8 ${catkin_LIBRARIES})

這幾行找不同的任務(wù)就由你自己來(lái)完成了哈.寫(xiě)完之后保存并退出.接著在terminal中輸入下面的內(nèi)容

cd ~/catkin_ws
catkin_make

你就編譯完成啦.完美.接下來(lái)咱們跑一下程序看看有沒(méi)有問(wèn)題.
打開(kāi)三個(gè)terminal.
第一個(gè)terminal中輸入

roscore

在第二個(gè)terminal中輸入下面內(nèi)容

cd ~/catkin_ws/
source devel/setup.bash
rosrun pub_sub_test sub_int8

在第三個(gè)terminal中輸入下面內(nèi)容

cd ~/catkin_ws/
source devel/setup.bash
rosrun pub_sub_test pub_int8

如果你在第二個(gè)和第三個(gè)terminal中看到很類(lèi)似于上個(gè)文章跑的程序的結(jié)果,就證明程序已經(jīng)跑成功了.那么下面我們就來(lái)看看發(fā)布接收int8類(lèi)型消息的程序和string有哪些不同.

代碼對(duì)比

在上面的代碼中腿箩,我把所有不同的地方都注釋了豪直,注釋符號(hào)//后面的內(nèi)容是原發(fā)布String類(lèi)型的變量的代碼.簡(jiǎn)單來(lái)說(shuō),就是把涉及到消息類(lèi)型的地方全部從String改到Int8了.下面我們一行行看不同的地方.
首先是發(fā)布器程序
1: #include "std_msgs/Int8.h"代替了#include "std_msgs/String.h".這表明了珠移,每一種不同的消息都有自己的頭文件弓乙,如果我們要使用不同的消息,就首先要包含它所在的頭文件.像Int8, String這類(lèi)都屬于C++的標(biāo)準(zhǔn)數(shù)據(jù)類(lèi)型钧惧,所以這些消息在ROS中也被劃分到了std_msgs這個(gè)名字下.消息當(dāng)然還有其他大類(lèi)暇韧,比如我們以后要使用類(lèi)似于pose的消息,它包含在geometry_msgs這個(gè)大類(lèi)里.需要包含的頭文件是 #include "geometry_msgs/Pose.h".
2:ros::Publisher chatter_pub = n.advertise<std_msgs::Int8>("chatter", 1000); 中浓瞪,std_msgs::Int8代替了std_msgs::String懈玻,定義publisher的時(shí)候,它需要發(fā)布什么消息是需要指定明確的乾颁,之前是ros中的string那么現(xiàn)在就自然換成ros中的int8了
3:std_msgs::Int8 msg 替換了 std_msgs::String msg. 同樣你要發(fā)布的消息的類(lèi)型替換掉.
4: 發(fā)布string類(lèi)型的消息的代碼中連續(xù)的三行

    std::stringstream ss;
    ss << "hello world " << count;
    msg.data = ss.str();

直接被替換成了msg.data = count.我們知道原來(lái)的三行中涂乌,被注釋的前兩行是用來(lái)形成一個(gè)字符串的.原來(lái)的msg是std_msgs::String, msg.data就是string類(lèi)型,現(xiàn)在msg是std::msgs_Int8英岭,那么大概可以猜到msg.data如今就是int8類(lèi)型了湾盒,考慮到我們的count本來(lái)就是一個(gè)int型變量,所以這兒直接把count賦值給msg.data了.注意這兒的類(lèi)型變換是int到int8诅妹,問(wèn)題不大罚勾,只是整型的范圍縮小到-128到127了而已.
5: ROS_INFO中msg.data本來(lái)就是int8型的變量,可以直接print出來(lái),對(duì)應(yīng)需要在ROSINFO中表明數(shù)據(jù)類(lèi)型是%d(字符串類(lèi)型是%f).
其他的都一樣了.然后是接收程序.

  1. #include "std_msgs/Int8.h"代替了#include "std_msgs/String.h" 不在贅述.
  2. chatterCallback函數(shù)的參數(shù)由std_msgs::String::ConstPtr& msg變成了std_msgs::Int8::ConstPtr& msg
  3. ROS_INFO中尖殃,之前msg->data是stiring類(lèi)型現(xiàn)在是int8類(lèi)型丈莺,可以直接print出來(lái).
    主函數(shù)中沒(méi)有設(shè)計(jì)到變量定義的地方,所以不需要更改.
    總結(jié)一下就是把涉及到表明數(shù)據(jù)類(lèi)型的地方全部換成std_msgs::Int8就可(注意大小寫(xiě)).

使用ROS wiki了解你需要的數(shù)據(jù)類(lèi)型怎么使用

可能經(jīng)過(guò)前面兩個(gè)例子你會(huì)想分衫,我知道了兩種類(lèi)型變量怎么發(fā)布场刑,可以以后會(huì)遇到N多不同的類(lèi)型般此,我該在哪兒找我想要發(fā)布的數(shù)據(jù)類(lèi)型蚪战,包含什么成員之類(lèi)的呢?這就需要ROS wiki的幫助了.
如果現(xiàn)在我問(wèn)你铐懊,我想發(fā)布一個(gè)double類(lèi)型的消息邀桑,你該怎么做?可能有了前兩個(gè)例子科乎,你會(huì)考慮比如說(shuō)把#include "std_msgs/String.h"換成#include "std_mags/Double.h".你可以把之前任一pub...cpp文件中添加#include "std_mags/Double.h"的程序壁畸,然后編譯,系統(tǒng)會(huì)告訴你找不到這個(gè)東西.那該咋辦茅茂?怎么發(fā)布捏萍?首先想到百度一下(當(dāng)然能翻墻最好是google一下).首先你得想到我們之前說(shuō)了,c++自身包含的一些標(biāo)準(zhǔn)數(shù)據(jù)類(lèi)型比如vector, double, int等空闲,在ros中都被存在std_msgs中令杈,所以你直接搜索`ROS std_msgs`之類(lèi)的就可以了.之后你會(huì)看到第一個(gè)出現(xiàn)的網(wǎng)站應(yīng)該是下面這個(gè).
http://wiki.ros.org/std_msgs/
點(diǎn)進(jìn)去你會(huì)發(fā)現(xiàn)里面有std_msgs所包含的所有信息種類(lèi).在ROS Message Types下面.然后翻來(lái)覆去找一找有沒(méi)有帶有double字樣的,發(fā)現(xiàn)沒(méi)有hhhhhhh.怎么會(huì)沒(méi)有呢.其實(shí)double也是浮點(diǎn)類(lèi)型的數(shù)據(jù)只是精度更高碴倾,所以你看精度最高的Float64就是啦.(我怎么知道逗噩??至少你會(huì)從Float相關(guān)的下手吧...).話(huà)又說(shuō)回來(lái)跌榔,為什么ROS不直接取名叫Double呢异雁?要知道ROS也有很多人用python寫(xiě)的,python里可沒(méi)有double這種東西僧须,其實(shí)你進(jìn)入ros wiki下面的這個(gè)網(wǎng)站
http://wiki.ros.org/msg
找到build_in types你會(huì)發(fā)現(xiàn)ros中的數(shù)據(jù)類(lèi)型在c++和pyton中分別對(duì)應(yīng)什么類(lèi)型.float64那兒就寫(xiě)了對(duì)應(yīng)C++的double類(lèi)型變量.
好了回到網(wǎng)頁(yè)http://wiki.ros.org/std_msgs/ ,你找到了所需要的數(shù)據(jù)類(lèi)型是Float64怎么使用呢纲刀?聰明的同學(xué)有這個(gè)消息其實(shí)就夠了.你會(huì)猜到把第一個(gè)程序中的如#include "std_msgs/String.h"換成#include "std_msgs/Float64.h,其他的也像我們發(fā)布Int8類(lèi)型的消息那樣照著換就可以了.那么恭喜你答對(duì)了担平,就是這樣.那么我不夠聰明呢柑蛇??驱闷?博主就屬于這類(lèi)人hhhhh耻台,這時(shí)候我們發(fā)現(xiàn)網(wǎng)頁(yè)中Float64是可以點(diǎn)進(jìn)去的誒,點(diǎn)進(jìn)去看看.進(jìn)入網(wǎng)頁(yè)http://docs.ros.org/api/std_msgs/html/msg/Float64.html 發(fā)現(xiàn)下圖中的內(nèi)容.

float64Def.png

圖片中File這一行就表示出你如果要使用該信息時(shí)所需要包含的頭文件了空另,把msg換成h就可以了(python 用戶(hù)根據(jù)的使用方式就是 from std_msgs.msg import Float64 這個(gè)后面再說(shuō)).然后下面的Raw Message Definition和Compact message Definition.兩者功能其實(shí)差不多盆耽,前者有時(shí)候會(huì)對(duì)該類(lèi)型的消息所包含的內(nèi)容加以解釋?zhuān)ㄟ@兒沒(méi)有= =),后者會(huì)顯示你的數(shù)據(jù)的具體類(lèi)型.這兒都是一樣的,也沒(méi)什么解釋?zhuān)驗(yàn)镽OS里這是最簡(jiǎn)單的數(shù)據(jù)類(lèi)型的摄杂,它覺(jué)得不需要注釋= = .
float64就是表示這個(gè)message的數(shù)據(jù)類(lèi)型了.data表示成員變量.之前的代碼我們?cè)趺词褂?code>std_msgs::Int8 msg的坝咐?我們?cè)诔绦蛑羞@么寫(xiě)的msg.data = count.一切都是根據(jù)這個(gè)頁(yè)面來(lái)的.我們通過(guò)std_msgs::Float64 msg定義了類(lèi)Float64的對(duì)象msg,通過(guò)查看這個(gè)頁(yè)面得知類(lèi)中包含數(shù)據(jù)成員data析恢,數(shù)據(jù)類(lèi)型是float64(即c++中的double)墨坚,所以我們可以給msg.data賦值double類(lèi)型的變量.這么一看好簡(jiǎn)單,我不看這個(gè)頁(yè)面根據(jù)前面的代碼也能猜到嘛.那么現(xiàn)在我問(wèn)你映挂,如果我想發(fā)布的數(shù)據(jù)類(lèi)型為一數(shù)組(array)呢泽篮?很明顯數(shù)組也是屬于std_msgs所以我們又回到關(guān)于std_msgs信息的ROS wiki http://wiki.ros.org/std_msgs 上來(lái). 發(fā)現(xiàn)有很多涉及到Arrary的消息類(lèi)型.比如Float64MultiArray,一維數(shù)組是多維數(shù)組的特殊形式柑船,所以既然沒(méi)有類(lèi)似Float64Array這個(gè)選項(xiàng)帽撑,那么Float64MultiArray就應(yīng)該可以用來(lái)發(fā)布double類(lèi)型的一維到多維的數(shù)組了.怎么使用呢?同樣根據(jù)之前的經(jīng)驗(yàn)鞍时,先做個(gè)大膽猜測(cè)亏拉,我首先需要#include "std_msgs/Float64MultiArrary.h",然后如果我用std_msgs::Float64MultiArray msg定義了一個(gè)double類(lèi)型的多維數(shù)組的對(duì)象逆巍,我再有一個(gè)double類(lèi)型的數(shù)組arrayTest及塘,應(yīng)該可以通過(guò)msg.data = arraryTest把C++的數(shù)組賦值給ROS的數(shù)組.代碼類(lèi)似于下面這樣

#include "ros/ros.h"
#include "std_msgs/Float64MultiArray.h" //#include "std_msgs/String.h"

#include <sstream>

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

  ros::NodeHandle n;

  ros::Publisher chatter_pub = n.advertise<std_msgs::Float64MultiArray>("chatter", 1000); //ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);

  ros::Rate loop_rate(10);

  //int count = 0;

  double testArray[5] = {1,2,3,4,5}; //create an array to publish

  while (ros::ok())
  {
    std_msgs::Float64MultiArray msg; //std_msgs::String msg;

    // std::stringstream ss;
    // ss << "hello world " << count;
    msg.data = testArray;// msg.data = ss.str();


    ROS_INFO("I have published array data"); //ROS_INFO("%f", msg.data.c_str())

    chatter_pub.publish(msg);

    ros::spinOnce();

    loop_rate.sleep();
   // ++count;
  }

這個(gè)代碼呢,看起來(lái)就是一直發(fā)布一個(gè)內(nèi)容相同{1,2,3,4,5}的數(shù)組.打開(kāi)一個(gè)terminal锐极,輸入下面內(nèi)容

cd ~/catkin_ws/src/pub_sub_test/src
touch pub_array_test.cpp

創(chuàng)建了一個(gè)pub_arrary_test.cpp并把代碼復(fù)制進(jìn)去.保存并退出.同樣寫(xiě)完代碼后我們需要在CMakeLists.txt里添加編譯它的內(nèi)容.在terminal中輸入下面內(nèi)容打開(kāi)pub_sub_test package的CMakeLists.txt.

cd ~/catkin_ws/src/pub_sub_test
gedit CMakeLists.txt

在CMakeLists.txt中你之前添加編譯文件的下方添加

add_executable(pub_array_test src/pub_array_test.cpp)
target_link_libraries(pub_array_test ${catkin_LIBRARIES})

保存并退出笙僚,在terminal中輸入

cd ~/catkin_ws
catkin_make

進(jìn)行編譯.這已經(jīng)是第三次寫(xiě)從寫(xiě)文件到改CMakeLists到編譯的步驟了哦,希望大家牢記于心.雖然用多了也就記住了.編譯結(jié)果呢溪烤?味咳?出錯(cuò)了!C枢帧槽驶! error大概是下面的樣子.

error1.png

這個(gè)錯(cuò)誤表明,我的那個(gè)數(shù)組鸳兽,并不能直接賦值給msg.data掂铐,也就是說(shuō)msg.data并不是一個(gè)double類(lèi)型的數(shù)組,那么它skr啥揍异?其實(shí)上面error的內(nèi)容已經(jīng)指出來(lái)了全陨,aka std::vector<double>,這是一個(gè)double的vector!! 雖然C++里vector就是用來(lái)操作數(shù)組的衷掷,但是你這個(gè)消息的名字直接叫...Array辱姨,鬼會(huì)想到直接用vector啊.好吧好吧戚嗅,可能因?yàn)閜ython里沒(méi)有vector而是tuple, list什么的.但這樣真的讓人困惑.那我們?nèi)タ纯碦OS wiki里有沒(méi)有指出這是個(gè)vector呢雨涛?回到網(wǎng)站
http://wiki.ros.org/std_msgs
點(diǎn)擊 Float64MultiArray鏈接枢舶,發(fā)現(xiàn)下圖內(nèi)容.
float64MultiDef.png

data旁邊寫(xiě)的是float64[],這他喵的看起來(lái)不就像數(shù)組嗎替久?
說(shuō)實(shí)話(huà)凉泄,我之前打開(kāi)ROS wiki查看數(shù)據(jù)類(lèi)型時(shí),是崩潰的.我既不知道如float64[]是什么數(shù)據(jù)類(lèi)型蚯根,也不知道右邊是data是成員函數(shù)后众,那個(gè)什么MultiArrayLayout是什么鬼我就更不知道了.要怎么用就更更是不知道了.這都什么輔助資料啊,當(dāng)時(shí)的表情是這樣的
mengBi.jpg

那么其實(shí)float64[] skr啥在另一個(gè)網(wǎng)站說(shuō)了的.
http://wiki.ros.org/msg
也就是我們之前找到float64是什么的網(wǎng)站颅拦,找到Array handling部分蒂誉,我們可以看到左邊ROS的arrary type對(duì)應(yīng)的C++數(shù)據(jù)類(lèi)型就是std::vector.暫且先不管MultiArrayLayout的事兒.我們創(chuàng)建一個(gè)新的文件,把上面pub_string_test.cpp的代碼復(fù)制進(jìn)去.打開(kāi)一個(gè)terminal

cd ~catkin_ws/src/pub_sub_test/src
touch pub_string.cpp

復(fù)制進(jìn)去之后矩距,有一處改動(dòng)拗盒,即double testArray[5] = {1,2,3,4,5}改成std::vector<double> testArray = {1,2,3,4,5}. 另外既然要使用vector怖竭,那么一般要添加其頭文件锥债,添加頭文件#include <vector>,但是"std_msgs/Float64MultiArray.h"痊臭,已經(jīng)包含了<vector>哮肚,就不用再重復(fù)包含了.打開(kāi)CMakeLists,刪除掉前面添加的編譯pub_sub_test.cpp那兩行文字广匙,不然編譯肯定要出錯(cuò)啦允趟,添加編譯pub_sub.cpp文件的內(nèi)容.(這兒不再說(shuō)怎么做了,咱們之前已經(jīng)做了三次了鸦致,一模一樣的).但是這兒要多做一件事潮剪,std::vector<double> testArray = {1,2,3,4,5}這種給向量的賦值方式是C++11之后才有的,所以要添加C++11編譯.ROS的CMakeLists.txt的最上面幾行有一行是#add_compile_options(-std=c++11)分唾,把注釋符號(hào)#去掉就可以了.保存退出.
那么下面是接收器的文件抗碰,在同樣的位置創(chuàng)建一個(gè)叫sub_array.cpp的文件,內(nèi)容大同小異.

#include "ros/ros.h"
#include "std_msgs/Float64MultiArray.h" //#include "std_msgs/String.h"

void chatterCallback(const std_msgs::Float64MultiArray::ConstPtr& msg) //void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
  ROS_INFO("I heard: [%f], [%f]", msg->data[0], msg->data[1]); //ROS_INFO("I heard: [%f]", msg->data.c_str());
}

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

  ros::NodeHandle n;

  ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);

  ros::spin();

  return 0;
}

添加好內(nèi)容后保存退出绽乔,回到catkin_ws目錄下使用catkin_make編譯.怎么跑這接收器和發(fā)布器和string, in8一樣弧蝇,不再贅述.那么話(huà)又說(shuō)回來(lái),那個(gè)MultiArrayLayout到底是什么折砸?其實(shí)用過(guò)vector的同學(xué)應(yīng)該知道看疗,std::vector<double>就是一個(gè)一維的向量,不是二維三維的.二維向量應(yīng)該是這么定義的std::vector<std::vector<double> >睦授,既然float64[]的定義就是std::vector<double>两芳,那么我們就不能用它來(lái)儲(chǔ)存二維向量.那么這個(gè)消息的名字想象就挺奇特的,Float64MultiArray去枷,我本以為可以直接通過(guò)msg.data接收高維的向量怖辆,結(jié)果這是不可能的....MultiArrary并不能直接作為多維數(shù)組的數(shù)據(jù)祷肯,數(shù)據(jù)只能是一維的.哈哈此處又想用表情包了.你這個(gè)MultiArray第一不是理想中的那個(gè)array,第二它還不multi不能直接發(fā)布多維vector.你如果想通過(guò)MultiArray發(fā)布多維的數(shù)據(jù)疗隶,你首先得把他們整合到一維的向量中佑笋,那么可以想象你需要在MultiArrayLayout中儲(chǔ)存你多維數(shù)據(jù)的結(jié)構(gòu)信息,這樣你可以通過(guò)layout中的內(nèi)容斑鼻,在接收到數(shù)據(jù)后把數(shù)據(jù)恢復(fù)出來(lái).哈哈是有點(diǎn)雞肋.不行了蒋纬,還是得吐槽一下.送MultiArray一個(gè)表情包.

skrWhat.jpeg

畢竟ROS不是專(zhuān)門(mén)用來(lái)發(fā)布數(shù)組什么的,這個(gè)做地沒(méi)那么理想可以理解.同志們是不是想放棄ROS了哈哈.不要著急.它的強(qiáng)項(xiàng)message是關(guān)于Robotics的比如位置姿態(tài)什么的坚弱,那些消息還是整合地很好的.怎么通過(guò)MultiArray間接地發(fā)布多維數(shù)組我們以后有機(jī)會(huì)用一個(gè)小節(jié)講.
總之到目前為止蜀备,一些比較常見(jiàn)的信息,string, int/double, array/vector你應(yīng)該知道該怎么發(fā)布接收了.通過(guò)ros wiki std_msgs中的內(nèi)容查看你發(fā)布的標(biāo)準(zhǔn)信息包含什么數(shù)據(jù)成員荒叶,數(shù)據(jù)是什么類(lèi)型.結(jié)合http://wiki.ros.org/msg 中的內(nèi)容了解他們?cè)贑++或者python中代表什么數(shù)據(jù)類(lèi)型.
http://docs.ros.org/api/std_msgs/html/msg/Float64MultiArray.html Float64MultiArray的定義中std_msgs/MultiArrayLayout 并不是你理想中的整型或者浮點(diǎn)型或者字符串類(lèi)型的信息碾阁,但是那個(gè)地下藍(lán)色字體的鏈接你一直點(diǎn)下去直到?jīng)]有鏈接為止谤祖,你會(huì)發(fā)現(xiàn)所有的這些不明所以的消息都是由那些基本消息構(gòu)成的.
下一講我們講怎么發(fā)布接收一個(gè)機(jī)器人的位置氯哮,方向.到時(shí)候你會(huì)對(duì)如何使用ROS wiki這個(gè)資料有更清晰的認(rèn)識(shí).

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市扫腺,隨后出現(xiàn)的幾起案子愁茁,更是在濱河造成了極大的恐慌蚕钦,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鹅很,死亡現(xiàn)場(chǎng)離奇詭異嘶居,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)促煮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)邮屁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人菠齿,你說(shuō)我怎么就攤上這事佑吝。” “怎么了泞当?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵迹蛤,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我襟士,道長(zhǎng)盗飒,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任陋桂,我火速辦了婚禮逆趣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嗜历。我一直安慰自己宣渗,他們只是感情好抖所,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著痕囱,像睡著了一般田轧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鞍恢,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天傻粘,我揣著相機(jī)與錄音,去河邊找鬼帮掉。 笑死弦悉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蟆炊。 我是一名探鬼主播稽莉,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼涩搓!你這毒婦竟也來(lái)了污秆?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤缩膝,失蹤者是張志新(化名)和其女友劉穎混狠,沒(méi)想到半個(gè)月后岸霹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體疾层,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年贡避,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了痛黎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡刮吧,死狀恐怖湖饱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情杀捻,我是刑警寧澤井厌,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站致讥,受9級(jí)特大地震影響仅仆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜垢袱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一墓拜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧请契,春花似錦咳榜、人聲如沸夏醉。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)畔柔。三九已至,卻和暖如春臣樱,著一層夾襖步出監(jiān)牢的瞬間释树,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工擎淤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奢啥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓嘴拢,卻偏偏與公主長(zhǎng)得像桩盲,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子席吴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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