搭建自己的仿真环境和机器人(turtlebot2+velodyne)(一)_file://$(find claw_description)-程序员宅基地

技术标签: slam  

1.launch启动文件

启动文件(launch File) 是ros中一种同时启动多个节点的途径,它还可以自动启动ROS Master 节点管理器,并且可以实现每个节点的各种配置,为多个节点的操作提供很大便利。
这是一个简单而完整的launch文件,采用XML的形式进行描述,包含一个根元素launch标签和两个节点元素node标签:

<launch>
    <node pkg="turtlesim" name="siml" type="turtlesim_node"/>
    <node pkg="turtlesim" name"sim2" type="turtlesim_node"/>
</launch>
node标签

启动文件的核心是启动节点,采用node标签定义:

<node pkg="package-name" type="executable-name" name="node-name"/>

name属性用来定义节点运行的名称,将覆盖节点中init()赋予节点的名称。以上三个是最常用的属性。

参数设置

两个参数,一个是parameter,另一个是argument
1.parameter
parameter是ROS系统运行中的参数,存储在参数服务器中。每个活跃节点都可以通过ros::param::get()接口来获取parameter的值,用户也可以在终端通过rosparam命令获得parameter的值。

<param name="output_frame" value="odom"/>

运行launch文件后,output_frame这个parameter的值就设置为odom,并且加载在参数服务器上列。ROS也给我们提供列另外一类似的参数(rosparam)加载方式:

<rosparam file="${find 2dnav_pr2}/config/costmap_common_params.yaml" command="load" ns="local_costmap"/>

rosparam可以帮助我们将一个YAML格式文件中的参数全部加载到ros参数服务器中,需要设置command为load,还可以选择命名空间ns。
2.argument
argument是另外一个概念,类似于launch文件内部的局部变量,仅限于launch文件使用,便于launch文件的重构,与ROS节点内部的实现没有关系。

<arg name="arg-name" default="arg-value">

launch文件中需要使用argument时,可以使用如下方式调用:

<param name="foo" value="$(arg arg-name)"/>
<node name="node" pkg="package" type="type" args="$(arg arg-name)"/> 
重映射机制

ros提供一种重映射机制,简单来说就是取别名,类似与c++中的别名机制,我们不需要修改别人的功能包接口,只需要将接口名字重映射一下,取一个别的名字,我们的系统就认识了(接口的数据类型必须相同)。launch文件中的remap标签可以帮助我们实现这个功能。
比如turtlebot的键盘控制节点发布的速度控制指令话题可能是/turtlebot/cmd_vel,但是我们自己机器人订阅的速度控制话题是/cmd_vel,这时使用remap就可以轻松解决问题。

<remap from="turtlebot/cmd_vel" to="cmd_vel"/>
嵌套复用

在复杂的系统中,launch文件往往有很多,这些launch文件之间也会存在依赖关系。如过要直接复用一个已有launch文件中的内容,可以使用include标签包含其他launch文件,这与c语言中的include几乎是一样的。

<include file="$(diename)/other.launch"/>

roslaunch turtlebot_gazebo turtlebot_world.launch中的turtlebot_world.launch文件(opt/ros/kinetic/share/turtlebot_gazebo/launch)如下:

<launch>
  <arg name="world_file"  default="$(env TURTLEBOT_GAZEBO_WORLD_FILE)"/>
<!--参数名为 world_file 默认值为 TURTLEBOT_GAZEBO_WORLD_FILE-->
<!--配置一些参数-->
  <arg name="base"      value="$(optenv TURTLEBOT_BASE kobuki)"/>
   <!-- create, roomba(传感器?)  kobuki(机器人移动底盘)-->
  <arg name="battery"   value="$(optenv TURTLEBOT_BATTERY /proc/acpi/battery/BAT0)"/> 
   <!--一般linux的硬件信息都 在/proc里面 /proc/acpi/battery/BAT0  ,为在这个文件夹下面没有找到,在/sys/class/power_supply/BAT0找到,不知道是不是--> 
  <arg name="gui" default="true"/>
  <arg name="stacks"    value="$(optenv TURTLEBOT_STACKS hexagons)"/> 
   <!-- circles, hexagons(六变形),底盘形状? --> 
  <arg name="3d_sensor" value="$(optenv TURTLEBOT_3D_SENSOR kinect)"/> 
   <!-- kinect, asus_xtion_pro(体感摄像头) --> 
  
