1. ros::spin()和ros::spinOnce()使用及區(qū)別
這兩個函數(shù)是ROS消息回調處理函數(shù)。通常會出現(xiàn)在ROS的主循環(huán)中,程序需要調用ros::spin() 或 ros::spinOnce()來處理回調callback函數(shù)渣触,兩者區(qū)別在于前者調用后不會再返回,也就是你的主程序到這兒就不往下執(zhí)行了,而后者在調用后還可以繼續(xù)執(zhí)行之后的程序。換句話說导狡,ros::spin()是循環(huán)且監(jiān)聽回調函數(shù)(callback)。循環(huán)就是指程序運行到這里偎痛,就會一直在這里循環(huán)了旱捧。監(jiān)聽回調函數(shù)的意思是,如果這個節(jié)點有callback函數(shù)踩麦,那寫一句ros::spin()在這里枚赡,就可以在有對應消息到來的時候,運行callback函數(shù)里面的內容谓谦,其適用于訂閱subscribe節(jié)點贫橙,且訂閱速度沒有限制的情況。ros::spinOnce()是監(jiān)聽回調函數(shù)(callback)反粥。只能監(jiān)聽卢肃,不能循環(huán)。所以當你需要監(jiān)聽一下的時候星压,就調用一下這個函數(shù)践剂。
實際上,如果你的程序寫了相關的消息訂閱subscribe函數(shù)娜膘,那么程序在執(zhí)行過程中,除了主程序以外优质,ROS還會自動在后臺按照你規(guī)定的格式竣贪,接受訂閱的消息,但是所接到的消息并不是立刻就被處理巩螃,而是必須要等到ros::spin()或ros::spinOnce()執(zhí)行的時候才被回調函數(shù)callback處理演怎。
對于有些傳輸特別快的消息,尤其需要注意合理控制消息池大小和ros::spinOnce()執(zhí)行頻率; 比如消息送達頻率為10Hz, ros::spinOnce()的調用頻率為5Hz避乏,那么消息池的大小就一定要大于2爷耀,才能保證數(shù)據(jù)不丟失,無延遲拍皮。例如以下語句消息池大小為1000:
ros::Subscriber sub = n.subscribe("hello", 1000, chatterCallback);
最后強調一下歹叮,這兩個函數(shù)只和接收回調函數(shù)(callback)有關跑杭,和發(fā)布publish并沒有關系。如果想循環(huán)發(fā)布咆耿,只能循環(huán)寫publish()德谅。
2. ROS下多線程Thread的使用
LCM::handle()功能類似于ROS里的ros::spin(),用來調用lcm.subscribe()函數(shù)萨螺,但不同的是運行此命令時窄做,程序會在這里等待直到有訂閱消息傳來完成相關操作后此命令才能結束。程序才能往下運行慰技。在本文中椭盏,作者需要在同一個節(jié)點同時接收來自ROS topic的信息和lcm的信息,并且要實現(xiàn)即使沒有l(wèi)cm信息吻商,程序也能繼續(xù)運行掏颊。所以采用thread多線程方法。
C++已經提供了thread庫可以直接使用手报,實例如下:
#include <thread>
// function of thread?t_lcm
void lcmReceiver()
{
? lcm::LCM lcm;
? if(!lcm.good())
? ? ? ROS_INFO("lcm failed");
? Handler handlerObject;
? lcm.subscribe(“channel”, &Handler::handleMessage, &handlerObject);
? while (ros::ok()){
? ? ROS_INFO("tread t_lcm");
? ? lcm.handle();
? }
}
// ROS 節(jié)點的main函數(shù)
int main(int argc, char **argv)
{
? ros::init(argc, argv, “node_name”);
? ros::NodeHandle n;
? ros::Subscriber sub1 = n.subscribe(“topic”, 1000, chatterCallback);?
? std::thread t_lcm(lcmReceiver);
? while (ros::ok()){
? ? ros::spinOnce();
? }
? return 0;
}
以此實現(xiàn)lcm的信息和ros的topic同時并行接收蚯舱。
3. ROS下使用opencv
首先確定電腦上已經成功安裝opencv庫,使用:
pkg-config --modversion opencv
可查看所安裝版本掩蛤。
如果只是在回調函數(shù)中使用枉昏,就正常在CMakeLists.txt文件中加入:
find_package(OpenCV REQUIRED)
include_directories(${catkin_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS})
add_executable(rosOpenCV src/rosOpenCV.cpp)
target_link_libraries(rosOpenCV ${OpenCV_LIBS})
target_link_libraries(rosOpenCV ${catkin_LIBRARIES})
即可。注意使用時需把以上代碼中rosOpenCV換成自己的Node名稱揍鸟。
4. ROS節(jié)點多對多兄裂、一對多通信的使用
只需要給予這些發(fā)布和訂閱節(jié)點相同topic即可。
5. Cmake使用教程
CMakeLists.txt之123 - 知乎和CMake 入門實戰(zhàn) | HaHack
如有問題阳藻,歡迎聯(lián)系討論晰奖。