赞
踩
进入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 显示摄像头信息。
<!-- 摄像头相关的 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>
<?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下
catkin_make
source devel/setup.bash
roslaunch vision_obliquity robot_env.launch
rqt_image_view
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。