<!--在Gazebo中启动world,empty_world.launch -->

  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <arg name="use_sim_time" value="true"/>
    <arg name="debug" value="false"/>
    <arg name="gui" value="$(arg gui)" />
    <arg name="world_name" value="$(arg world_file)"/>
  </include>
  
  <!--机器人描述文件 -->
  
  <include file="$(find turtlebot_gazebo)/launch/includes/$(arg base).launch.xml">
  <!--看kobuki.launch.xml(base默认为kobuki) 文件-->
  <!-- $(find package_name)这里是一个调用ROS外部包的写法,意思$(arg base).launch.xml文件是在turtlebot_gazebo这个ROSpackage下面的。但是在</include>之前还有很多arg标签,这个是专门为所引xml文件配置参数的用法。-->
  
    <arg name="base" value="$(arg base)"/>
    <arg name="stacks" value="$(arg stacks)"/>
    <arg name="3d_sensor" value="$(arg 3d_sensor)"/>
    <!-- 名字为3d_sensor value指定了它的赋值,此地是调用前面 arg name="3d_sensor" 的argument的值 采用了$ 符号。-->
  </include>
  
  <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher">
    <param name="publish_frequency" type="double" value="30.0" />
  </node>
 <!--深度图像到laser scan --> 
  <!-- Fake laser -->
  <node pkg="nodelet" type="nodelet" name="laserscan_nodelet_manager" args="manager"/>
  <node pkg="nodelet" type="nodelet" name="depthimage_to_laserscan"
        args="load depthimage_to_laserscan/DepthImageToLaserScanNodelet laserscan_nodelet_manager">
    <param name="scan_height" value="10"/>
    <param name="output_frame_id" value="/camera_depth_frame"/>
    <param name="range_min" value="0.45"/>
    <remap from="image" to="/camera/depth/image_raw"/>
    <remap from="scan" to="/scan"/>
    <!--remap parameter重映射参数标签,就是重新映射一下node运行时的参数名-->
  </node>
</launch>

roslaunch 读取launch文件的时候,顺序的读取。include标签被最先处理,其它的标签全都按顺序读取,所以对于同一个参数,如果有重复定义,最后的参数生效。
$(env ENVIRONMENT_VARIABLE) 由当前环境变量来代替参数值,如果没有设置当前变量,则会失败

$(optenv ENVIRONMENT_VARIABLE default_value) 参数值为设置的环境变量,如果 default_value设置了就使用default_value为参数值

hokuyo是日本产的北阳激光雷达
kobuki.launch.xml文件

<launch>
  <arg name="base"/>
  <arg name="stacks"/>
  <arg name="3d_sensor"/>
  
  <arg name="urdf_file" default="$(find xacro)/xacro.py '$(find turtlebot_description)/robots/$(arg base)_$(arg stacks)_$(arg 3d_sensor).urdf.xacro'" />
  <param name="robot_description" command="$(arg urdf_file)" />
  
  <!-- Gazebo model spawner -->
  <node name="spawn_turtlebot_model" pkg="gazebo_ros" type="spawn_model"
        args="$(optenv ROBOT_INITIAL_POSE) -unpause -urdf -param robot_description -model mobile_base"/>
  
  <!-- Velocity muxer(调速器?) -->
  <node pkg="nodelet" type="nodelet" name="mobile_base_nodelet_manager" args="manager"/>
  <node pkg="nodelet" type="nodelet" name="cmd_vel_mux"
        args="load yocs_cmd_vel_mux/CmdVelMuxNodelet mobile_base_nodelet_manager">
    <param name="yaml_cfg_file" value="$(find turtlebot_bringup)/param/mux.yaml" />
    <remap from="cmd_vel_mux/output" to="mobile_base/commands/velocity"/>
  </node>

  <!-- Bumper/cliff to pointcloud (not working, as it needs sensors/core messages) -->
  <include file="$(find turtlebot_bringup)/launch/includes/kobuki/bumper2pc.launch.xml"/>
</launch>

