NodeHandles and Initialization
1. 節點句柄
rosserial_arduino允許您輕松地將Arduino或其他串行設備連接到ROS runtime graph。
所有節點初始化和通信都通過節點句柄(NodeHandle)處理。
在setup()
函數之前創建NodeHandle
非常簡單:
ros::NodeHandle nh;
2. 初始化
您可能在Arduino setup()
函數中執行的第一個調用就是調用initNode()
,它會初始化ROS節點。
*請注意,在一個rosserial設備中只能有一個節點,因此只能調用一次initNode()。
以下示例顯示了如何初始化節點並處理loop()
函數內的串行數據的完整示例:
#include <ros.h> ros::NodeHandle nh; void setup() { nh.initNode(); } void loop() { nh.spinOnce(); }
3.自定義硬件對象
rosserial_client庫實際上並不直接提供NodeHandle對象。 相反,它提供:
ros::NodeHandle_<HardwareType, MAX_PUBLISHERS=25, MAX_SUBSCRIBERS=25, IN_BUFFER_SIZE=512, OUT_BUFFER_SIZE=512> nh;
Messages
1. 消息生成
與所有ROS客戶端庫一樣,rosserial接受msg文件並為它們生成Arduino C / C ++源代碼。
這種模式是:
package_name / msg / Foo.msg→package_name :: Foo
同樣,srv文件也生成了C / C ++源代碼。 這種模式是:
package_name / srv / Bar.srv→package_name :: Bar
生成的文件的源位於ros_lib庫文件夾的package_name目錄中。
因此,在代碼中包含std_msgs / String
消息涉及:
#include <std_msgs/String.h>
並創建一個消息實例:
std_msgs::String str;
請注意,消息中的所有字段都會初始化為默認值 0(字符串和可變長度數組的初始化默認值為空指針)。
還要注意,消息中的數組未定義為矢量對象。
因此,必須預定義數組,然后將其作為指針傳遞給消息。要確定數組的末尾,每個數組都有一個自動生成的整數、與數組名相同的名字和后綴_length。(另見rosserial/ Overview / Limitations)
sensor_msgs / JointState的示例:
1 //creating the message 2 sensor_msgs::JointState jstate; 3 4 //creating the arrays for the message 5 char *name[] = {"motor_1", "motor_2"}; 6 float vel[]={0,0}; 7 float pos[]={0,0}; 8 float eff[]={0,0}; 9 10 //assigning the arrays to the message 11 jstate.name=name; 12 jstate.position=pos; 13 jstate.velocity=vel; 14 jstate.effort=eff; 15 16 //setting the length 17 jstate.name_length=2; 18 jstate.position_length=2; 19 jstate.velocity_length=2; 20 jstate.effort_length=2;
2. 消息頭文件(Message Header )生成
當在rosserial_arduino包中運行make時,會自動為許多常見消息創建頭文件。如果有其他的消息需要創建頭文件,請點擊此鏈接查看。