3.在ROS上讀取5DT感測手套的資訊
假如你已經會了ROS和之前的內建程式,甚至還會改造內建程式,使它實現你想使用的功能的話,這次的內容對你來說相當的簡單優~
3-1.借鏡ROS教程
不知道大家還記不記得在ROS學習紀錄-4:node&topic最後提到的一個關於publisher & subscriber簡單小程式,我們可以將之前內建程式與教程中的talker&listener做一個結合,先利用talker讀出手套的數值,在自訂一種msg格式發佈到topic,之後再修改listener接受msg,大致的概念就是這樣,所以之前的內容極為重要,如果沒學到這部份的人要趕快回去看看喔。
3-2.改造talker
首先你需要有一個完整的talker.cpp[1]和polling.cpp。
ros::init(argc, argv, "talker");
ros::NodeHandle n;
ros::Publisher chatter_pub = n.advertise("chattercpp", 1000);
大概解釋一下,talker是node的名字,第二行則是讓這個node有個小名n,第三行中chatter_pub是一個ROS的變數,發佈的時候會用到,std_msgs::String是msg的類型,chattercpp是topic名字,1000則是buffer的大小,這部份請依個人寫法修改,名字想叫啥都可,我的node叫dataglove_publisher,topic叫dataglove,自己記得就好。注意:msg需要自訂喔,以下是我的格式以及msg放的位置。
我的格式是兩隻手共10之手指頭處理過的數值都傳上去topic,若想要引入自訂msg格式,需要在程式碼最前面先引入喔。
至於buffer的大小我也還不太會,不過像我們這次用的手套只需要反應最即時的位置就好,buffer不需要很大,我用的是1。
接著,觀察talker.cpp的while(ros::ok){},我們可以看到幾行比較需要我們關切的代碼
std_msgs::String msg;
msg.data = ss.str();
ROS_INFO("%s",msg1.data.c_str() );//跟printf功能很像的ROS函數
chatter_pub.publish(msg);
std_msgs::String是表示msg的msg格式,假設我們要使用的自訂格式的pakage叫dataglovetest,檔案名稱為dataglove_data,這裡就改成dataglovetest::dataglove_data msg;//以此類推
msg.data = ss.str();代表我們將msg.data變為某內容(ss.str()),其中data是在該msg格式中的其中一個名稱,還記得剛剛我定的格式嗎?以左手食指(LP)為例,我們把代碼改成這樣msg.LP = 左手食指的資料//以此類推
chatter_pub.publish(msg);可以說是發佈的動作,將msg中的內容以std_msgs::String的msg格式發送到chattercpp的topic中,稍微修改一下我們的程式碼dataglove_pub.publish(msg)//舉例
到目前為止我們已經大概改好ROS的部份了,接著就將polling中的東西移植進來吧~
3-3.移植手套程式至ROS中
fdGetSensorScaledAll(pGloveA, gloveA_scaled);
其中pGloveA是裝置在電腦上的port名稱,gloveA_scaled則是18個元素的向量,fdGetSensorScaledAll能將在pGloveA讀到的數值(此數值處理過了,數值為0~1)放到gloveA_scaled,也就是說之後只要讀gloveA_scaled中的數值就知道手套的數值了,相信各位都知道如何移植了,如下
3-4.編譯的問題
在進行ROS編譯時,可能會遇到幾個問題,我遇到的最大問題是include方面的問題
這是我在cpp中引用的東西,除了在cpp引用外,各位記得也要在package.xml中修改引用的代碼喔!其中#include "dataglovetest/dataglove_data.h"正是我自訂的msg格式,而
如圖上的方式修改,需要將libfglove.so放置於如圖所示之路徑下,才找的到(當然不一定只有這種方式拉)
正常的話,現在就可以正確編譯了,由於這段我不太會(程式沒學的很好QQ),花了近兩星期還是弄不出來,最後是問別人才搞定的,電腦大師!感恩的心~
dataglove_publisher.cpp中的引用 |
#include "fglove.h"
這是最大的問題,因為在編譯時,ROS會找不到它,和前一篇未定義參考到的問題一樣,但是由於我們這次是用ROS來編譯,所以解決的辦法不大相同,我們需要修改CMakeLists.txt中的內容CMakeLists.txt位置以及原始文本 |
libfglove.so放置位置與修改好的CMakeLists.txt文本 |
target_link_libraries(dataglove_publisher ${catkin_LIBRARIES}) =>
target_link_libraries(dataglove_publisher ${catkin_LIBRARIES} ${CMAKE_SOURCE_DIR}/dataglovetest/lib/libfglove.so)
add_dependencies(dataglove_publisher) =>
add_dependencies(dataglove_publisher ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
正常的話,現在就可以正確編譯了,由於這段我不太會(程式沒學的很好QQ),花了近兩星期還是弄不出來,最後是問別人才搞定的,電腦大師!感恩的心~
3-5.接收端
要是您已經可以編譯完成了,現在開始會很簡單的~首先你需要一個listener.cpp,這在ROS教程[1]中找的到,附圖是已經修改完成的程式[2]
最主要的部份為
以listener.cpp為基礎修改而成的dataglove_recipient.cpp |
最主要的部份為
void datagloveCallback(const dataglovetest::dataglove_data::ConstPtr& msg)
msg->LP 或是 msg.LP
第一行就比照之前命名的名稱來改,包括msg格式喔。而第二行是說明如何將收到的資料抓出來,其它部份就請試著看看哪裡需要改吧,基本上只要跟你現在要做的東西名字不同的就都改,由於有點分散我就不一一列出來了,改完後,試著編譯,如果有問題都可以問我,說不定我可能也曾經遇過你遇到的問題,但是我並沒有把他放上來,不過也有可能我也不會解哈哈,共勉之~
3-6.NEXT,與手手的第一次連接
如果各位以上的東西都做完了,並且可以在ROS上讀取到正確的數值了,我們就可以來與機械手手連結了喔~好期待下篇喔哈哈,我們下回見吧~
如有問題可以留言大家一起討論,留言請勿出現不雅言語與無端謾罵喔~
If u have any question,just leave comments to me.I will answer u as soon as possible,but don't be mean to me.Thanks!
沒有留言:
張貼留言