xacro优化URDF

  • 精简模型代码: xacro 是一个精简版本的URDF文件,在xacro文件中,可以通过创建宏定义的方式定义常量或者复用代码,不仅可以减少代码量,而且可以让模型代码更加模块化,更具可读性。
  • 提供可编程接口: xacro 的语法支持一些可编程接口,如常量,变量,数学公式,条件语句等,可以让建模过程更加智能有效。
    xacro是URDF的升级版,模型文件的后缀名由.urdf变为.xacro,而且在模型robot标签中要加入xacro声明。
<?xml version="1.0"?>
 <robot name="turtlebot" xmlns:xacro="http://ros.org/wiki/xacro">

kokuki_hexagons_kinetic.urdf.xacro:

<?xml version="1.0"?>
<!--
    - Base      : kobuki
    - Stacks    : hexagons
    - 3d Sensor : kinect
-->    
<robot name="turtlebot" xmlns:xacro="http://ros.org/wiki/xacro">

  <xacro:include filename="$(find turtlebot_description)/urdf/turtlebot_common_library.urdf.xacro" />
  <xacro:include filename="$(find kobuki_description)/urdf/kobuki.urdf.xacro" />
  <xacro:include filename="$(find turtlebot_description)/urdf/stacks/hexagons.urdf.xacro"/>
  <xacro:include filename="$(find turtlebot_description)/urdf/sensors/kinect.urdf.xacro"/>
  
  <kobuki/>
  <stack_hexagons parent="base_link"/>
  <sensor_kinect  parent="base_link"/>
</robot>

xacro文件设计完成之后,可以通过两种方式将优化后的模型显示在rviz中:
1.将xacro文件转换成URDF文件

rosrun xacro xacro.py  mrobot.urdf.xacro > mrobot.urdf

2.直接调用xacro文件解析器,自动将xacro转换成URDF文件,该过程在launch文件中使用下列语句进行配置:

<arg name="model" default="$(find xacro)/xacro --inorder '$(find mrobot_description)/urdf/mrobot.urdf.xacro'"/>
<param name="robot_description" command="$(arg model)"/>

2.机器人建模

考虑如何设计一个自己的机器人

1.URDF

URDF(unified robot description format,统一机器人描述格式)是ROS中机器人模型的描述格式,包含对机器人刚体外观,物理属性,关节类型等方面的描述。

ros同时也提供URDF文件的C++解析器,可以解析URDF文件中使用XML格式描述的机器人模型。

机器人模型中还可以添加gazebo标签,实现传感器,传动机构等环节的仿真功能

2.ROS中给turtlebot加两个传感器:kinect+Velodyne步骤:

Velodyne 三维激光雷达仿真模型:

git clone https://bitbucket.org/DataspeedInc/velodyne_simulator.git

1.首先看 roslaunch turtlebot_gazebo turtlebot_world.launch命令中turtlebot_world.launch的文件

<arg name="3d_sensor" value="$(optenv TURTLEBOT_3D_SENSOR kinect)"/>  <!-- kinect, asus_xtion_pro --> 
改为<arg name="3d_sensor" value="$(optenv TURTLEBOT_3D_SENSOR KinectVelodyne)"/>  <!-- kinect, asus_xtion_pro --> 

2.在/turtlebot/turtlebot_description/robots 路径下,建立相应的urdf文件:kobuki_hexagons_KinectVelodyne.urdf.xacro

<?xml version="1.0"?>
<!--
    - Base      : kobuki
    - Stacks    : hexagons
    - 3d Sensor : kinect+velodyne
-->    
<robot name="turtlebot" xmlns:xacro="http://ros.org/wiki/xacro">

  <!--<xacro:include filename="$(find turtlebot_description)/urdf/turtlebot_common_library.urdf.xacro" />-->
  <xacro:include filename="$(find turtlebot_description)/urdf/turtlebot_library.urdf.xacro" />
  <xacro:include filename="$(find kobuki_description)/urdf/kobuki.urdf.xacro" />
  <xacro:include filename="$(find turtlebot_description)/urdf/stacks/hexagons.urdf.xacro"/>
  <xacro:include filename="$(find turtlebot_description)/urdf/sensors/kinect.urdf.xacro"/>
  <xacro:include filename="$(find turtlebot_description)/urdf/sensors/VLP-16.urdf.xacro"/>

  <kobuki/>
  <stack_hexagons parent="base_link"/>
  <sensor_kinect  parent="base_link"/>
  <sensor_velodyne parent="base_link"/>

</robot>

