ROS学习(9)自定义移动机器人模型Gazebo仿真

2023-05-16

文章目录

  • 前言
  • 一、gazebo启动
  • 二、创建编译功能包
  • 三、更新xacro文件
    • 1、更新robot_base.xacro
    • 2、更新robot_camera.xacro
    • 3、更新robot_lidar.xacro
    • 4、更新robot.xacro
  • 四、更新launch文件
  • 四、仿真效果
  • 五、添加地图
  • 五、总结


前言

想在ROS系统中对我们自定义的机器人进行仿真,需要使用Gazebo,其是一种适用于复杂室内环境和室外环境的仿真环境。

一、gazebo启动

gazebo独立于ROS,并可以在Ubuntu中以独立功能包安装。我的ROS系统(melodic)是完整安装包,所以包含了gazebo,版本为9.0.0,在此省略了安装步骤。
查询版本命令如下:

dpkg -l | grep gazebo

可以使用如下命令启动gazebo,确认是否安装:

gazebo

结果遇到如下错误:
在这里插入图片描述
解决方法,使用如下命令打开文件config.yaml:

sudo gedit ~/.ignition/fuel/config.yaml

添加如下一行:

url: https://api.ignitionrobotics.org

可以正常启动gazebo了。

二、创建编译功能包

切换到catkin_ws/src目录下,如下:

catkin_create_pkg mbot_sim_gazebo urdf xacro

切换到catkin_ws目录下,编译该功能包,如下:

catkin_make mbot_sim_gazebo

在该功能包下创建include、src、launch、urdf文件夹,在urdf文件下创建urdf文件夹和xacro文件夹。

三、更新xacro文件

1、更新robot_base.xacro

robot_base.xacro文件内容如下:

