SLAMWARE ROS SDK,

  承接上篇,上篇講到,SLAMWARE ROS SDK的發佈,既可以讓用戶在機器人開發中實現使用SLAMWARE提供的建圖、定位和導航功能,又能保留原先基於ROS開發的應用邏輯,一舉兩得

  

  今天,小嵐就來踐行上篇的承諾,帶大家體驗一下如何利用SLAMWARE ROS SDK進行業務開發。

  我們先從機器人的移動開始說起。

  一、鍵盤控制 (前後左右移動)

  還記得ROS中最經典的turtlesim(http://wiki.ros.org/turtlesim/)嗎?案例中啓動turtle_teleop_key節點就可以通過鍵盤方向鍵控制小海龜移動了。

  

  但是,用戶拿到我們基於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_msgs::Marker>("visualization_marker", 10);

 ros::Subscriber sub = n.subscribe<slamware_ros_sdk::Line2DFlt32Array>("/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 < msg->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;

   p2.x = msg->lines[i].end.x;

   p2.y = msg->lines[i].end.y;

   p2.z = 0.2;

  

   lines.points.push_back(p1);

   lines.points.push_back(p2);

   }

}

  (4)配置lines,如:類型、尺寸和顏色等

lines.id = 1;

lines.header.frame_id = "slamware_map";

lines.type = visualization_msgs::Marker::LINE_LIST;

lines.ns = "lines";

lines.action = visualization_msgs::Marker::ADD;

lines.pose.orientation.w = 1.0;

lines.scale.x = 0.1;

lines.color.r = 1.0;

lines.color.a = 1.0;

  (5)將lines發佈出去

ros::Rate r(30);

while(running)

  {

   size_t cnt = lines.points.size();

   lines.header.stamp = ros::Time::now();

   pub.publish(lines);

   r.sleep(); 
}

  部署完之後,我們分別啓動slamware_ros_sdk_server_node, view_slamware_ros_sdk_server_node和display_virtual_lines節點。

  此時,在RViz中需要配置添加Marker信息,先找到在RViz中點擊左下角【Add】按鈕

  

  選擇添加【Marker】顯示對象

  

  添加完成之後,我們繼續在參考文檔中找到【add_ lines】這個topic,然後我們就可以自定義。點進去查看自定義類型的組成與描述:線段類型、添加位置、以及相關定義。

  啓動slamware_ros_sdk_server_node節點,連上機器人,然後在命令行中輸入:

 

rostopic pub /slamware_ros_sdk_server_node/add_line slamware_ros_sdk/AddLineRequest -1 -- '[0]' '[1, [0.0, 0.0], [1.0, 1.0]]'

  此時,我們就可以在Rviz中看見虛擬牆了。

  

  那要如何刪除呢?同理,我們找到clear_lines節點信息,在命令行輸入相應代碼即可:

rostopic pub /slamware_ros_sdk_server_node/clear_lines slamware_ros_sdk/ClearLinesRequest -1 '[0]'

  虛擬軌道功能開發亦是如此。

  ……

  以上,僅爲SLAMWARE ROS SDK中功能兩個簡單功能的演示。控制機器人運動狀態、轉向、旋轉角度、地圖同步、清空地圖等topic的靈活使用,將可以更好的對機器人進行監測與控制。

  那麼,你準備好去探索了嗎?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章