3.进入文件turtlebot_description/urdf/turtlebot_library.urdf.xacro添加VLP-16的urdf文件

 <xacro:include filename="$(find turtlebot_description)/urdf/sensors/VLP-16.urdf.xacro"/>

4.在路径turtlebot_description/urdf/sensors/下建立VLP-16.urdf.xacro 文件,配置位置信息。

<?xml version="1.0"?>

<robot xmlns:xacro="http://ros.org/wiki/xacro" name="sensor_velodyne">

  <xacro:property name="M_PI" value="3.1415926535897931" />

    <xacro:include filename="$(find turtlebot_description)/urdf/turtlebot_gazebo.urdf.xacro"/>  
      <xacro:include filename="$(find turtlebot_description)/urdf/turtlebot_properties.urdf.xacro"/>  

  <xacro:macro name="sensor_velodyne" params=" parent:=base_link name:=velodyne topic:=/velodyne_points hz:=10 lasers:=16 samples:=1875 collision_range:=0.3 min_range:=0.9 max_range:=130.0 noise:=0.008 min_angle:=-${M_PI} max_angle:=${M_PI} gpu:=false">
  
  <!-- Base link is the center of the robot's bottom plate -->
  <!-- Base footprint is on the ground under the robot -->
  
    <joint name="${name}_base_mount_joint" type="fixed">
      <!--xacro:insert_block name="origin" /--> 
      <parent link="${parent}"/>
      <child link="${name}_base_link"/>
      <origin xyz="0.0 0.0 0.4" rpy="0 0 0"/>
    </joint>

    <link name="${name}_base_link">
      <inertial>
        <mass value="0.83"/>
        <origin xyz="0 0 0.03585"/>
        <inertia ixx="${(0.83 * (3.0*0.0516*0.0516 + 0.0717*0.0717)) / 12.0}" ixy="0" ixz="0"
          iyy="${(0.83 * (3.0*0.0516*0.0516 + 0.0717*0.0717)) / 12.0}" iyz="0"
          izz="${0.5 * 0.83 * (0.0516*0.0516)}"/>
      </inertial>
      <visual>
        <geometry>
          <mesh filename="package://turtlebot_description/meshes/sensors/VLP16_base_1.dae" />
        </geometry>
      </visual>
      <visual>
        <geometry>
          <mesh filename="package://turtlebot_description/meshes/sensors/VLP16_base_2.dae" />
        </geometry>
      </visual>
      <collision>
        <origin rpy="0 0 0" xyz="0 0 0.03585"/>
        <geometry>
          <cylinder radius="0.0516" length="0.0717"/>
        </geometry>
      </collision>
    </link>

    <joint name="${name}_base_scan_joint" type="fixed" >
      <origin xyz="0 0 0.0377" rpy="0 0 0" />
      <parent link="${name}_base_link" />
      <child link="${name}"/>
    </joint>

    <link name="${name}">
      <inertial>
        <mass value="0.01"/>
        <origin xyz="0 0 0"/>
        <inertia ixx="1e-7" ixy="0" ixz="0" iyy="1e-7" iyz="0" izz="1e-7"/>
      </inertial>
      <visual>
        <origin xyz="0 0 -0.0377" />
        <geometry>
          <mesh filename="package://turtlebot_description/meshes/sensors/VLP16_scan.dae" />
        </geometry>
      </visual>
    </link>

   <!-- Set up laser gazebo details -->  
        <turtlebot_sim_3dsensor2/>
   
  </xacro:macro>
</robot>

注意:

package://turtlebot_description/meshes/sensors/VLP16_base_1.dae
package://turtlebot_description/meshes/sensors/VLP16_base_2.dae
package://turtlebot_description/meshes/sensors/VLP16_scan.dae

VLP16_base_1.dae,VLP16_base_2.dae,VLP16_scan.dae三维模型文件,这个文件要自己下载,可先下载模型包,找到VLP16的模型包,再把包里的相应文件复制到上述路径。模型包下载方式上面已经给出。

gazebo常用插件

如果要在gazebo中进行物理环境仿真,需要在URDF文件中加入一些gazebo相关标签。
在gazebo中可以通过插入一些插件,来仿真机器人传感器,执行器的特性,这些插件通过gazebo元素中的plugin标签描述,使用如下格式加入到URDF中

