如何利用SLAMWARE ROS SDK進行機器人導航定位開發
摘要:這時候,參閱SLAMWARE ROS SDK開發文檔可以發現, slamware_ros_sdk_server_node訂閱了【方向移動】的標準類型topic,也就是說,想要實現利用鍵盤控制“機器人”,我們只需編一個節點接收鍵盤信息,當收到鍵盤信息後往該topic發對應的指令消息即可。至此,利用鍵盤控制機器人的部署已經完成,完成這一步的小夥伴可以分別啓動slamware_ros_sdk_server_node與teleop_twist_keyboard節點試一下【前後左右】移動。
承接上篇,上篇講到,SLAMWARE ROS SDK的發佈,既可以讓用戶在機器人開發中實現使用SLAMWARE提供的建圖、定位和導航功能,又能保留原先基於ROS開發的應用邏輯,一舉兩得。
今天,小嵐就來踐行上篇的承諾,帶大家體驗一下如何利用SLAMWARE ROS SDK進行業務開發。
我們先從機器人的移動開始說起。一、鍵盤控制 (前後左右移動)
但是,用戶拿到我們基於SLAMWARE的機器人或者建圖雷達產品,一開始在RViz中顯示的只是一張地圖信息,想要用鍵盤控制機器人移動方向,發現並不奏效?
這時候,參閱SLAMWARE ROS SDK開發文檔可以發現, slamware_ros_sdk_server_node訂閱了【方向移動】的標準類型topic,也就是說,想要實現利用鍵盤控制“機器人”,我們只需編一個節點接收鍵盤信息,當收到鍵盤信息後往該topic發對應的指令消息即可。
相應的消息參數如下:
在利用sdk進行鍵盤控制的時候,開發的主要重點有以下幾個,小嵐已經幫大家羅列好了:
1、定義鍵盤按鈕
moveBindings = {
'w':(1.0, 0.0),
's':(-1.0, 0.0),
'a':(0.0, 1.0),
'd':(0.0, -1.0)
}
2、定義pub,制定消息topic及消息類型
pub = rospy.Publisher('/cmd_vel', Twist, queue_size = 1)
3、初始化節點
rospy.init_node('teleop_twist_keyboard')
這些都操作完成之後,當按下的按鍵在之前定義的案件keys中時,將對應的值賦給linearX,angularZ。
key = getKey()
if key in moveBindings.keys():
linearX = moveBindings[key][0]
angularZ = moveBindings[key]
else:
linearX = 0.0
angularZ = 0.0
if (key == '\x03'):
break
4、根據topic所需類型組裝發佈消息
twist = Twist()
twist.linear.x = linearX
twist.angular.z = angularZ
pub.publish(twist)
至此,利用鍵盤控制機器人的部署已經完成,完成這一步的小夥伴可以分別啓動slamware_ros_sdk_server_node與teleop_twist_keyboard節點試一下【前後左右】移動 。
下面,我們進一步深入瞭解導航定位這個問題。大家都知道,思嵐有一款可擴展的機器人管理與開發軟件 —— RoboStudio,裏面集成了機器人運動及控制開發各項功能,可以對移動機器人發送指令,實現對機器人的可視化監控。
那,如何讓ROS實現Robostudio同樣的功能呢?二、導航定位
1、導航定位
SLAMWARE ROS SDK的發佈,使得所有基於SLAMWARE的機器人的定位和地圖信息都可以在RViz中顯示。有了地圖之後,我們可以點擊任意位置,機器人會自動規劃一條最佳路線移動到目的地。具體的演示如下:
2、虛擬牆/虛擬軌道
對於思嵐來說,除了自主定位導航技術之外,還有一大特點功能就是基於純軟件設置的虛擬牆/虛擬軌道,不需任何實物鋪設,靈活控制機器人活動範圍。這個在實際應用場景中有很大的意義。
下面,我們就開始上手實驗吧~
首先,先找到文檔中的【virtual_walls】這個topic,發佈的消息類型是自定義類型,點擊可查看類型結構信息。
同樣的,小嵐給大家畫了一下重點:
(1)初始化節點、定義publisher與subscriber對象
ros::init(argc, argv, "display_virtual_lines");
ros::NodeHandle n;
ros::Publisher pub = n.advertise
("visualization_marker", 10);
ros::Subscriber sub = n.subscribe
("/slamware_ros_sdk_server_node/virtual_walls", 30, virtualWallCallback);
(2)全局定義了一個Marker類型,lines用以存儲發佈虛擬牆
visualization_msgs::Marker lines;
(3)接收到slamware_ros_sdk_server_node節點發來的虛擬牆消息後,保存到lines中
void virtualWallCallback(const slamware_ros_sdk::Line2DFlt32Array::ConstPtr & msg)
{
lines.points.clear();
size_t cnt = msg->lines.size();
for (size_t i = 0; i
lines.size(); ++i)
{
geometry_msgs::Point p1;
p1.x = msg->lines[i].start.x;
p1.y = msg->lines[i].start.y;
p1.z = 0.2;
geometry_msgs::Point p2;