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的灵活使用,将可以更好的对机器人进行监测与控制。

  那么,你准备好去探索了吗?

  • 0
    点赞
  • 9
    收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值