<gazebo>
<plugin name="differential_drive_controller" filename="libdiffdrive_plugin.so">
...plugin parameters...
</plugin>
</gazebo>

//differential_drive_controller 差速驱动
这些插件常常需要附着于机器人的某个部分,比如要加入一个激光传感器的插件,那么我们需要将这个插件与机器人模型中的激光传感器link绑定

<gazebo reference="your_link_name">
<plugin name="your_link_laser_controller" filename="libgazebo_ros_laser.so">
...plugin parameters...
</plugin>
</gazebo>

5.在turtlebot_description/urdf/turtlebot_gazebo.urdf.xacro文件下添加配置laser在gazebo下的属性值插件配置。

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

  

  <!-- Microsoft Kinect / ASUS Xtion PRO Live for simulation -->
  <xacro:macro name="turtlebot_sim_3dsensor">

    <gazebo reference="camera_link">  
      <sensor type="depth" name="camera">
        <always_on>true</always_on>
        <update_rate>20.0</update_rate>
        <camera>
          <horizontal_fov>${
    60.0*M_PI/180.0}</horizontal_fov>
          <image>
            <format>B8G8R8</format>
            <width>640</width>
            <height>480</height>
          </image>
          <clip>
            <near>0.05</near>
            <far>8.0</far>
          </clip>
        </camera>
        <plugin name="kinect_camera_controller" filename="libgazebo_ros_openni_kinect.so">
          <cameraName>camera</cameraName>
          <alwaysOn>true</alwaysOn>
          <updateRate>10</updateRate>
          <imageTopicName>rgb/image_raw</imageTopicName>
          <depthImageTopicName>depth/image_raw</depthImageTopicName>
          <pointCloudTopicName>depth/points</pointCloudTopicName>
          <cameraInfoTopicName>rgb/camera_info</cameraInfoTopicName>
          <depthImageCameraInfoTopicName>depth/camera_info</depthImageCameraInfoTopicName>
          <frameName>camera_depth_optical_frame</frameName>
          <baseline>0.1</baseline>
          <distortion_k1>0.0</distortion_k1>
          <distortion_k2>0.0</distortion_k2>
          <distortion_k3>0.0</distortion_k3>
          <distortion_t1>0.0</distortion_t1>
          <distortion_t2>0.0</distortion_t2>
          <pointCloudCutoff>0.4</pointCloudCutoff>
        </plugin>
      </sensor>
    </gazebo>
 
  </xacro:macro>
         <!-- Set up laser gazebo details -->  
 <!-- Gazebo requires the velodyne_gazebo_plugins package 添加gazebo插件-->
<xacro:property name="M_PI" value="3.1415926535897931" />
 <xacro:macro name="turtlebot_sim_3dsensor2">
  <gazebo reference="velodyne_base_link">
      <xacro:if value="false">
        <sensor type="gpu_ray" name="velodyne-VLP16">
          <pose>0 0 0 0 0 0</pose>
          <visualize>false</visualize>
          <update_rate>10</update_rate>
          <ray>
            <scan>
              <horizontal>
                <samples>1875</samples>
                <resolution>1</resolution>
                <min_angle>-${
    M_PI}</min_angle>
                <max_angle>${
    M_PI}</max_angle>
              </horizontal>
              <vertical>
                <samples>16</samples>
                <resolution>1</resolution>
                <min_angle>-${
    15.0*M_PI/180.0}</min_angle>
                <max_angle> ${
    15.0*M_PI/180.0}</max_angle>
              </vertical>
            </scan>
            <range>
              <min>0.3</min>
              <max>131.0</max>
              <resolution>0.001</resolution>
            </range>
            <noise>
              <type>gaussian</type>
              <mean>0.0</mean>
              <stddev>0.0</stddev>
            </noise>
          </ray>
          <plugin name="gazebo_ros_laser_controller" filename="libgazebo_ros_velodyne_gpu_laser.so">
            <topicName>/velodyne_points</topicName>
            <frameName>velodyne</frameName>
            <min_range>0.9</min_range>
            <max_range>130.0</max_range>
            <gaussianNoise>0.008</gaussianNoise>
          </plugin>
        </sensor>
      </xacro:if>
      <xacro:unless value="false">
        <sensor type="ray" name="velodyne-VLP16">
          <pose>0 0 0 0 0 0</pose>
          <visualize>false</visualize>
          <update_rate>10</update_rate>
          <ray>
            <scan>
              <horizontal>
                <samples>1875</samples>
                <resolution>1</resolution>
                <min_angle>-${
    M_PI}</min_angle>
                <max_angle>${
    M_PI}</max_angle>
              </horizontal>
              <vertical>
                <samples>16</samples>
                <resolution>1</resolution>
                <min_angle>-${
    15.0*M_PI/180.0}</min_angle>
                <max_angle> ${
    15.0*M_PI/180.0}</max_angle>
              </vertical>
            </scan>
            <range>
              <min>0.3</min>
              <max>131.0</max>
              <resolution>0.001</resolution>
            </range>
            <noise>
              <type>gaussian</type>
              <mean>0.0</mean>
              <stddev>0.0</stddev>
            </noise>
          </ray>
          <plugin name="gazebo_ros_laser_controller" filename="libgazebo_ros_velodyne_laser.so">
            <topicName>/velodyne_points</topicName>
            <frameName>velodyne</frameName>
            <min_range>0.9</min_range>
            <max_range>130.0</max_range>
            <gaussianNoise>0.008</gaussianNoise>
          </plugin>
        </sensor>
      </xacro:unless>
    </gazebo>
        </xacro:macro>
 </robot>

