webots导入自定义纹理textures(aruco码为例),并用aruco_ros包识别aruco码

最近需要二维码在webots中实现定位并最终实现伺服导航,因此需要将aruco码导入webots。
通过调研发现大部分都是在真实相机上使用aruco_ros进行手眼标定,很少在仿真环境中使用aruco_ros进行视觉伺服,因此记录一下。

Part1 aruco码导入webots

1.首先在线生成aruco码,然后保存。

注意是original aruco!
在这里插入图片描述

2.打开webots新增一个solid。

3.在children下新增shape

4.在shape下的geometry新增一个平面让它显示出来,appearance下新增Appearance

5.Appearance下的texture新增一个imageTexture,url下输入你的存放图片地址即可

在这里插入图片描述
在这里插入图片描述

Part2 aruco_ros识别

1.aruco_ros包的安装及配置

首先安装aruco_ros包,可参考博客官网
修改single.launch, 主要修改自己的makerId,makerSize,和上述生成的aruco码匹配,remap 后面的to 更改为自己的相机image话题以及相机camera_info话题。

		<arg name="markerId"        default="400"/>
   		<arg name="markerSize"      default="0.15"/>    <!-- in m -->
        <remap from="/camera_info" to="/camera/HeadRGB_info" />
        <remap from="/image" to="/camera/headRGB" />

2. 编写camera_info_pub发布camera_info

由于使用的为仿真环境webots中的相机,并不是外接相机的usb_cam,没有usb_cam发布camera_info话题,因此需要自己写一个话题发布者,发布camera_info,话题的消息类型是sensor_msgs/CameraInfo,注意有没有camera_info_manager这个包,其中定义了sensor_msgs/CameraInfo这个类型。。
创建一个功能包camera_info_pub,然后在cmakelist内添加编译规则,填充消息内容,使用rosmsg show sensor_msgs/CameraInfo查看消息格式:
在这里插入图片描述
对消息进行赋值,有关于相机参数的解释可参考博客或者官网

 sensor_msgs::CameraInfo msg;
  msg.height = 480;
  msg.width = 640;
  msg.distortion_model = "plumb_bob";
  msg.D.resize(5);//如果不resize,编译不报错,运行时会出现段错误
  for (int i = 0; i<5; i++)
  {
      //畸变参数
      msg.D[i] = 0;
  }
  float R_[] = {1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0};
  float K_[] = {521.1711084,0.0,320,0.0,547.7089685,240,0,0,1};
  float P_[] = {521.1711084,0,320,0,0,547.7089685,240,0,0,0,1,0};
  for (int i = 0; i<9; i++)
  {
	  //9  旋转矩阵
      msg.R[i] = R_[i] ;
      //9 内参矩阵     fx 0  cx   0  fy  cy  0 0 1
      msg.K[i] = K_[i];
     
  }
  for (int i = 0; i<12; i++)
  {
      //12 投影矩阵 fx 0 cx tx 0 fy cy ty 0 0 1 0单目相机tx=ty=0
      msg.P[i] = P_[i];
  }
  msg.binning_x = 0;
  msg.binning_y = 0;
  msg.roi.x_offset = 0;
  msg.roi.y_offset = 0;
  msg.roi.height = 0;
  msg.roi.width = 0;
  msg.roi.do_rectify = false;
  //发布者定义
  ros::Publisher pub = nh.advertise<sensor_msgs::CameraInfo>("/camera/HeadRGB_info",10);
                                   //模板,定义消息类型 //话题名//队列

3.webots仿真环境结合aruco_ros对aruco码进行识别

catkin_make编译通过
1)运行roscore
2)运行camera_info_pub(也可以将其写入相机控制器,则省去第三步)
3)启动webots
4)运行aruco包下的修改后的single.launch,便实现了aruco码的识别,其实aruco_ros就是将相机参数和图像读入,再转化成位置和姿态(/aruco_single/pose)。
5)通过rqt_image_view,可以看到结果如图所示。
webots中对aruco码的识别
6)查看位姿:
在这里插入图片描述

通过rostopic echo /camera/HeadRGB_info可以看到发布的符合预期。
在这里插入图片描述

  • 26
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
GL_TEXTURE_EXTERNAL_OES是OpenGL ES中用于外部纹理的一种纹理类型。它通常用于显示来自外部硬件设备(如相机)的视频流或其他外部数据源的图像。因为它是外部纹理,所以不能直接使用glTexImage2D等函数加载纹理图像,需要通过其他方式获取它的图像数据。 一种常见的方式是使用Android中的SurfaceTexture类,它可以将外部纹理映射到纹理对象上,并提供对纹理对象的访问。在OpenGL ES中,可以通过glGenTextures生成纹理对象,然后将SurfaceTexture的纹理ID绑定到该对象上,即可获取外部纹理图像。 以下是一些示例代,展示如何使用SurfaceTexture和纹理对象抓取外部纹理图像: ```java // 创建一个SurfaceTexture对象,指定外部纹理ID SurfaceTexture surfaceTexture = new SurfaceTexture(externalTextureId); // 获取SurfaceTexture所对应的Surface对象 Surface surface = new Surface(surfaceTexture); // 创建一个EGLDisplay、EGLSurface和EGLContext // 然后将EGLSurface绑定到Surface上 // 获取外部纹理图像的宽度和高度 int width = 0, height = 0; GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, externalTextureId); GLES20.glGetTexLevelParameteriv(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, 0, GLES20.GL_TEXTURE_WIDTH, mTexWidth, 0); GLES20.glGetTexLevelParameteriv(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, 0, GLES20.GL_TEXTURE_HEIGHT, mTexHeight, 0); // 创建一个2D纹理对象 int[] textures = new int[1]; GLES20.glGenTextures(1, textures, 0); GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]); // 将SurfaceTexture的纹理ID绑定到纹理对象上 GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width, height, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null); surfaceTexture.updateTexImage(); // 解绑纹理对象和EGLSurface、EGLContext等 ``` 这里的externalTextureId是外部纹理的ID,可以通过其他方式获取。注意,在使用SurfaceTexture时,需要使用正确的纹理类型(GLES11Ext.GL_TEXTURE_EXTERNAL_OES),并且需要在更新纹理图像之前调用surfaceTexture.updateTexImage()函数来更新纹理数据。

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值