<?xml version="1.0"?>
<robot name="mbot" xmlns:xacro="http://www.ros.org/wiki/xacro">

    <!-- PROPERTY LIST -->
    <xacro:property name="M_PI" value="3.1415926"/>
    <xacro:property name="base_mass"   value="20" /> 
    <xacro:property name="base_radius" value="0.20"/>
    <xacro:property name="base_length" value="0.16"/>

    <xacro:property name="wheel_mass"   value="2" />
    <xacro:property name="wheel_radius" value="0.06"/>
    <xacro:property name="wheel_length" value="0.025"/>
    <xacro:property name="wheel_joint_y" value="0.19"/>
    <xacro:property name="wheel_joint_z" value="0.05"/>

    <xacro:property name="caster_mass"    value="0.5" /> 
    <xacro:property name="caster_radius"  value="0.015"/> <!-- wheel_radius - ( base_length/2 - wheel_joint_z) -->
    <xacro:property name="caster_joint_x" value="0.18"/>

    <!-- Defining the colors used in this robot -->
    <material name="yellow">
        <color rgba="1 0.4 0 1"/>
    </material>
    <material name="black">
        <color rgba="0 0 0 0.95"/>
    </material>
    <material name="gray">
        <color rgba="0.75 0.75 0.75 1"/>
    </material>
    
    <!-- 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>

    <!-- Macro for robot wheel -->
    <xacro:macro name="wheel" params="prefix reflect">
        <joint name="${prefix}_wheel_joint" type="continuous">
            <origin xyz="0 ${reflect*wheel_joint_y} ${-wheel_joint_z}" rpy="0 0 0"/>
            <parent link="base_link"/>
            <child link="${prefix}_wheel_link"/>
            <axis xyz="0 1 0"/>
        </joint>

        <link name="${prefix}_wheel_link">
            <visual>
                <origin xyz="0 0 0" rpy="${M_PI/2} 0 0" />
                <geometry>
                    <cylinder radius="${wheel_radius}" length = "${wheel_length}"/>
                </geometry>
                <material name="gray" />
            </visual>
            <collision>
                <origin xyz="0 0 0" rpy="${M_PI/2} 0 0" />
                <geometry>
                    <cylinder radius="${wheel_radius}" length = "${wheel_length}"/>
                </geometry>
            </collision>
            <cylinder_inertial_matrix  m="${wheel_mass}" r="${wheel_radius}" h="${wheel_length}" />
        </link>

        <gazebo reference="${prefix}_wheel_link">
            <material>Gazebo/Gray</material>
        </gazebo>

        <!-- Transmission is important to link the joints and the controller-->
        <transmission name="${prefix}_wheel_joint_trans">
            <type>transmission_interface/SimpleTransmission</type>
            <joint name="${prefix}_wheel_joint" >
                <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
            </joint>
            <actuator name="${prefix}_wheel_joint_motor">
                <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
                <mechanicalReduction>1</mechanicalReduction>
            </actuator>
        </transmission>
    </xacro:macro>

    <!-- Macro for robot caster -->
    <xacro:macro name="caster" params="prefix reflect">
        <joint name="${prefix}_caster_joint" type="continuous">
            <origin xyz="${reflect*caster_joint_x} 0 ${-(base_length/2 + caster_radius)}" rpy="0 0 0"/>
            <parent link="base_link"/>
            <child link="${prefix}_caster_link"/>
            <axis xyz="0 1 0"/>
        </joint>

        <link name="${prefix}_caster_link">
            <visual>
                <origin xyz="0 0 0" rpy="0 0 0"/>
                <geometry>
                    <sphere radius="${caster_radius}" />
                </geometry>
                <material name="black" />
            </visual>
            <collision>
                <origin xyz="0 0 0" rpy="0 0 0"/>
                <geometry>
                    <sphere radius="${caster_radius}" />
                </geometry>
            </collision>      
            <sphere_inertial_matrix  m="${caster_mass}" r="${caster_radius}" />
        </link>

        <gazebo reference="${prefix}_caster_link">
            <material>Gazebo/Black</material>
        </gazebo>
    </xacro:macro>

    <xacro:macro name="mbot_base_gazebo">
        <link name="base_footprint">
            <visual>
                <origin xyz="0 0 0" rpy="0 0 0" />
                <geometry>
                    <box size="0.001 0.001 0.001" />
                </geometry>
            </visual>
        </link>
        <gazebo reference="base_footprint">
            <turnGravityOff>false</turnGravityOff>
        </gazebo>

        <joint name="base_footprint_joint" type="fixed">
            <origin xyz="0 0 ${base_length/2 + caster_radius*2}" rpy="0 0 0" />        
            <parent link="base_footprint"/>
            <child link="base_link" />
        </joint>

        <link name="base_link">
            <visual>
                <origin xyz=" 0 0 0" rpy="0 0 0" />
                <geometry>
                    <cylinder length="${base_length}" radius="${base_radius}"/>
                </geometry>
                <material name="yellow" />
            </visual>
            <collision>
                <origin xyz=" 0 0 0" rpy="0 0 0" />
                <geometry>
                    <cylinder length="${base_length}" radius="${base_radius}"/>
                </geometry>
            </collision>   
            <cylinder_inertial_matrix  m="${base_mass}" r="${base_radius}" h="${base_length}" />
        </link>

        <gazebo reference="base_link">
            <material>Gazebo/Blue</material>
        </gazebo>

        <wheel prefix="left"  reflect="-1"/>
        <wheel prefix="right" reflect="1"/>

        <caster prefix="front" reflect="-1"/>
        <caster prefix="back"  reflect="1"/>

        <!-- controller -->
        <gazebo>
            <plugin name="differential_drive_controller" 
                    filename="libgazebo_ros_diff_drive.so">
                <rosDebugLevel>Debug</rosDebugLevel>
                <publishWheelTF>true</publishWheelTF>
                <robotNamespace>/</robotNamespace>
                <publishTf>1</publishTf>
                <publishWheelJointState>true</publishWheelJointState>
                <alwaysOn>true</alwaysOn>
                <updateRate>100.0</updateRate>
                <legacyMode>true</legacyMode>
                <leftJoint>left_wheel_joint</leftJoint>
                <rightJoint>right_wheel_joint</rightJoint>
                <wheelSeparation>${wheel_joint_y*2}</wheelSeparation>
                <wheelDiameter>${2*wheel_radius}</wheelDiameter>
                <broadcastTF>1</broadcastTF>
                <wheelTorque>30</wheelTorque>
                <wheelAcceleration>1.8</wheelAcceleration>
                <commandTopic>cmd_vel</commandTopic>
                <odometryFrame>odom</odometryFrame> 
                <odometryTopic>odom</odometryTopic> 
                <robotBaseFrame>base_footprint</robotBaseFrame>
            </plugin>
        </gazebo> 
    </xacro:macro>