此处数据发布在/velodyne_points中的/velodyne_points主题上,和kinect发布数据的/scan主题不同
利用下述命令可以看到数据,同样用rostopic list可以看到两个主题, /scan和/turtlebot/laser/scan。

$   rostopic echo /velodyne_points
$   rostopic echo /

此处存在疑问???

WARNING: topic [/velodyne_points] does not appear to be published yet

6.环境变量加入
打开命令窗口输入:$ gedit ~/.bashrc,添加下述命令到文件尾:

export  TURTLEBOT_BASE=kobuki  

export  TURTLEBOT_STACKS=hexagons

export  TURTLEBOT_3D_SENSOR=KinectVelodyne

7.运行

 roslaunch turtlebot_gazebo turtlebot_world.launch

上面的所有程序为更改错误后成功运行的程序
下面的错误是在更改程序过程中遇到过的错误
若出现错误:

No such file or directory: /opt/ros/kinetic/share/turtlebot_description/robots/kobuki_hexagons_KinectVelodyne.urdf.xacro None None
while processing /opt/ros/kinetic/share/turtlebot_gazebo/launch/includes/kobuki.launch.xml:

解决方法:
ubuntu会先执行自己工作空间里的,没有的话再去根目录找,所以一定要保证自己的工作空间Source了
更改后执行:

roslaunch turtlebot_gazebo turtlebot_world.launch

error:

 while processing /home/yufanjiang/mrobot_velodyne_ws/src/turtlebot_gazebo/launch/includes/kobuki.launch.xml:
Invalid <param> tag: Cannot load command parameter [robot_description]: command [/opt/ros/kinetic/share/xacro/xacro.py '/home/yufanjiang/mrobot_velodyne_ws/src/turtlebot/turtlebot_description/robots/kobuki_hexagons_KinectVelodyne.urdf.xacro'] returned with code [2]. 
Param xml is <param command="$(arg urdf_file)" name="robot_description"/>
The traceback for the exception was written to the log file

网上查找原因是:调用xacro文件解析器 ,由于xacro转换失败,所以生成器只是在robot_description中找不到任何urdf。

检查kobuki_hexagons_KinectVelodyne.urdf.xacro文件:

 rosrun xacro xacro.py /home/yufanjiang/mrobot_velodyne_ws/src/turtlebot/turtlebot_description/robots/kobuki_hexagons_KinectVelodyne.urdf.xacro

error:

 old: http://www.ros.org/wiki/xacro
 new: http://ros.org/wiki/xacro (/home/yufanjiang/mrobot_velodyne_ws/src/turtlebot/turtlebot_description/urdf/sensors/kinect.urdf.xacro)
