给自己的机器人部件安装单目摄像头并实现gazebo仿真功能

2024-04-15 06:04

本文主要是介绍给自己的机器人部件安装单目摄像头并实现gazebo仿真功能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

手术执行器添加摄像头

  • 手术执行器文件夹surgical_new内容展示
  • 如何添加单目摄像头
  • 下载现成的机器人环境文件
  • 启动仿真环境

手术执行器文件夹surgical_new内容展示

在这里插入图片描述
进入src文件夹下选择进入vision_obliquity文件夹
在这里插入图片描述
选择launch
在这里插入图片描述
有两个可用gazebo中rviz展示的launch文件,robot.launch是添加有摄像头的手术执行器文件,robot_env.launch进一步添加有环境信息的手术执行器文件
在这里插入图片描述
下图是robot.launch展示(红色方块是我们添加的摄像头):
在这里插入图片描述
下图是robot_env.launch展示:
在这里插入图片描述

如何添加单目摄像头

参考b站学习视频的添加摄像头部分内容: https://www.bilibili.com/video/BV1Ci4y1L7ZZ?p=263&vd_source=9e3999ac88af2c6889c5f00cccc8d215
对应课程文档链接:http://www.autolabor.com.cn/book/ROSTutorials/
实现为我们自己的机器人添加摄像头功能:
实现流程:
摄像头仿真基本流程:
已经创建完毕的机器人模型,编写一个单独的 xacro 文件,为机器人模型添加摄像头配置;
将此文件集成进xacro文件;
启动 Gazebo,使用 Rviz 显示摄像头信息。

  1. 摄像头 xacro 文件
    camera.xacro,代码内容如下:
    camera link、将相机作为一个link添加到机器人上的部件link2,于是便有个camera2link2的关节,type为固定的fixed
<!-- 摄像头相关的 xacro 文件 -->
<robot name="my_camera" xmlns:xacro="http://wiki.ros.org/xacro"><!-- 摄像头属性 --><xacro:property name="camera_length" value="0.001" /> <!-- 摄像头长度(x) --><xacro:property name="camera_width" value="0.00025" /> <!-- 摄像头宽度(y) --><xacro:property name="camera_height" value="0.00025" /> <!-- 摄像头高度(z) --><xacro:property name="camera_x" value="0" /> <!-- 摄像头安装的x坐标 --><xacro:property name="camera_y" value="0" /> <!-- 摄像头安装的y坐标 --><xacro:property name="camera_z" value="0.02" /> <!-- 摄像头安装的z坐标:底盘高度 / 2 + 摄像头高度 / 2  --><!-- Create laser reference frame --><link name="camera"><visual><origin xyz="0.000198755346578818 -0.000268944626068074 -0.0105330004865362" rpy="0 0 0" /><geometry><box size="${camera_length} ${camera_width} ${camera_height}" /></geometry><material name="red"/></visual><collision><origin xyz="0.000198755346578818 -0.000268944626068074 -0.0105330004865362" rpy="0 0 0" /><geometry><box size="${camera_length} ${camera_width} ${camera_height}" /></geometry></collision></link><!-- 关节 --><joint name="camera2link2" type="fixed"><parent link="link2"/><child link="camera" /><!-- 需要计算两个 link 的物理中心之间的偏移量 --><!-- 设置joint相对于父节的偏移量 --><origin xyz="-0.00028 -0.0003 0.0102" rpy="0 0 0" /><!-- 设置关节旋转参考的坐标轴,0表示不绕该轴旋转,1表示绕该轴旋转 --><axis xyz="0 0 1" /></joint> 
</robot>
  1. Gazebo 仿真摄像头
    通过 Gazebo 模拟摄像头传感器,并在 Rviz 中显示摄像头数据
    新建 xacro 文件命名为cameraz_gazebo.xacro,配置摄像头传感器信息:
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="my_sensors"><gazebo reference="camera"><material>Gazebo/Red</material></gazebo><gazebo reference="camera"><sensor type="camera" name="camera_node"><update_rate>30.0</update_rate><camera name="head"><horizontal_fov>1.3962634</horizontal_fov><image><width>1280</width><height>720</height><format>R8G8B8</format></image><clip><near>0.02</near><far>300</far></clip><noise><type>gaussian</type><mean>0.0</mean><stddev>0.007</stddev></noise></camera><plugin name="gazebo_camera" filename="libgazebo_ros_camera.so"><alwaysOn>true</alwaysOn><updateRate>0.0</updateRate><cameraName>/camera</cameraName><imageTopicName>image_raw</imageTopicName><cameraInfoTopicName>camera_info</cameraInfoTopicName><frameName>camera</frameName><hackBaseline>0.07</hackBaseline><distortionK1>0.0</distortionK1><distortionK2>0.0</distortionK2><distortionK3>0.0</distortionK3><distortionT1>0.0</distortionT1><distortionT2>0.0</distortionT2></plugin></sensor></gazebo>
</robot>

1.2摄像头 xacro 文件
camera.xacro,代码内容如下:
camera link、将相机作为一个link添加到机器人上link2,于是便有个camera2link2的关节,type为固定的fixed