</robot>

2、更新robot_camera.xacro

上一篇我们只添加了摄像头外观,在这里我们添加摄像头属性,更新robot_camera.xacro文件内容如下:

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="camera">

    <xacro:macro name="usb_camera" params="prefix:=camera">
        <!-- Create laser reference frame -->
        <link name="${prefix}_link">
            <inertial>
                <mass value="0.1" />
                <origin xyz="0 0 0" />
                <inertia ixx="0.01" ixy="0.0" ixz="0.0"
                         iyy="0.01" iyz="0.0"
                         izz="0.01" />
            </inertial>

            <visual>
                <origin xyz=" 0 0 0 " rpy="0 0 0" />
                <geometry>
                    <box size="0.01 0.04 0.04" />
                </geometry>
                <material name="black"/>
            </visual>

            <collision>
                <origin xyz="0.0 0.0 0.0" rpy="0 0 0" />
                <geometry>
                    <box size="0.01 0.04 0.04" />
                </geometry>
            </collision>
        </link>
        <gazebo reference="${prefix}_link">
            <material>Gazebo/Black</material>
        </gazebo>

        <gazebo reference="${prefix}_link">
            <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_link</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>

    </xacro:macro>
</robot>

3、更新robot_lidar.xacro

通过plugin标签,在gazebo中插入激光雷达的相关插件,更新robot_lidar.xacro文件内容如下:

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="lidar">
	<xacro:macro name="hokuyo_lidar" params="prefix:=lidar">
			<link name="hokuyo_link">
	    		<collision>
	      			<origin xyz="0 0 0" rpy="0 0 0"/>
	      			<geometry>
						<box size="0.1 0.1 0.1"/>
	     			</geometry>
	    		</collision>
	    		<visual>
	      			<origin xyz="0 0 0" rpy="0 0 0"/>
	      			<geometry>
	        			<mesh filename="package://mbot_sim_gazebo/meshes/hokuyo.dae"/>
	      			</geometry>
	    		</visual>
	    		<inertial>
	      			<mass value="1e-5" />
	      			<origin xyz="0 0 0" rpy="0 0 0"/>
	      			<inertia ixx="1e-6" ixy="0" ixz="0" iyy="1e-6" iyz="0" izz="1e-6" />
	    		</inertial>
	  		</link>
			<gazebo reference="lidar_link">
			    <sensor type="ray" name="head_hokuyo_sensor">
			      <pose>0 0 0 0 0 0</pose>
			      <visualize>false</visualize>
			      <update_rate>40</update_rate>
			      <ray>
			        <scan>
			          <horizontal>
			            <samples>720</samples>
			            <resolution>1</resolution>
			            <min_angle>-1.570796</min_angle>
			            <max_angle>1.570796</max_angle>
			          </horizontal>
			        </scan>
			        <range>
			          <min>0.10</min>
			          <max>30.0</max>
			          <resolution>0.01</resolution>
			        </range>
			        <noise>
			          <type>gaussian</type>
			          <mean>0.0</mean>
			          <stddev>0.01</stddev>
			        </noise>
			      </ray>
			      <plugin name="gazebo_ros_head_hokuyo_controller" filename="libgazebo_ros_laser.so">
			        <topicName>/scan</topicName>
			        <frameName>hokuyo_link</frameName>
			      </plugin>
			    </sensor>
			  </gazebo>
	</xacro:macro>
