当前位置: 代码迷 >> 综合 >> 搭建自己的仿真环境和机器人(turtlebot2+velodyne)(一)
  详细解决方案

搭建自己的仿真环境和机器人(turtlebot2+velodyne)(一)

热度:63   发布时间:2023-11-13 19:08:09.0

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=hexagonsexport  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/xacronew: 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/xacronew: 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/xacronew: 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。优雅的失控