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

手术执行器添加摄像头

手术执行器文件夹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
xml 复制代码
<!-- 摄像头相关的 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 复制代码
<?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

xml 复制代码
<!-- 摄像头相关的 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实现:

xml 复制代码
<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>

组合执行器与摄像头

xml 复制代码
<!-- 组合执行器与摄像头 -->
<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:
xml 复制代码
catkin_make
source devel/setup.bash
roslaunch vision_obliquity robot_env.launch
  1. 进入到手术执行器文件夹surgical_new文件夹路径下
    另起一个终端terminal,执行命令,就可以看到摄像头环境信息
xml 复制代码
rqt_image_view
相关推荐
晓星航4 小时前
Docker本地部署Chatbot Ollama搭建AI聊天机器人并实现远程交互
人工智能·docker·机器人
忍界英雄4 小时前
LeetCode:2398. 预算内的最多机器人数目 双指针+单调队列,时间复杂度O(n)
算法·leetcode·机器人
Tisfy4 小时前
LeetCode 2398.预算内的最多机器人数目:滑动窗口+单调队列——思路清晰的一篇题解
算法·leetcode·机器人·题解·滑动窗口
北京搜维尔科技有限公司10 小时前
搜维尔科技:OptiTrack将捕捉到的人类动作数据映射到人形机器人的各个关节上进行遥操作
科技·机器人
King's King10 小时前
6年前倒闭的机器人独角兽,再次杀入AGV市场
机器人
孔武12 小时前
SG-SLAM下载部署安装运行记录
机器人·自动驾驶
zhaowangji13 小时前
ubuntu虚拟机装载共享文件夹导致的诡异错误
linux·运维·ubuntu
sorel_ferris14 小时前
Ubuntu-24.04中Docker-Desktop无法启动
linux·ubuntu·docker
多多*15 小时前
OJ在线评测系统 登录页面开发 前端后端联调实现全栈开发
linux·服务器·前端·ubuntu·docker·前端框架
OkeyProxy16 小时前
怎麼在Ubuntu上設置全局代理
ubuntu·代理模式·proxy模式·ip代理·海外ip代理