</robot>

4、更新robot.xacro

由于机器人主体宏定义的名字改了,因此robot.xacro更新如下:

<?xml version="1.0"?>
<robot name="arm" xmlns:xacro="http://www.ros.org/wiki/xacro">

    <xacro:include filename="$(find mbot_sim_gazebo)/urdf/xacro/robot_base.xacro" />
    <xacro:include filename="$(find mbot_sim_gazebo)/urdf/xacro/robot_camera.xacro" />
    <xacro:include filename="$(find mbot_sim_gazebo)/urdf/xacro/robot_lidar.xacro" />

    <xacro:property name="camera_offset_x" value="0.17" />
    <xacro:property name="camera_offset_y" value="0" />
    <xacro:property name="camera_offset_z" value="0.10" />
    <xacro:property name="lidar_offset_x" value="-0.17" />
    <xacro:property name="lidar_offset_y" value="0" />
    <xacro:property name="lidar_offset_z" value="0.10" />

    <xacro:mbot_base_gazebo/>

    <!-- Camera -->
    <joint name="camera_joint" type="fixed">
        <origin xyz="${camera_offset_x} ${camera_offset_y} ${camera_offset_z}" rpy="0 0 0" />
        <parent link="base_link"/>
        <child link="camera_link"/>
    </joint>

    <xacro:usb_camera prefix="camera"/>

    <joint name="lidar_joint" type="fixed">
        <origin xyz="${lidar_offset_x} ${lidar_offset_y} ${lidar_offset_z}" rpy="0 0 0" />
        <parent link="base_link"/>
        <child link="lidar_link"/>
    </joint>
    <xacro:hokuyo_lidar prefix="lidar"/>

</robot>

四、更新launch文件

launch文件需要加入gazebo的设置,并将rviz相关设置去掉:

<launch>
        <!-- 设置launch文件的参数 -->
    <arg name="paused" default="false"/>
    <arg name="use_sim_time" default="true"/>
    <arg name="gui" default="true"/>
    <arg name="headless" default="false"/>
    <arg name="debug" default="false"/>

    <!-- 运行gazebo仿真环境 -->
    <include file="$(find gazebo_ros)/launch/empty_world.launch">
        <arg name="debug" value="$(arg debug)" />
        <arg name="gui" value="$(arg gui)" />
        <arg name="paused" value="$(arg paused)"/>
        <arg name="use_sim_time" value="$(arg use_sim_time)"/>
        <arg name="headless" value="$(arg headless)"/>
    </include>

    
    <!--机器人参数设置-->
    <arg name="model" default="$(find xacro)/xacro --inorder '$(find mbot_sim_gazebo)/urdf/xacro/robot.xacro'" />
     
    <!--robot_description 参数名称是参数服务器预先设定好的,不能改变-->
    <param name="robot_description" command="$(arg model)" />


    <!-- 运行joint_state_publisher节点,发布机器人的关节状态  -->
    <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />

    <!-- 运行robot_state_publisher节点,发布tf  -->
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />

      <!-- 在gazebo中加载机器人模型-->
    <node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
          args="-urdf -model mrobot -param robot_description"/> 

</launch>

四、仿真效果

运行如下命令,仿真效果如下:

roslaunch mbot_sim_gazebo robot.launch

在这里插入图片描述
可以通过rqt_image_view查看图像:

rqt_image_view

此时,摄像头显示内容是灰色的,这是因为环境为空的缘故。
在这里插入图片描述

五、添加地图

首先尝试加载柳树库公司(Willow Garage)办公室的地图,这张地图在ROS中是默认安装的,这个3D模型保存在/usr/share/gazebo-9/worlds中。我们使用如下命令加载:

roslaunch gazebo_ros willowgarage_world.launch

发现界面一直卡在这里,效果如下:
在这里插入图片描述
这是因为模型加载失败,解决方法如下:
切换到/usr/share/gazebo-9/目录下,执行如下命令:

sudo chmod 777 models

