注册 登录
  • 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

室外低速自动导航车的设计(5)——ROS MAP转换为JPEG并在APP上进行显示

文章索引目录
[隐藏]

第4节我们说到ROS与APP之间的地图交互与坐标系变换,今天我们来实现一个与ROS地图对接的APP,实现以下功能:   1)机器人的ROS地图能够通过网络方式传输到APP上,同时APP上能显示机器人位置   2)使用者绘制APP中地图上的某个区域,这个点能在ROS中以PoseArray的形式发布出来。   我们首先来使用Python完成一个APP的设计:  

1.1. APP向机器人请求二维地图,并获取地图的原点位置

1.1. 1.1 ROS地图转化为JPEG压缩序列(机器人端)

首先,机器人的ROS系统中,二维地图是以nav_msgs/OccupancyGrid这个消息格式存储于内存中的,我们要通过程序,将这个地图读取出来,读取出来以后转换为一个OpenCV的Mat矩阵,然后使用OpenCV的 函数将矩阵变为序列,当APP请求机器人地图时,以压缩JPEG的形式发送给APP。   其中由ROS地图向JPEG序列转码的代码区段如下(Python):   def Call4JPEGMAP(self): H=self.ros_Map.info.height W=self.ros_Map.info.width #首先构造一个H行W列的矩阵 buffer=np.zeros((H,W),dtype=np.uint8) #ROS中的地图是串行数据,要将数据传输到Mat矩阵中 for y in range(H): for x in range(W): if self.ros_Map.data[y*W+x]==-1: buffer[y][x]=10 elif self.ros_Map.data[y*W+x]==0: buffer[y][x]=255 else: buffer[y][x]=0 if len(buffer)==0: return ‘MAP INVALID’     #如果没有收到地图,就返回字符串(或者一个预制的地图) img_encode = cv2.imencode(‘.jpg’,buffer)[1]      #编码为JPEG序列 data = np.array(img_encode)  #转化为numpy的array stringData = bytearray(data)   #转化为bytearray return stringData   当外部设备通过请求机器人ROS地图时,机器人向设备反馈编码后的地图。有关http的相关内容可以联系我,在这里,我们假设http服务器已经搭建完成。http搭建完成后,我们用一个浏览器就能得到机器人编码 的地图,如下图,左边是ROS地图,右边是浏览器中呈现的地图:
可以看到,由于图片编码是从左上角开始,而ROS地图是从右上角开始,所以这两幅地图的上下是翻转的。  

1.2.1.2 机器人向外部设备发送一幅地图的全部信息(包含坐标系与地图文件)

坐标系信息包含两个部分:1)地图原点坐标系   2)机器人实际位置相对于地图原点的实际坐标。 地图原点坐标在上一节讨论过,就是地图中的一个配置文件。当APP请求地图的图片后,APP紧接着要请求地图的相关配置文件,包括地图的原点,地图的各个障碍信息,分区信息以及障碍信息。各个信息都是 以JSON格式进行返回的。 在这里,我们用一幅图表示APP与机器人之间的通讯关系:  
  当APP获得了地图以后,就可以对地图进行加载,显示了。  

2.2. 外部设备获取并加载机器人的实时位置

外部设备可以采用http定时请求的方式获得机器人的实时位置,这在上一节也讲到了。但是我们需要的是,根据机器人地图的配置文件,对机器人的显示坐标进行合理的变换,让机器人在地图上进行显示。在这 里便涉及到了:1)机器人位置实时更新  2)机器人与地图之间的坐标变换。  

2.1.2.1  客户端与ROS地图之间的坐标变换

首先,为了保证不同APP之间的一致性,机器人向APP传输的数据只能是环境实际数据。同时,在机器人ROS的地图配置文件中,机器人是以地图图片的左下角位置坐标来标定原点的。这个也就意味着,客户端 (APP)层面要对地图进行比例,位置等变换。所以我们现在需要三个基本函数支持:   1)做出实际坐标与位图坐标的比例变换函数:   def Env2Pix(x,y,ratio=0.05): return int(x/ratio),int(y/ratio) def Pix2Env(x:int,y:int,ratio=0.05): return x * ratio, y * ratio 2)根据原点与一个点相对于原点的坐标,计算它相对于图片左下角的坐标(用于显示机器人): 3)根据原点与一个点相对于左下角的坐标,计算它相对于原点的坐标(用于确定使用者点击的实际位置): 这三个基本函数完成后,我们就可以完成整个机器人显示,和用户在地图上点的选取。  

2.2.2.2 机器人在地图上位置的正确显示

(先吃饭,明天下一节再写吧)   欢迎大家关注,你的关注就是雨哥更新的动力~! 另外,本博客是雨哥在做项目过程中总结提炼的非涉密技术类文档,欢迎大家转发,转载请注明出处,同时不得用于商业用途!  
———————————————— 版权声明:本文为CSDN博主「麻辣小蘑菇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/z824074989y/article/details/104537398


开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明室外低速自动导航车的设计(5)——ROS MAP转换为JPEG并在APP上进行显示
喜欢 (0)
[开心洋葱]
分享 (0)

您必须 登录 才能发表评论!

……
加载中……