<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://MineIdea.github.io</id>
    <title>LT&apos;s Blog</title>
    <updated>2020-04-03T08:54:15.307Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://MineIdea.github.io"/>
    <link rel="self" href="https://MineIdea.github.io/atom.xml"/>
    <subtitle>温故而知新</subtitle>
    <logo>https://MineIdea.github.io/images/avatar.png</logo>
    <icon>https://MineIdea.github.io/favicon.ico</icon>
    <rights>All rights reserved 2020, LT&apos;s Blog</rights>
    <entry>
        <title type="html"><![CDATA[turtlebot与gazebo仿真问题]]></title>
        <id>https://MineIdea.github.io/post/turtlebot-yu-gazebo-fang-zhen-wen-ti/</id>
        <link href="https://MineIdea.github.io/post/turtlebot-yu-gazebo-fang-zhen-wen-ti/">
        </link>
        <updated>2020-04-03T08:52:42.000Z</updated>
        <content type="html"><![CDATA[<p>学艺不精，使用turtlebot进行仿真时发现无论如何如何在gazebo都不能运行，我尝试使用mbot和turtlebot3进行gazebo仿真都很顺利，但这使用卡在我心上，在又学了一段时间ros后，我又回头来解决这个问题。</p>
<p>turtlebot不能在gazebo运行的关键原因就在于他的底盘是kobuki，因此我们会安装kobuki的相关资源，这些完成之后应该能操作现实的机器人，但要turtlebot与gazebo交互还差了一个模块：kobuki_gazebo</p>
<h3 id="查找控制插件">查找控制插件</h3>
<p>首先，我们要清楚ros和gazebo是独立的，ros和gazebo交互需要通过gazebo提供的plugin，在turtlebot和mbot中都有以下的plugin</p>
<pre><code>        &lt;!-- controller --&gt;
        &lt;gazebo&gt;
            &lt;plugin name=&quot;differential_drive_controller&quot; 
                    filename=&quot;libgazebo_ros_diff_drive.so&quot;&gt;
                &lt;rosDebugLevel&gt;WARN&lt;/rosDebugLevel&gt;
                &lt;publishWheelTF&gt;true&lt;/publishWheelTF&gt;
                &lt;robotNamespace&gt;/&lt;/robotNamespace&gt;
                &lt;publishTf&gt;1&lt;/publishTf&gt;
		&lt;publishOdomTF&gt;1&lt;/publishOdomTF&gt;
		&lt;odometrySource&gt;world&lt;/odometrySource&gt; &lt;!-- 'encoder' instead of 'world' is also possible --&gt;
                &lt;publishWheelJointState&gt;true&lt;/publishWheelJointState&gt;
                &lt;alwaysOn&gt;true&lt;/alwaysOn&gt;
                &lt;updateRate&gt;100.0&lt;/updateRate&gt;
                &lt;legacyMode&gt;true&lt;/legacyMode&gt;
                &lt;leftJoint&gt;left_wheel_joint&lt;/leftJoint&gt;
                &lt;rightJoint&gt;right_wheel_joint&lt;/rightJoint&gt;
                &lt;wheelSeparation&gt;${wheel_joint_y*2}&lt;/wheelSeparation&gt;
                &lt;wheelDiameter&gt;${2*wheel_radius}&lt;/wheelDiameter&gt;
                &lt;broadcastTF&gt;1&lt;/broadcastTF&gt;
                &lt;wheelTorque&gt;30&lt;/wheelTorque&gt;
                &lt;wheelAcceleration&gt;1.8&lt;/wheelAcceleration&gt;
                &lt;commandTopic&gt;cmd_vel&lt;/commandTopic&gt;
                &lt;odometryFrame&gt;odom&lt;/odometryFrame&gt; 
                &lt;odometryTopic&gt;odom&lt;/odometryTopic&gt; 
                &lt;robotBaseFrame&gt;base_footprint&lt;/robotBaseFrame&gt;
            &lt;/plugin&gt;
</code></pre>
<p>看到注释，我们也清楚这就是controller的功能，他所需要的库为libgazebo_ros_diff_drive.so，这是我们安装ros-full时就存在的，这插件也是控制ros的命令能够让gazebo反馈出来。</p>
<p>接下来我们分析turtlebot</p>
<p>在turtlebot_description/robots/kobuki_hexagons_kinect.urdf.xacro中</p>
<pre><code>  &lt;xacro:include filename=&quot;$(find turtlebot_description)/urdf/turtlebot_common_library.urdf.xacro&quot; /&gt;
  &lt;xacro:include filename=&quot;$(find kobuki_description)/urdf/kobuki.urdf.xacro&quot; /&gt;
  &lt;xacro:include filename=&quot;$(find turtlebot_description)/urdf/stacks/hexagons.urdf.xacro&quot;/&gt;
  &lt;xacro:include filename=&quot;$(find turtlebot_description)/urdf/sensors/kinect.urdf.xacro&quot;/&gt;
</code></pre>
<p>引入了4个xacro文件，其中引入了kobuki.urdf.xacro</p>
<p>在kobuki_description/urdf/kobuki.urdf.xacro中引入了</p>
<pre><code>  &lt;xacro:include filename=&quot;$(find kobuki_description)/urdf/common_properties.urdf.xacro&quot;/&gt;
  &lt;xacro:include filename=&quot;$(find kobuki_description)/urdf/kobuki_gazebo.urdf.xacro&quot;/&gt;
</code></pre>
<p>其中kobuki_gazebo就是与gazebo交互的配置文件</p>
<p>我们找到他的controller</p>
<pre><code>	  &lt;gazebo&gt;
	    &lt;plugin name=&quot;kobuki_controller&quot; filename=&quot;libgazebo_ros_kobuki.so&quot;&gt;
	      &lt;publish_tf&gt;1&lt;/publish_tf&gt;
	      &lt;left_wheel_joint_name&gt;wheel_left_joint&lt;/left_wheel_joint_name&gt;
	      &lt;right_wheel_joint_name&gt;wheel_right_joint&lt;/right_wheel_joint_name&gt;
	      &lt;wheel_separation&gt;.230&lt;/wheel_separation&gt;
	      &lt;wheel_diameter&gt;0.070&lt;/wheel_diameter&gt;
	      &lt;torque&gt;1.0&lt;/torque&gt;
	      &lt;velocity_command_timeout&gt;0.6&lt;/velocity_command_timeout&gt;
	      &lt;cliff_sensor_left_name&gt;cliff_sensor_left&lt;/cliff_sensor_left_name&gt;
	      &lt;cliff_sensor_center_name&gt;cliff_sensor_front&lt;/cliff_sensor_center_name&gt;
	      &lt;cliff_sensor_right_name&gt;cliff_sensor_right&lt;/cliff_sensor_right_name&gt;
	      &lt;cliff_detection_threshold&gt;0.04&lt;/cliff_detection_threshold&gt;
	      &lt;bumper_name&gt;bumpers&lt;/bumper_name&gt;
       	      &lt;imu_name&gt;imu&lt;/imu_name&gt;
	    &lt;/plugin&gt;
	  &lt;/gazebo&gt;
</code></pre>
<p>发现与turtlebot3不同，他的controller使用的插件为libgazebo_ros_robuki.so</p>
<h3 id="安装kobuki_gazebo插件">安装kobuki_gazebo插件</h3>
<p>找到kobuki_gazebo的plugin位置，我一开始以为是插件配置失败，又尝试了很多无用功。我突然想到定位这些库的位置，然后发现</p>
<pre><code>locate libgazebo_ros_kobuki.so
</code></pre>
<p>竟然为空！！！现在结果已经很明确了，因为缺少必要的库，所以无法正常控制turtlebot_gazebo</p>
<p>在搜索之后，我发现kobuki_gazebo的github为</p>
<pre><code>https://github.com/yujinrobot/kobuki_desktop
</code></pre>
<p>下载完并编译成功，我在自己的catkin_ws下找到了 libgazebo_ros_kobuki.so</p>
<p>至此</p>
<pre><code>roslaunch turtlebot_gazebo turtlebot_world.launch

rostopic pub -1 /mobile_base/commands/velocity geometry_msgs/Twist -- '[0.5,0,0]' '[0,0,0]'
</code></pre>
<p>已经可以让turtlebot在gazebo中运动起来</p>
]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[mbot添加bumper]]></title>
        <id>https://MineIdea.github.io/post/mbot-tian-jia-bumper/</id>
        <link href="https://MineIdea.github.io/post/mbot-tian-jia-bumper/">
        </link>
        <updated>2020-04-03T08:47:04.000Z</updated>
        <content type="html"><![CDATA[<p>这里的mbot使用的是古月居课程中创建的mbot，本来也可以用雷达检测碰撞，但是延迟问题我没搞定，看到可以添加bumper来进行碰撞检测，没想到又是一个大坑。</p>
<p>我的问题是 添加了bumper后，即使机器人已经碰撞，但bumper并未输出碰撞信息，我在gazebo answer找到了相似的问题，但由于是Gazebo 7，而我的环境是Gazebo9，添加_collision已经不起作用，只能通过生成sdf来查看base_link的collison name。</p>
<p>以下为对我有帮助的网页连接：</p>
<p>[]: https://answers.ros.org/question/246448/getting-contact-sensorbumper-gazebo-plugin-to-work/<br>
[]: https://answers.gazebosim.org//question/15095/gazebo-contact-sensor-added-to-a-robot-link-in-urdf-file-is-not-working-as-expected/<br>
[]: https://blog.csdn.net/wubaobao1993/article/details/91890839</p>
<p>之后是我的整个操作流程。</p>
<p>操作都是在mbot_description/urdf/xacro/gazebo目录下进行</p>
<figure data-type="image" tabindex="1"><img src="https://MineIdea.github.io/post-images/1585903884200.jpg" alt="" loading="lazy"></figure>
<p>这里我创建一个mbot_with_bumper_gazebo.xacro来测试bumper能否正常使用。</p>
<p>全部代码为</p>
<pre><code>&lt;?xml version=&quot;1.0&quot;?&gt;
&lt;robot name=&quot;arm&quot; xmlns:xacro=&quot;http://www.ros.org/wiki/xacro&quot;&gt;
    &lt;xacro:include filename=&quot;$(find mbot_description)/urdf/xacro/gazebo/mbot_base_gazebo.xacro&quot; /&gt;
	
  &lt;!-- bumper --&gt;
 
  &lt;joint name=&quot;bumper_joint&quot; type=&quot;fixed&quot;&gt;
    &lt;axis xyz=&quot;0 1 0&quot; /&gt;
    &lt;origin xyz=&quot;0.05 0 0.02&quot; rpy=&quot;0 0 0&quot;/&gt;
    &lt;parent link=&quot;base_link&quot;/&gt;
    &lt;child link=&quot;bump_sensor&quot;/&gt;
  &lt;/joint&gt;
 
  &lt;link name=&quot;bump_sensor&quot;&gt;
    &lt;collision name=&quot;bump_sensor_collision&quot;&gt;
      &lt;origin xyz=&quot;0 0 0&quot; rpy=&quot;0 0 0&quot;/&gt;
      &lt;geometry&gt;
        &lt;box size=&quot;0.05 0.05 0.05&quot;/&gt;
      &lt;/geometry&gt;
    &lt;/collision&gt;
 
    &lt;visual&gt;
      &lt;origin xyz=&quot;0 0 0&quot; rpy=&quot;0 0 0&quot;/&gt;
      &lt;geometry&gt;
         &lt;box size=&quot;0.05 0.05 0.05&quot;/&gt;
      &lt;/geometry&gt;
    &lt;/visual&gt;
 
    &lt;inertial&gt;
      &lt;mass value=&quot;1e-5&quot; /&gt;
      &lt;origin xyz=&quot;0 0 0&quot; rpy=&quot;0 0 0&quot;/&gt;
      &lt;inertia ixx=&quot;1e-6&quot; ixy=&quot;0&quot; ixz=&quot;0&quot; iyy=&quot;1e-6&quot; iyz=&quot;0&quot; izz=&quot;1e-6&quot; /&gt;
    &lt;/inertial&gt;
  &lt;/link&gt;
 
    &lt;gazebo reference=&quot;bump_sensor&quot;&gt;
    &lt;sensor name=&quot;main_bumper&quot; type=&quot;contact&quot;&gt;
        &lt;contact&gt;
            &lt;collision&gt;base_footprint_fixed_joint_lump__base_link_collision&lt;/collision&gt;
        &lt;/contact&gt;
	  &lt;plugin name=&quot;gazebo_ros_bumper_controller&quot; filename=&quot;libgazebo_ros_bumper.so&quot;&gt;
	    &lt;alwaysOn&gt;true&lt;/alwaysOn&gt;
	    &lt;updateRate&gt;50&lt;/updateRate&gt;
	    &lt;bumperTopicName&gt;bumper_vals&lt;/bumperTopicName&gt;
	    &lt;frameName&gt;world&lt;/frameName&gt;
	  &lt;/plugin&gt;
    &lt;/sensor&gt;
    &lt;/gazebo&gt;

    &lt;mbot_base_gazebo/&gt;
&lt;/robot&gt;
</code></pre>
<p>我们在mbot_base_gazebo.xacro中定义了基本的mbot，这里只需要导入并添加bumper即可。</p>
<p>但此时bumper并不一定能正常工作，原因就是</p>
<pre><code>        &lt;contact&gt;
            &lt;collision&gt;base_footprint_fixed_joint_lump__base_link_collision&lt;/collision&gt;
        &lt;/contact&gt;
</code></pre>
<p>collison要关联机器人正确的名称，这里我已经通过生成sdf来找到正确名称了。</p>
<p>接下来是找到名称的步骤：</p>
<ol>
<li>rosrun xacro xacro.py -o robot.urdf robot.xacro  //这里的robot.xacro为你的模型名称，在我们这里是mbot_with_bumper_gazebo.xacro</li>
<li>gz sdf -p robot.urdf  &gt; robot.sdf</li>
</ol>
<p>此时目录下已经有robot.sdf文件，我们打开在其中搜索base_link，因为一般机器人主体我们都用base_link来声明。</p>
<figure data-type="image" tabindex="2"><img src="https://MineIdea.github.io/post-images/1585903817019.jpg" alt="" loading="lazy"></figure>
<p>可以看到name是一个自动生成的名称，将name复制输入到collision当中</p>
<pre><code>        &lt;contact&gt;
            &lt;collision&gt;base_footprint_fixed_joint_lump__base_link_collision&lt;/collision&gt;
        &lt;/contact&gt;
</code></pre>
<p>我们打开mbot launch文件</p>
<ol>
<li>rostopic pub -1  /cmd_vel geometry_msgs/Twist -- '[0.1,0,0]' '[0,0,0]'  //让机器人运动起来</li>
<li>rostopic echo -n 1 bumper_vals</li>
</ol>
<p>我们已经可以看到有碰撞信息。</p>
]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[turtlebot添加laser]]></title>
        <id>https://MineIdea.github.io/post/turtlebot-tian-jia-laser/</id>
        <link href="https://MineIdea.github.io/post/turtlebot-tian-jia-laser/">
        </link>
        <updated>2020-03-09T05:53:40.000Z</updated>
        <content type="html"><![CDATA[<pre><code>系统信息: ros-melodic    ubuntu18.04
</code></pre>
<p>在github上直接下载的turtlebot自带了kinect，并且可以使用depthimage_to_laserscan将深度信息转化为雷达信息，因此，如果添加雷达并不是必须的。我只是尝试增加雷达传感器来加深自己对机器人模型的理解。</p>
<p>1.保证你已经下载了必须的turtlebot包。</p>
<figure data-type="image" tabindex="1"><img src="https://MineIdea.github.io/post-images/1583733326591.jpg" alt="" loading="lazy"></figure>
<p>2.使用catkin_make确保已经编译，并source devel/setup.sh</p>
<p>如果编译出现问题，基本都是ros包未下载，根据错误安装对应的ros包。</p>
<pre><code>在bash中输入roslaunch turtlebot_gazebo turtlebot_world.launch
</code></pre>
<p><img src="https://MineIdea.github.io/post-images/1583733372465.jpg" alt="" loading="lazy"><img src="/home/lt/blog/turtlebot_laser/gazebo.jpg" alt="" loading="lazy"></p>
<p>可以打开gazebo并显示出turtlebot以及周围环境，如果有物品未加载</p>
<p>我在打开turtlebot_world的时候，红字报错提示nodelet failed，是因为turtlebot自带kinect，并默认启动depthimage_to_laserscan，因此要下载depthimage_to_laserscan在工作空间。</p>
<p>3.环境正常运行后，我们查看turtlebot_world.launch（如果不了解launch文件和xacro文件，去看一下介绍再继续进行）</p>
<p>这里对机器人进行加载的语句是</p>
<pre><code>&lt;include file=&quot;$(find turtlebot_gazebo)/launch/includes/$(arg base).launch.xml&quot;&gt;
</code></pre>
<p>查看当前目录下的includes的kobuki.launch.xml，发现他使用变量3d_sensor指向了turtlebot/turtlebot_description/robots目录下的xacro文件。</p>
<p>因此，我们在该目录下创建机器人模型，命名为kobuki_hexagons_KinectHokuyo.urdf.xacro</p>
<pre><code>&lt;?xml version=&quot;1.0&quot;?&gt;
&lt;!--
    - Base      : kobuki
    - Stacks    : hexagons
    - 3d Sensor : kinect+hokuyo
--&gt;    
&lt;robot name=&quot;turtlebot&quot; xmlns:xacro=&quot;http://ros.org/wiki/xacro&quot;&gt;

  &lt;xacro:include filename=&quot;$(find turtlebot_description)/urdf/turtlebot_common_library.urdf.xacro&quot; /&gt;
  &lt;xacro:include filename=&quot;$(find kobuki_description)/urdf/kobuki.urdf.xacro&quot; /&gt;
  &lt;xacro:include filename=&quot;$(find turtlebot_description)/urdf/stacks/hexagons.urdf.xacro&quot;/&gt;
  &lt;xacro:include filename=&quot;$(find turtlebot_description)/urdf/sensors/kinect.urdf.xacro&quot;/&gt;
  &lt;xacro:include filename=&quot;$(find turtlebot_description)/urdf/sensors/hokuyo.urdf.xacro&quot;/&gt;
 
  &lt;kobuki/&gt;
  &lt;stack_hexagons parent=&quot;base_link&quot;/&gt;
  &lt;sensor_kinect  parent=&quot;base_link&quot;/&gt;
  &lt;sensor_hokuyo parent=&quot;base_link&quot;/&gt;
&lt;/robot&gt;

</code></pre>
<p>注意，我的改动是在kobuki_hexagons_Kinect.urdf.xacro的基础上增加了一个laser</p>
<pre><code>  &lt;xacro:include filename=&quot;$(find turtlebot_description)/urdf/sensors/hokuyo.urdf.xacro&quot;/&gt;
</code></pre>
<p>之后，由于turtlebot并没有定义hokuyo，我们需要去路径turtlebot_description/urdf/sensors/下建立hokuyo.urdf.xacro urdf文件，配置位置信息。</p>
<pre><code>&lt;?xml version=&quot;1.0&quot;?&gt;  
    &lt;!-- script_version=1.1 --&gt;  
    &lt;robot name=&quot;sensor_hokuyo&quot; xmlns:xacro=&quot;http://ros.org/wiki/xacro&quot;&gt;  
      &lt;xacro:include filename=&quot;$(find turtlebot_description)/urdf/turtlebot_gazebo.urdf.xacro&quot;/&gt;  
      &lt;xacro:include filename=&quot;$(find turtlebot_description)/urdf/turtlebot_properties.urdf.xacro&quot;/&gt;  
      
      &lt;!-- RPLidar 2D LIDAR --&gt;  
      &lt;xacro:macro name=&quot;sensor_hokuyo&quot; params=&quot;parent&quot;&gt;  
        &lt;joint name=&quot;laser&quot; type=&quot;fixed&quot;&gt;  
          &lt;origin xyz=&quot;0.10 0 0.435&quot; rpy=&quot;0 0.0 0.0&quot; /&gt;  
          &lt;parent link=&quot;base_link&quot; /&gt; 
            &lt;child link=&quot;hokuyo_link&quot; /&gt;
        &lt;/joint&gt; 

        &lt;!-- Hokuyo Laser --&gt;
       &lt;link name=&quot;hokuyo_link&quot;&gt;
         &lt;collision&gt;
           &lt;origin xyz=&quot;0 0 0&quot; rpy=&quot;0 0 0&quot;/&gt;
           &lt;geometry&gt;
         &lt;box size=&quot;0.1 0.1 0.1&quot;/&gt;
           &lt;/geometry&gt;
         &lt;/collision&gt;

       &lt;visual&gt;
           &lt;origin xyz=&quot;0 0 0&quot; rpy=&quot;0 0 0&quot;/&gt;
         &lt;geometry&gt;
        &lt;mesh filename=&quot;package://turtlebot_description/meshes/sensors/hokuyo.dae&quot;/&gt;
         &lt;/geometry&gt;
       &lt;/visual&gt;

       &lt;inertial&gt;
           &lt;mass value=&quot;1e-5&quot; /&gt;
         &lt;origin xyz=&quot;0 0 0&quot; rpy=&quot;0 0 0&quot;/&gt;
        &lt;inertia ixx=&quot;1e-6&quot; ixy=&quot;0&quot; ixz=&quot;0&quot; iyy=&quot;1e-6&quot; iyz=&quot;0&quot; izz=&quot;1e-6&quot; /&gt;
        &lt;/inertial&gt;
       &lt;/link&gt;

        &lt;!-- Set up laser gazebo details --&gt;  
        &lt;turtlebot_sim_2dsensor/&gt;
      &lt;/xacro:macro&gt;  
&lt;/robot&gt;  
</code></pre>
<p>代码中</p>
<pre><code>&lt;mesh filename=&quot;package://turtlebot_description/meshes/sensors/hokuyo.dae&quot;/&gt;
</code></pre>
<p>使用到了hokuyo.dae文件，这在我们预先下载的模型中可以找到。</p>
<pre><code>~/.gazebo/models/hokuyo/meshes/hokuyo.dae
</code></pre>
<p>将其复制到turtlebot_description/meshes/sensors/目录下。</p>
<p>4.在turtlebot_description/urdf/turtlebot_gazebo.urdf.xacro文件下添加配置laser在gazebo下的属性值插件配置，将以下代码插入文件中</p>
<pre><code>&lt;xacro:macro name=&quot;turtlebot_sim_2dsensor&quot;&gt;
 &lt;gazebo reference=&quot;hokuyo_link&quot;&gt;
        &lt;sensor type=&quot;ray&quot; name=&quot;head_hokuyo_sensor&quot;&gt;
          &lt;pose&gt;0 0 0 0 0 0&lt;/pose&gt;
          &lt;visualize&gt;false&lt;/visualize&gt;
          &lt;update_rate&gt;40&lt;/update_rate&gt;
          &lt;ray&gt;
            &lt;scan&gt;
              &lt;horizontal&gt;
                &lt;samples&gt;720&lt;/samples&gt;
                &lt;resolution&gt;1&lt;/resolution&gt;
                &lt;min_angle&gt;-1.570796&lt;/min_angle&gt;
                &lt;max_angle&gt;1.570796&lt;/max_angle&gt;
              &lt;/horizontal&gt;
            &lt;/scan&gt;
            &lt;range&gt;
              &lt;min&gt;0.10&lt;/min&gt;
              &lt;max&gt;30.0&lt;/max&gt;
              &lt;resolution&gt;0.01&lt;/resolution&gt;
            &lt;/range&gt;
            &lt;noise&gt;
              &lt;type&gt;gaussian&lt;/type&gt;
           
               &lt;mean&gt;0.0&lt;/mean&gt;
              &lt;stddev&gt;0.01&lt;/stddev&gt;
            &lt;/noise&gt;
          &lt;/ray&gt;
            &lt;plugin name=&quot;gazebo_ros_head_hokuyo_controller&quot; filename=&quot;libgazebo_ros_laser.so&quot;&gt;
            &lt;topicName&gt;/turtlebot/laser/scan&lt;/topicName&gt;
            &lt;frameName&gt;hokuyo_link&lt;/frameName&gt;
        &lt;/plugin&gt;
        &lt;/sensor&gt;
      &lt;/gazebo&gt;
  &lt;/xacro:macro&gt;
</code></pre>
<p>topicName标签定义了laser信息发布节点为/turtlebot/laser/scan</p>
<p>5.配置完成，由于launch文件根据env定义的变量来加载模型，我们需要在~/.bashrc中添加</p>
<pre><code>export  TURTLEBOT_3D_SENSOR=KinectHokuyo
</code></pre>
<p>将加载的模型指向我们增加的机器人文件</p>
<p>6.运行</p>
<pre><code> roslaunch turtlebot_gazebo turtlebot_world.launch
 // 查看topic
 rostopic list
</code></pre>
<p>可以看到/turtlebot/laser/scan已经发布</p>
<pre><code>roslaunch turtlebot_rviz_launchers view_navigation.launch
</code></pre>
<p>将global options的Fixed Frame从map改为其他</p>
<p>把LaserScan订阅的节点改为/turtlebot/laser/scan，可以看到由深度图形转换的雷达信息没有本身雷达得到的信息丰富，也算是对的起我们的一番折腾了。</p>
]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[剪绳子]]></title>
        <id>https://MineIdea.github.io/post/cut_rope/</id>
        <link href="https://MineIdea.github.io/post/cut_rope/">
        </link>
        <updated>2020-02-23T15:02:18.000Z</updated>
        <content type="html"><![CDATA[<h2 id="题目描述">题目描述</h2>
<p>给你一根长度为n的绳子，请把绳子剪成整数长的m段（m、n都是整数，n&gt;1并且m&gt;1），每段绳子的长度记为k[0],k[1],...,k[m]。请问k[0]xk[1]x...xk[m]可能的最大乘积是多少？例如，当绳子的长度是8时，我们把它剪成长度分别为2、3、3的三段，此时得到的最大乘积是18。</p>
<h2 id="输入描述">输入描述:</h2>
<pre><code>输入一个数n，意义见题面。（2 &lt;= n &lt;= 60）
</code></pre>
<h2 id="输出描述">输出描述:</h2>
<pre><code>输出答案。
</code></pre>
<p>示例1</p>
<h2 id="输入">输入</h2>
<pre><code>8
</code></pre>
<h2 id="输出">输出</h2>
<pre><code>18
</code></pre>
<p>我看到题目的第一想法就是递归，首先考虑一下特殊情况，当n=1、2、3时，最大乘积分别为1,1,2<br>
n=4也是特殊情况，可以分成2*2，最大乘积为4。n&gt;4时，将绳子分割一定大于本身长度，简单证明一下:</p>
<p class='katex-block'><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>2</mn><mo>∗</mo><mo>(</mo><mi>n</mi><mo>−</mo><mn>2</mn><mo>)</mo><mo>−</mo><mi>n</mi><mo>=</mo><mi>n</mi><mo>−</mo><mn>4</mn><mo>&gt;</mo><mn>0</mn><mo>(</mo><mi>n</mi><mo>&gt;</mo><mn>4</mn><mo>)</mo></mrow><annotation encoding="application/x-tex">2*(n-2) - n = n-4 &gt; 0 (n&gt;4)
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">2</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault">n</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">2</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">n</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">n</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.68354em;vertical-align:-0.0391em;"></span><span class="mord">4</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">0</span><span class="mopen">(</span><span class="mord mathdefault">n</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">4</span><span class="mclose">)</span></span></span></span></span></p>
<p>因此n&gt;4之后都需要将绳子分成若干个2和3的长度，只需要比较是2 * cutRope(n-2)大，还是3 * cutRope(n-3)大。</p>
<p>但要注意一点，我们在绳子长度大于3时，要阻止程序对绳子长度为2、3进行进一步分割，使用Math.max就可以让绳子在长度为2、3时停止分割。</p>
<pre><code class="language-java">import java.lang.Math;
public class Solution {
    public int cutRope(int target) {
        if (target &lt; 4) {
            return target - 1;
        }
        return Math.max(2*Math.max(target-2,cutRope(target-2)),
                                  3*Math.max(target-3,cutRope(target-3)));
    }
}
</code></pre>
]]></content>
    </entry>
</feed>