再切换到/usr/share/gazebo-9/models/目录下,执行如下命令:

sudo wget http://file.ncnynl.com/ros/gazebo_models.txt
sudo wget -i gazebo_models.txt
ls model.tar.g* | xargs -n1 tar xzvf

再次运行柳树库公司办公室的launch文件,效果如下:
在这里插入图片描述
现在要做的是创建一个新的launch文件来同时加载地图和机器人,在launch文件夹下创建robot_gazebo_wg.launch,文件内容如下:

<launch>
    <!-- 运行gazebo仿真环境 -->
    <include file="$(find gazebo_ros)/launch/willowgarage_world.launch">
    </include>

    
    <!--机器人参数设置-->
    <arg name="model" default="$(find xacro)/xacro --inorder '$(find mbot_sim_gazebo)/urdf/xacro/robot.xacro'" />
     
    <!--robot_description 参数名称是参数服务器预先设定好的,不能改变-->
    <param name="robot_description" command="$(arg model)" />


    <!-- 运行joint_state_publisher节点,发布机器人的关节状态  -->
    <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />

    <!-- 运行robot_state_publisher节点,发布tf  -->
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />

      <!-- 在gazebo中加载机器人模型-->
    <node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
          args="-urdf -model mrobot -param robot_description"/> 

</launch>

通过如下命令运行:

roslaunch mbot_sim_gazebo robot_gazebo_wg.launch

效果如下,蓝色点即为机器人模型:
在这里插入图片描述
再运行如下命令查看图像:

rqt_image_view

此时,摄像头是有内容的,效果如下:
在这里插入图片描述
此时,通过如下命令,可以查看激光雷达的数据:

rostopic echo /scan

在这里插入图片描述

五、总结

截止到目前,我们为自定义的机器人模型,添加了摄像头和激光雷达 ,又为其添加了地图,下一篇开始介绍如何控制机器人在仿真环境下的移动。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS学习(9)自定义移动机器人模型Gazebo仿真 的相关文章

  • Docker容器基础

    1 介绍 Docker官网 xff1a https docs docker com Docker的github地址 xff1a https github com moby moby Dockerhub官网 https registry hu