Not enough blocks None None
when instantiating macro: sensor_velodyne (/home/yufanjiang/mrobot_velodyne_ws/src/turtlebot/turtlebot_description/robots/kobuki_hexagons_KinectVelodyne.urdf.xacro)
instantiated from: turtlebot_sim_3dsensor (/home/yufanjiang/mrobot_velodyne_ws/src/turtlebot/turtlebot_description/robots/kobuki_hexagons_KinectVelodyne.urdf.xacro)
instantiated from: sensor_kinect (/home/yufanjiang/mrobot_velodyne_ws/src/turtlebot/turtlebot_description/robots/kobuki_hexagons_KinectVelodyne.urdf.xacro)
in file: /home/yufanjiang/mrobot_velodyne_ws/src/turtlebot/turtlebot_description/robots/kobuki_hexagons_KinectVelodyne.urdf.xacro

好像是文件中的宏定义出现了问题,导致文件转换失败?
解决:
好像是宏实例化的时候,参数赋值不全 *origin的问题好像是。

rosrun xacro xacro.py /home/yufanjiang/mrobot_velodyne_ws/src/turtlebot/turtlebot_description/urdf/sensors/VLP-16.urdf.xacro

error:

xacro: Traditional processing is deprecated. Switch to --inorder processing!
To check for compatibility of your document, use option --check-order.
For more infos, see http://wiki.ros.org/xacro#Processing_Order
inconsistent namespace redefinitions for xmlns:xacro:
 old: http://www.ros.org/wiki/xacro
 new: http://ros.org/wiki/xacro (/home/yufanjiang/mrobot_velodyne_ws/src/turtlebot/turtlebot_description/urdf/turtlebot_gazebo.urdf.xacro)
inconsistent namespace redefinitions for xmlns:xacro:
 old: http://www.ros.org/wiki/xacro
 new: http://ros.org/wiki/xacro (/home/yufanjiang/mrobot_velodyne_ws/src/turtlebot/turtlebot_description/urdf/turtlebot_properties.urdf.xacro)

解决:一些文件中的空间是 http://www.ros.org/wiki/xacro一些是http://ros.org/wiki/xacro ,将http://www.ros.org/wiki/xacro改为http://ros.org/wiki/xacro
未解决警告:

xacro: Traditional processing is deprecated. Switch to --inorder processing!
To check for compatibility of your document, use option --check-order.
For more infos, see http://wiki.ros.org/xacro#Processing_Order
xacro.py is deprecated; please use xacro instead

2019.12.27 23:44 成功 数据还未测试
在这里插入图片描述
参考文献:
<<ROS机器人开发实践>>
ROS进阶学习手记 10 - 搭建自己的TurtleBot(2)- Using iRobot Roomba as the Driving Base
roslaunch xml tag
ros中launch文件的使用
ROS中给turtlebot加两个传感器:kinect+hokuyo,进行gazebo仿真(一)
ROS中给turtlebot加两个传感器:kinect+hokuyo,进行gazebo仿真(二)
ROS中文件解读
Turtlebot代码解读-Turtlebot-turtlebot_description
ROS官方教程[翻译]—xacro的介绍与使用
rviz中添加kinect2的模型
ROS kinetic xacro模型文件
Gazebo: Invalid tag: Cannot load command parameter [robot_description]
在机器人仿真环境gazebo中加入新的velodyne传感器

我写的不是程序,是bug。优雅的失控

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_37417682/article/details/103654136

智能推荐

WGS84,GCJ02, BD09坐标转换-程序员宅基地

