發(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
).
其他的都一樣了.然后是接收程序.
-
#include "std_msgs/Int8.h"
代替了#include "std_msgs/String.h"
不在贅述. -
chatterCallback
函數(shù)的參數(shù)由std_msgs::String::ConstPtr& msg
變成了std_msgs::Int8::ConstPtr& msg
-
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)容.
圖片中
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大概是下面的樣子.
這個(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)容.
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í)的表情是這樣的那么其實(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è)表情包.
畢竟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í).