随机推荐

  • 【自动驾驶】常见位姿估计算法的比较: 三角测量、PNP、ICP、

    PnP问题 3D 2D DLT 直接线性变换算法 相机标定工程用到的是DLT 直接线性变换算法 xff0c 它是一类PnP问题 3D 2D 请参考 位姿估计 视觉SLAM 笔记 常见位姿估计算法的比较 PnP xff08 Perspecti
  • CC2530 BootLoader,不带协议栈,任意跳转

    最近业余研究了下CC2530的远程固件更新 空中下载 现做个总结 一则方便大家学习共进 二则自己做个记录以防日后忘了 一 BootLoader主要技术点 nbsp nbsp 1 程序跳转到指定位置 nbsp nbsp 2 设置好相应的中断向
  • 使用 VNC 实现多用户登录

    Virtual Network Computing VNC 是一种提供计算机远程访问的流行工具 常规的 VNC 配置是针对单用户工作台而进行优化的 xff0c 可登录到 VNC 端口直接访问单一用户的桌面 然而 xff0c 这一配置在多用户
  • STLink V2烧录SWIM和SWD接口接线图

    stm8 采用SVTP软件烧录 xff0c 烧录接口为SWIM xff08 stlink v2烧录器带有该接口 xff09 xff0c 如下图 xff1a stm32可采用stlink v2 的SWD接口烧录 xff0c 接线图如下 xff
  • 车辆姿态角(Euler角)Pitch、Yaw、Roll 的设定

    首先申明 xff1a 此坐标系是针对车辆而设定的 xff0c 对于无人机来说是不同的 pitch xff1a 俯仰角 xff0c pitchAngleC2W orientation radian Y yaw xff1a 航向角 xff0c
  • Docker(四)----Docker-Compose 详解

    1 什么是Docker Compose Compose项目来源于之前的fig项目 xff0c 使用python语言编写 与docker swarm配合度很高 Compose 是 Docker 容器进行编排的工具 xff0c 定义和运行多容器
  • 转贴:ERP实施过程中的40个问题

    笔者在多年的实践中 xff0c 结合自身经验和多年的理论积累 xff0c 总结出有关ERP 实施的最关键的39 个问题 xff0c 以问答的形式 xff0c 让您在最短的时间内对ERP 实施有一个全面而客观的认识 xff0c 以免陷入日新月
  • VS Code 常用设置集合

    常用设置 xff08 setting json xff09 34 editor parameterHints enabled 34 true 开启参数预览窗口 设置字体颜色 34 editor semanticTokenColorCusto
  • Arduino--LCD1602(IIC)

    xff08 1 xff09 简介 前篇文章介绍了LCD1602的四位数据线控制方法 xff1a https blog csdn net u011816009 article details 106573622 但是该方法还是需要较多的IO口
  • Px4 ULog文件详解

    Px4 ULog文件详解 简介数据类型文件组织文件头定义段消息标记位消息格式定义消息信息消息复合信息消息参数消息 数据段订阅消息取消订阅消息日志数据消息字符串消息同步消息丢失 附录 简介 ULog 是用于记录数据的文件格式 xff0c 该格
  • 开发日记(一)

    这是自己编程第二天 xff0c 自己解决了好几个问题 xff0c 觉得很有成就感 xff0c 决定写下以后开发中遇到的问题 1 在多个Activity中传递数据 xff0c 之前只学过绑定基本的putExtra xff0c 今天上网一搜 x
  • 源程序生成控制流图和du-path

    最近上 源代码分析技术 这个课 xff0c 老师让写一个程序 xff0c 由一段c代码 xff0c 生成生成控制流图和du path xff0c 控制流图不用解释了 xff0c 说一下du path xff0c 这个术语是针对变量来说的 x
  • pandas使用笔记

    DataFrame使用笔记 dates 61 pd date range span class hljs string 39 20160728 39 span periods 61 span class hljs number 6 span
  • keras

    大神笔记 xff0c 转载自http blog csdn net u012162613 article details 45397033 Keras简介 Keras是基于Theano的一个深度学习框架 xff0c 它的设计参考了Torch
  • gensim similarity计算文档相似度

    向量空间模型计算文档集合相似性 0 将原始输入的词转换为ID xff0c 词的id表示法简单易用 xff0c 但是无法预测未登记词 xff0c 难以挖掘词关系 xff1b 词汇鸿沟 1 任意两个词之间是独立的 xff0c 无法通过词的ID来
  • doc2vec计算文档相似度

    doc2vec是基于word2vec的 xff0c word2vec对于计算两个词语的相似度效率比较好 xff0c 修改了word2vec中的cbow和skip gram模型 xff0c paragraph vector直接得到doc向量
  • 多维中维度的理解

    项目有段时间了 xff0c 今天需要做一个需求查询调研 必须要照顾楼下业务人员理解的方式吧多维度表述清楚 还真不好讲 xff1a 原以为维度就是一个基准点 xff0c 一个看事情的角度 xff0c 静下来想 xff0c 要描述出来好像还真不
  • Spring注解

    注解介绍 注解有两个作用 xff1a 标注和注入 标注 xff1a 类路径下自动扫描 xff0c 减少在xml中配置bean 例如 64 Component 64 Service注入 xff1a 自动装配 xff0c 需要类的地方直接加注解
  • akka基础

    基本概念消息传递API 通用API消息传递方式 Future机制Actor生命周期处理状态和错误 监督kill actor生命周期监控和DeathWatch安全重启状态 纵向扩展 Router调度方式使用策略 横向扩展 订阅集群事件启动 退
  • ROS学习(9)自定义移动机器人模型Gazebo仿真

    文章目录 前言一 gazebo启动二 创建编译功能包三 更新xacro文件1 更新robot base xacro2 更新robot camera xacro3 更新robot lidar xacro4 更新robot xacro 四 更新