文章浏览阅读119次。public class Gps { private double wgLat; private double wgLon; public Gps(double wgLat, double wgLon) { setWgLat(wgLat); setWgLon(wgLon); } public double getWg..._bd0911转wgs84坐标系

vue在app.vue里面写部分页面公共-程序员宅基地

文章浏览阅读5k次。遇到的问题有一个公共头部和底部,vue搭建的框架,在app.vue里写的公共方法,首页是个登录页面,不需要公共部分,在这基础上进行公共部分的显示隐藏。在app.vue里面进行判断在不需要的页面里面设成false..._公共页面el-container 文件直接写在app.vue下可以吗

axios二次封装_axios二次封装 json转换为字符-程序员宅基地

文章浏览阅读101次。axios是一个promise实现的http库,符合最新的ES规范_axios二次封装 json转换为字符

第一站小红书图片裁剪控件,深度解析大厂炫酷控件-程序员宅基地

文章浏览阅读238次。先来看两张效果图:哈哈,就是这样了。效果差了一些,感兴趣的小伙伴们可以运行代码感受丝滑与弹性。前段时间在竞品小红书上看到了这样的效果:图片可以跟随手指移动,双指可以(无限)放大,缩小,还可以挤压,手指抬起后还有一个有趣的效果,图片回弹。。。一直想撸一个手势的控件,正好可以模仿小红书图片裁剪控件,话不多说,撸起袖子就是干。本系列共有两篇,在第二篇会重点讲解与RecyclerView的联动效果,..._仿飞书图片裁剪控件

Swagger 常用注解使用详解1:常用的注解_swagger 参数是否必须-程序员宅基地

文章浏览阅读267次。刚开始的时候,在controller层使用@RequestParam的时候,发现这个参数是必须要输入值的,但是我们有时候必须查询的时候允许参数为空,使用这个注解就不行了。在集成了swagger2后,找了半天的原因,发现使用@ApiImplicitParam这个注解可以解决这个问题。对应下面的参数。所以我们可以使用这个注解来解决我们所遇到的参考为空的问题。而且已经集成了swagg..._swagger 参数是否必须

MariaDB..-程序员宅基地

文章浏览阅读58次。一 与 MySQL 相比较,MariaDB 的优势:Maria 存储引擎PBXT 存储引擎XtraDB 存储引擎FederatedX 存储引擎更快的复制查询处理线程池更少的警告和bug运行速度更快更多的 Extensions更好的功能测试慢查询日志的扩展统计支持对 Unicode 的排序二 mariadb 安装官方强烈推荐使用yum方式安装https://downloads...._mariadb donor_host

随便推点

NodeJS之 Express框架 app.use(express.static)-程序员宅基地

文章浏览阅读169次。参考文档:https://blog.csdn.net/u010977147/article/details/60956502一 、设置静态文件目录语法如下:app.use(express.static(_dirname + '/public')); //设置静态文件目录注: 将静态文件目录设置为项目根目录 + ‘/public’,可以这样写app.use(expr..._app.use('/socket', express.static('./public'))

计算机常用端口一览表-程序员宅基地

文章浏览阅读350次。计算机常用[2]常见端口列表  TCP端口  TCP 1=TCP Port Service Multiplexer  TCP 2=Death  TCP 5=Remote Job Entry,yoyo  TCP 7=Echo  TCP 11=Skun  TCP 12=Bomber  TCP 16=Skun  TCP 17=Skun  ..._2556是常用端口吗

《我在未来等你》的读书笔记和读后感作文2900字-程序员宅基地

文章浏览阅读285次。2019独角兽企业重金招聘Python工程师标准>>> ..._我在未来等你读书笔记3000

完整记录一则Oracle 11.2.0.4单实例打PSU补丁的过程-程序员宅基地

文章浏览阅读6.6w次,点赞2次,收藏3次。本文记录了打PSU的全过程,意在体会数据库打PSU补丁的整个过程。1.OPatch替换为最新版本2.数据库软件应用19121551补丁程序3.数据库应用补丁4.验证PSU补丁是否应用成功1.OPatch替换为最新版本[oracle@DB usr2]$ iduid=500(oracle) gid=500(oinstall) 组=500(oinstall),501(dba) 环境=..._miye6.cc

[汇编学习笔记][第五章[BX]和loop指令]-程序员宅基地

文章浏览阅读82次。第五章[BX]和loop指令前言定义描述性符号“()”来表示一个寄存器或一个内存单元的内容,比如:(ax)表示ax中的内容,(al)表示al的内容。约定符号ideta表示常量。5.1 [BX][BX] BX 相当于 A[i],改变 i 是最好的遍历方式从第七章穿越回来BX相当于A[i]中的i[2][2]相当于A..._c++项目bx什么意思

中合国创杯2017年创客中国互联网+创新创业大赛复赛成功举办 20各项目入围总决赛...-程序员宅基地

文章浏览阅读135次。8月20日中合国创杯2017年创客中国互联网+创新创业大赛项目复赛完成。本次复赛创业组与创客组各有10个项目进入决赛,涵盖互联网+、人工智能、军民融合等领域。据了解,本次复赛由中国投资协会外资投资专业委员会、中国投资协会大数据投资专业委员会、启迪汇威、红基资本、蜂族创投、华普亿方资本、澳中东方资本、恩美资本等担任评委进行评审,同时招商证券、辰宏投..._互联网+评委 张or伦