<!-- 摄像头相关的 xacro 文件 -->
<robot name="my_camera" xmlns:xacro="http://wiki.ros.org/xacro"><!-- 摄像头属性 --><xacro:property name="camera_length" value="0.001" /> <!-- 摄像头长度(x) --><xacro:property name="camera_width" value="0.00025" /> <!-- 摄像头宽度(y) --><xacro:property name="camera_height" value="0.00025" /> <!-- 摄像头高度(z) --><xacro:property name="camera_x" value="0" /> <!-- 摄像头安装的x坐标 --><xacro:property name="camera_y" value="0" /> <!-- 摄像头安装的y坐标 --><xacro:property name="camera_z" value="0.02" /> <!-- 摄像头安装的z坐标:底盘高度 / 2 + 摄像头高度 / 2  --><!-- Create laser reference frame --><link name="camera"><visual><origin xyz="0.000198755346578818 -0.000268944626068074 -0.0105330004865362" rpy="0 0 0" /><geometry><box size="${camera_length} ${camera_width} ${camera_height}" /></geometry><material name="red"/></visual><collision><origin xyz="0.000198755346578818 -0.000268944626068074 -0.0105330004865362" rpy="0 0 0" /><geometry><box size="${camera_length} ${camera_width} ${camera_height}" /></geometry></collision></link><!-- 关节 --><joint name="camera2link2" type="fixed"><parent link="link2"/><child link="camera" /><!-- 需要计算两个 link 的物理中心之间的偏移量 --><!-- 设置joint相对于父节的偏移量 --><origin xyz="-0.00028 -0.0003 0.0102" rpy="0 0 0" /><!-- 设置关节旋转参考的坐标轴,0表示不绕该轴旋转,1表示绕该轴旋转 --><axis xyz="0 0 1" /></joint> 
</robot>

封装惯性矩阵算法的 xacro 文件,内容如下的my_head.xacro文件书写,这个文件复制于链接http://www.autolabor.com.cn/book/ROSTutorials/di-6-zhang-ji-qi-ren-xi-tong-fang-zhen/66-urdfji-cheng-gazebo/662-urdf-ji-cheng-gazebo-xiang-guan-she-zhi.html的6.6.2 URDF集成Gazebo相关设置这一小节,将标准的球体、圆柱与立方体的惯性矩阵公式封装成xacro实现:

<robot name="base" xmlns:xacro="http://wiki.ros.org/xacro"><!-- Macro for inertia matrix --><xacro:macro name="sphere_inertial_matrix" params="m r"><inertial><mass value="${m}" /><inertia ixx="${2*m*r*r/5}" ixy="0" ixz="0"iyy="${2*m*r*r/5}" iyz="0" izz="${2*m*r*r/5}" /></inertial></xacro:macro><xacro:macro name="cylinder_inertial_matrix" params="m r h"><inertial><mass value="${m}" /><inertia ixx="${m*(3*r*r+h*h)/12}" ixy = "0" ixz = "0"iyy="${m*(3*r*r+h*h)/12}" iyz = "0"izz="${m*r*r/2}" /> </inertial></xacro:macro><xacro:macro name="Box_inertial_matrix" params="m l w h"><inertial><mass value="${m}" /><inertia ixx="${m*(h*h + l*l)/12}" ixy = "0" ixz = "0"iyy="${m*(w*w + l*l)/12}" iyz= "0"izz="${m*(w*w + h*h)/12}" /></inertial></xacro:macro>
</robot>

组合执行器与摄像头

<!-- 组合执行器与摄像头 -->
<robot name="my_robot" xmlns:xacro="http://wiki.ros.org/xacro"><xacro:include filename="myhead.xacro" /><xacro:include filename="vision_obliquity_gazebo.xacro" /><xacro:include filename="camera.xacro" /><xacro:include filename="camera_gazebo.xacro" />
</robot>

这里的vision_obliquity_gazebo.xacro是我们自己的机器人xacro文件,也就是手术执行器,替换成你们自己的机器人描述文件。

下载现成的机器人环境文件

1.下载官方模型库
https://github.com/osrf/gazebo_models
2.将模型库复制进 gazebo
将得到的box_hours.world文件复制到 /urdf/worlds下
在这里插入图片描述

启动仿真环境

  1. 进入到手术执行器文件夹surgical_new文件夹路径下
    执行如下命令,启动gazebo:
catkin_make
source devel/setup.bash
roslaunch vision_obliquity robot_env.launch

在这里插入图片描述

  1. 进入到手术执行器文件夹surgical_new文件夹路径下
    另起一个终端terminal,执行命令,就可以看到摄像头环境信息
rqt_image_view

在这里插入图片描述

这篇关于给自己的机器人部件安装单目摄像头并实现gazebo仿真功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/905025

相关文章

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

opencv图像处理之指纹验证的实现

《opencv图像处理之指纹验证的实现》本文主要介绍了opencv图像处理之指纹验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、简介二、具体案例实现1. 图像显示函数2. 指纹验证函数3. 主函数4、运行结果三、总结一、

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

SpringIntegration消息路由之Router的条件路由与过滤功能

《SpringIntegration消息路由之Router的条件路由与过滤功能》本文详细介绍了Router的基础概念、条件路由实现、基于消息头的路由、动态路由与路由表、消息过滤与选择性路由以及错误处理... 目录引言一、Router基础概念二、条件路由实现三、基于消息头的路由四、动态路由与路由表五、消息过滤

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

基于SpringBoot实现文件秒传功能

《基于SpringBoot实现文件秒传功能》在开发Web应用时,文件上传是一个常见需求,然而,当用户需要上传大文件或相同文件多次时,会造成带宽浪费和服务器存储冗余,此时可以使用文件秒传技术通过识别重复... 目录前言文件秒传原理代码实现1. 创建项目基础结构2. 创建上传存储代码3. 创建Result类4.

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.