ROS专题----机器人模型urdf简明笔记

----ROS机器人模型urdf简明笔记----


ROS库--URDF

  1. 使用URDF从头开始构建可视机器人模型

    了解如何构建一个可以在Rviz中查看的机器人的视觉模型

  2. 使用URDF构建可移动机器人模型

    了解如何在URDF中定义活动关节

  3. 向URDF模型添加物理和冲突属性

    了解如何向链接添加碰撞和惯性属性,以及如何为关节添加关节动力学。

  4. 使用Xacro清理URDF文件

    学习一些技巧,以减少使用Xacro URDF文件中的代码量


----

全部源码:http://download.csdn.net/detail/zhangrelay/9775629


1 简单的几何形状

这里包括形状,大小,位置,角度和材质等。以下面代码为例,简单介绍一下:

<?xml version="1.0"?>
<robot name="visual">

  <material name="red">
    <color rgba="0.8 0 0 1"/>
  </material>  
  <material name="green">
    <color rgba="0 0.8 0 1"/>
  </material>
  <material name="blue">
    <color rgba="0 0 0.8 1"/>
  </material>
  <material name="black">
    <color rgba="0 0 0 1"/>
  </material>
  <material name="white">
    <color rgba="1 1 1 1"/>
  </material>

  <link name="base_link">
    <visual>
      <geometry>
        <cylinder length="0.6" radius="0.2"/>
      </geometry>
      <material name="red"/>
    </visual>
  </link>

  <link name="right_leg">
    <visual>
      <geometry>
        <box size="0.6 .1 .2"/>
      </geometry>
      <origin rpy="0 1.57075 0" xyz="0 0 -0.3"/>
      <material name="blue"/>
    </visual>
  </link>

  <joint name="base_to_right_leg" type="fixed">
    <parent link="base_link"/>
    <child link="right_leg"/>
    <origin xyz="0 -0.22 .25"/>
  </joint>

  <link name="right_base">
    <visual>
      <geometry>
        <box size="0.4 .1 .1"/>
      </geometry>
      <material name="white"/>
    </visual>
  </link>

  <joint name="right_base_joint" type="fixed">
    <parent link="right_leg"/>
    <child link="right_base"/>
    <origin xyz="0 0 -0.6"/>
  </joint>

  <link name="right_front_wheel">
    <visual>
      <origin rpy="1.57075 0 0" xyz="0 0 0"/>
      <geometry>
        <cylinder length="0.1" radius="0.035"/>
      </geometry>
      <material name="black"/>
      <origin rpy="0 0 0" xyz="0 0 0"/>
    </visual>
  </link>
  <joint name="right_front_wheel_joint" type="fixed">
    <axis rpy="0 0 0" xyz="0 1 0"/>
    <parent link="right_base"/>
    <child link="right_front_wheel"/>
    <origin rpy="0 0 0" xyz="0.133333333333 0 -0.085"/>
  </joint>

...............

  <link name="head">
    <visual>
      <geometry>
        <sphere radius="0.2"/>
      </geometry>
      <material name="white"/>
    </visual>
  </link>
  <joint name="head_swivel" type="fixed">
    <parent link="base_link"/>
    <child link="head"/>
    <origin xyz="0 0 0.3"/>
  </joint>

  <link name="box">
    <visual>
      <geometry>
        <box size=".08 .08 .08"/>
      </geometry>
      <material name="green"/>
    </visual>
  </link>

  <joint name="tobox" type="fixed">
    <parent link="head"/>
    <child link="box"/>
    <origin xyz="0.1814 0 0.1414"/>
  </joint>
</robot>

----

其中,geometry中包含形状和大小,如cylinder box,大小依据形状不同采用不同表示,如length radius size等;

原点是origin;相对于该点的位置和角度分别用xyz rpy表示;parent link是父节点,child link是子节点。fixed frame固定坐标;

当然,还有颜色等其他配置属性。

使用下面命令查看效果,注意model路径:

roslaunch urdf_tutorial display.launch model:=/home/relaybot/ROS_tutorial/src/urdf_tutorial-kinetic/urdf/05-visual.urdf

----


----

2 由静到动让模型运动起来

这里只需要注意一个要点,就是关节joint,上节一般是fixed,这里可以有continuous,revolute,prismatic。

还需要补充的是robot_state_publisherjoint_state_publisher。分别如下图所示:

 


运行下面命令,注意模型路径:

roslaunch urdf_tutorial display.launch model:=/home/relaybot/ROS_tutorial/src/urdf_tutorial-kinetic/urdf/06-flexible.urdf gui:=True

----


----

3 添加物理和碰撞属性

需要注意亮点即可,碰撞collision,物理inertial。

  <link name="base_link">
    <visual>
      <geometry>
        <cylinder length="0.6" radius="0.2"/>
      </geometry>
      <material name="blue"/>
    </visual>
    <collision>
      <geometry>
        <cylinder length="0.6" radius="0.2"/>
      </geometry>
    </collision>
    <inertial>
      <mass value="10"/>
      <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
    </inertial>
  </link>

----

roslaunch urdf_tutorial display.launch model:=/home/relaybot/ROS_tutorial/src/urdf_tutorial-kinetic/urdf/07-physics.urdf

----


----

4 使用xacro简化urdf文件

这里给出两个参考网址:xacro在urdf中使用xacro

roslaunch urdf_tutorial display.launch model:=/home/relaybot/ROS_tutorial/src/urdf_tutorial-kinetic/urdf/08-macroed.urdf.xacro

----


----

5 在Gazebo中使用urdf

参考网址:http://gazebosim.org/tutorials?tut=ros_urdf

完成配置后,启动命令:

roslaunch urdf_tutorial gazebo.launch

----


----

6 rviz和Gazebo中实现同步控制

运行下面命令:

roslaunch urdf_tutorial control.launch

----

 

----

附录:

TF:


Graph:


display.launch

<launch>

  <arg name="model" default="$(find urdf_tutorial)/urdf/r2d2.xacro"/>
  <arg name="gui" default="true" />
  <arg name="rvizconfig" default="$(find urdf_tutorial)/rviz/urdf.rviz" />

  <param name="robot_description" command="$(find xacro)/xacro.py $(arg model)" />
  <param name="use_gui" value="$(arg gui)"/>

  <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
  <node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
  <node name="rviz" pkg="rviz" type="rviz" args="-d $(arg rvizconfig)" required="true" />

</launch>


gazebo.launch

<launch>

  <!-- these are the arguments you can pass this launch file, for example paused:=true -->
  <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"/>
  <arg name="model" default="$(find urdf_tutorial)/urdf/r2d2.xacro"/>

  <!-- We resume the logic in empty_world.launch, changing only the name of the world to be launched -->
  <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>

  <param name="robot_description" command="$(find xacro)/xacro.py $(arg model)" />

  <!-- push robot_description to factory and spawn robot in gazebo -->
  <node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model"
        args="-z 1.0 -unpause -urdf -model robot -param robot_description" respawn="false" output="screen" />

  <node pkg="robot_state_publisher" type="robot_state_publisher"  name="robot_state_publisher">
    <param name="publish_frequency" type="double" value="30.0" />
  </node>

</launch>


control.launch

<launch>

  <arg name="model" default="$(find urdf_tutorial)/urdf/r2d2.xacro"/>
  <arg name="rvizconfig" default="$(find urdf_tutorial)/urdf.rviz" />

  <include file="$(find urdf_tutorial)/launch/gazebo.launch">
    <arg name="model" value="$(arg model)" />
  </include>

  <node name="rviz" pkg="rviz" type="rviz" args="-d $(arg rvizconfig)" />

  <!-- This param file is where any environment-agnostic (live or simulation)
  configuration should be loaded, including controllers -->
  <rosparam command="load" file="$(find urdf_tutorial)/config/control.yaml" />

  <!-- This node loads the two controllers into a controller manager (real or simulated). The
  controllers are defined in config/control.yaml -->
  <node name="r2d2_controller_spawner" pkg="controller_manager" type="spawner"
    args="r2d2_joint_state_controller
          r2d2_diff_drive_controller
          r2d2_head_controller
          r2d2_gripper_controller
          --shutdown-timeout 3"/>

  <node name="rqt_robot_steering" pkg="rqt_robot_steering" type="rqt_robot_steering">

    <param name="default_topic" value="/r2d2_diff_drive_controller/cmd_vel"/>
  </node>

</launch>


r2d2.xacro

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

  <xacro:property name="width" value=".2" />
  <xacro:property name="leglen" value=".6" />
  <xacro:property name="polelen" value=".2" />
  <xacro:property name="bodylen" value=".6" />
  <xacro:property name="baselen" value=".4" />
  <xacro:property name="wheeldiam" value=".07" />
  <xacro:property name="pi" value="3.1415" />

  <material name="red">
    <color rgba="0.8 0 0 1"/>
  </material>  
  <material name="green">
    <color rgba="0 0.8 0 1"/>
  </material>
  <material name="blue">
    <color rgba="0 0 0.8 1"/>
  </material>
  <material name="black">
    <color rgba="0 0 0 1"/>
  </material>
  <material name="white">
    <color rgba="1 1 1 1"/>
  </material>

  <xacro:macro name="default_inertial" params="mass">
    <inertial>
      <mass value="${mass}" />
      <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0" />
    </inertial>
  </xacro:macro>

  <link name="base_link">
    <visual>
      <geometry>
        <cylinder radius="${width}" length="${bodylen}"/>
      </geometry>
      <material name="red"/>
    </visual>
    <collision>
      <geometry>
        <cylinder radius="${width}" length="${bodylen}"/>
      </geometry>
    </collision>
    <xacro:default_inertial mass="10"/>
  </link>
    <!-- This block provides the simulator (Gazebo) with information on a few additional
    physical properties. See http://gazebosim.org/tutorials/?tut=ros_urdf for more-->
    <gazebo reference="base_link">
      <material>Gazebo/Red</material>
    </gazebo>

  <xacro:macro name="wheel" params="prefix suffix reflect">

    <link name="${prefix}_${suffix}_wheel">
      <visual>
        <origin xyz="0 0 0" rpy="${pi/2} 0 0" />
        <geometry>
          <cylinder radius="${wheeldiam/2}" length="0.1"/>
        </geometry>
        <material name="black"/>
        <origin xyz="0 0 0" rpy="0 0 0" />
      </visual>
      <collision>
        <origin xyz="0 0 0" rpy="${pi/2} 0 0" />
        <geometry>
          <cylinder radius="${wheeldiam/2}" length="0.1"/>
        </geometry>
        <origin xyz="0 0 0" rpy="0 0 0" />
      </collision>
      <xacro:default_inertial mass="1"/>
    </link>
    <joint name="${prefix}_${suffix}_wheel_joint" type="continuous">
      <axis xyz="0 1 0" rpy="0 0 0" />
      <parent link="${prefix}_base"/>
      <child link="${prefix}_${suffix}_wheel"/>
      <origin xyz="${baselen*reflect/3} 0 -${wheeldiam/2+.05}" rpy="0 0 0"/>
    </joint>

    <!-- This block provides the simulator (Gazebo) with information on a few additional
    physical properties. See http://gazebosim.org/tutorials/?tut=ros_urdf for more-->
    <gazebo reference="${prefix}_${suffix}_wheel">
      <mu1 value="200.0"/>
      <mu2 value="100.0"/>
      <kp value="10000000.0" />
      <kd value="1.0" />
      <material>Gazebo/Black</material>
    </gazebo>

    <!-- This block connects the wheel joint to an actuator (motor), which informs both
    simulation and visualization of the robot -->
    <transmission name="${prefix}_${suffix}_wheel_trans" type="SimpleTransmission">
      <type>transmission_interface/SimpleTransmission</type>
      <actuator name="${prefix}_${suffix}_wheel_motor">
        <mechanicalReduction>1</mechanicalReduction>
      </actuator>
      <joint name="${prefix}_${suffix}_wheel_joint">
        <hardwareInterface>VelocityJointInterface</hardwareInterface>
      </joint>
    </transmission>

  </xacro:macro>

  <xacro:macro name="leg" params="prefix reflect">
    <link name="${prefix}_leg">
      <visual>
        <geometry>
          <box size="${leglen} .1 .2"/>
        </geometry>
        <origin xyz="0 0 -${leglen/2}" rpy="0 ${pi/2} 0"/>
        <material name="blue"/>
      </visual>
      <collision>
        <geometry>
          <box size="${leglen} .1 .2"/>
        </geometry>
        <origin xyz="0 0 -${leglen/2}" rpy="0 ${pi/2} 0"/>
      </collision>
      <xacro:default_inertial mass="10"/>
    </link>
    <!-- This block provides the simulator (Gazebo) with information on a few additional
    physical properties. See http://gazebosim.org/tutorials/?tut=ros_urdf for more-->
    <gazebo reference="${prefix}_leg">
      <material>Gazebo/Blue</material>
    </gazebo>

    <joint name="base_to_${prefix}_leg" type="fixed">
      <parent link="base_link"/>
      <child link="${prefix}_leg"/>
      <origin xyz="0 ${reflect*(width+.02)} .25" />
    </joint>

    <link name="${prefix}_base">
      <visual>
        <geometry>
          <box size="${baselen} .1 .1"/>
        </geometry>
        <material name="white"/>
      </visual>
      <collision>
        <geometry>
          <box size="${baselen} .1 .1"/>
        </geometry>
      </collision>
      <xacro:default_inertial mass="10"/>
    </link>

    <joint name="${prefix}_base_joint" type="fixed">
      <parent link="${prefix}_leg"/>
      <child link="${prefix}_base"/>
      <origin xyz="0 0 ${-leglen}" />
    </joint>
    <xacro:wheel prefix="${prefix}" suffix="front" reflect="1"/>
    <xacro:wheel prefix="${prefix}" suffix="back" reflect="-1"/>
  </xacro:macro>
  <xacro:leg prefix="right" reflect="-1" />
  <xacro:leg prefix="left" reflect="1" />

  <joint name="gripper_extension" type="prismatic">
    <parent link="base_link"/>
    <child link="gripper_pole"/>
    <limit effort="1000.0" lower="-${width*2-.02}" upper="0" velocity="0.5"/>
    <origin rpy="0 0 0" xyz="${width-.01} 0 .2"/>
    <limit effort="30" velocity="0.2"/>
    <dynamics damping="0.0" friction="0.0"/>
  </joint>

  <link name="gripper_pole">
    <visual>
      <geometry>
        <cylinder length="${polelen}" radius=".01"/>
      </geometry>
      <origin xyz="${polelen/2} 0 0" rpy="0 ${pi/2} 0 "/>
    </visual>
    <collision>
      <geometry>
        <cylinder length="${polelen}" radius=".01"/>
      </geometry>
      <origin xyz="${polelen/2} 0 0" rpy="0 ${pi/2} 0 "/>
    </collision>
    <xacro:default_inertial mass=".05"/>
  </link>

  <transmission name="gripper_extension_trans" type="SimpleTransmission">
    <type>transmission_interface/SimpleTransmission</type>
    <actuator name="gripper_extension_motor">
      <mechanicalReduction>1</mechanicalReduction>
    </actuator>
    <joint name="gripper_extension">
      <hardwareInterface>PositionJointInterface</hardwareInterface>
    </joint>
  </transmission>

  <xacro:macro name="gripper" params="prefix reflect">
    <joint name="${prefix}_gripper_joint" type="revolute">
      <axis xyz="0 0 ${reflect}"/>
      <limit effort="1000.0" lower="0.0" upper="0.548" velocity="0.5"/>
      <origin rpy="0 0 0" xyz="${polelen} ${reflect*0.01} 0"/>
      <parent link="gripper_pole"/>
      <child link="${prefix}_gripper"/>
      <limit effort="30" velocity="1.0"/>
      <dynamics damping="0.0" friction="0.0"/>
    </joint>
    <link name="${prefix}_gripper">
      <visual>
        <origin rpy="${(reflect-1)/2*pi} 0 0" xyz="0 0 0"/>
        <geometry>
          <mesh filename="package://pr2_description/meshes/gripper_v0/l_finger.dae"/>
        </geometry>
      </visual>
      <collision>
        <geometry>
          <mesh filename="package://pr2_description/meshes/gripper_v0/l_finger.dae"/>
        </geometry>
        <origin rpy="${(reflect-1)/2*pi} 0 0" xyz="0 0 0"/>
      </collision>
      <xacro:default_inertial mass=".05"/>
    </link>
    <transmission name="${prefix}_gripper_trans" type="SimpleTransmission">
      <type>transmission_interface/SimpleTransmission</type>
      <actuator name="${prefix}_gripper_motor">
        <mechanicalReduction>1</mechanicalReduction>
      </actuator>
      <joint name="${prefix}_gripper_joint">
        <hardwareInterface>PositionJointInterface</hardwareInterface>
      </joint>
    </transmission>

    <joint name="${prefix}_tip_joint" type="fixed">
      <parent link="${prefix}_gripper"/>
      <child link="${prefix}_tip"/>
    </joint>
    <link name="${prefix}_tip">
      <visual>
        <origin rpy="${(reflect-1)/2*pi} 0 0" xyz="0.09137 0.00495 0"/>
        <geometry>
          <mesh filename="package://pr2_description/meshes/gripper_v0/l_finger_tip.dae"/>
        </geometry>
      </visual>
      <collision>
        <geometry>
          <mesh filename="package://pr2_description/meshes/gripper_v0/l_finger_tip.dae"/>
        </geometry>
        <origin rpy="${(reflect-1)/2*pi} 0 0" xyz="0.09137 0.00495 0"/>
      </collision>
      <xacro:default_inertial mass=".05"/>
    </link>
  </xacro:macro>

  <xacro:gripper prefix="left" reflect="1" />
  <xacro:gripper prefix="right" reflect="-1" />

  <link name="head">
    <visual>
      <geometry>
        <sphere radius="${width}"/>
      </geometry>
      <material name="green"/>
    </visual>
    <collision>
      <geometry>
        <sphere radius="${width}"/>
      </geometry>
    </collision>
    <xacro:default_inertial mass="2"/>
  </link>

  <joint name="head_swivel" type="continuous">
    <parent link="base_link"/>
    <child link="head"/>
    <axis xyz="0 0 1"/>
    <origin xyz="0 0 ${bodylen/2}"/>
    <limit effort="30" velocity="1.0"/>
    <dynamics damping="0.0" friction="0.0"/>
  </joint>
    <!-- This block provides the simulator (Gazebo) with information on a few additional
    physical properties. See http://gazebosim.org/tutorials/?tut=ros_urdf for more-->
    <gazebo reference="head">
      <material>Gazebo/Orange</material>
    </gazebo>
  <!-- This block connects the head_swivel joint to an actuator (motor), which informs both
  simulation and visualization of the robot -->
  <transmission name="head_swivel_trans" type="SimpleTransmission">
    <type>transmission_interface/SimpleTransmission</type>
    <actuator name="$head_swivel_motor">
      <mechanicalReduction>1</mechanicalReduction>
    </actuator>
    <joint name="head_swivel">
      <hardwareInterface>PositionJointInterface</hardwareInterface>
    </joint>
  </transmission>

  <link name="box">
    <visual>
      <geometry>
        <box size=".08 .08 .08"/>
      </geometry>
      <material name="blue"/>
      <origin xyz="-0.04 0 0"/>
    </visual>
    <collision>
      <geometry>
        <box size=".08 .08 .08"/>
      </geometry>
    </collision>
    <xacro:default_inertial mass="1"/>
  </link>

  <joint name="tobox" type="fixed">
    <parent link="head"/>
    <child link="box"/>
    <origin xyz="${.707*width+0.04} 0 ${.707*width}"/>
  </joint>

  <!-- Gazebo plugin for ROS Control -->
  <gazebo>
    <plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
      <robotNamespace>/</robotNamespace>
    </plugin>
  </gazebo>

</robot>


补充链接与资料:

1urdf http://wiki.ros.org/urdf

2xacro http://wiki.ros.org/xacro

----

End

----





  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
机器⼈建模与仿真(⼆)——机器⼈URDF模型仿真 机器⼈建模与仿真(⼆)——机器⼈URDF模型仿真 ⽬录 总述 在ROS中,机器⼈的模型⼀般放在RobotName_description功能包下。 ⼀、创建机器⼈描述功能包 catkin_create_pkg mbot_description urdf xacro 机器⼈模型、描述⽂件在ROS⾥,通常的以 机器⼈名_description,并且需要依赖urdf功能包,解析模型 和 xacro(优化urdf⽤的)依 赖。 在RobotName_description功能包下创建⼏个不同作⽤的⽂件夹,包含urdf、meshes、launch和config四个⽂件夹。 urdf:存放机器⼈模型的URDF或xacro⽂件 meshes:放置URDF中引⽤的模型渲染⽂件,机器⼈外观纹理,让外观和实际更相似,通过三维设计软件导出,放置此⽂件夹下 launch:保存相关启动⽂件 config:保存rviz的配置⽂件、功能包的配置⽂件 ⼆、创建URDF模型 在了解了URDF模型中常⽤的标签和语法,使⽤这些基本语法创建机器⼈底盘模型。 这个机器⼈底盘模型有7个link和6个joint。7个link包括1个机器⼈底板、2个电机、2个驱动轮和2个万向轮;6个joint负责将驱动轮、万向 轮、电机安装到底板上,并设置相应的连接⽅式。 <?xml version="1.0" ?> <robot name="mrobot_chassis"> //robot name 标签⽤于定义所描述机器⼈的名称 <link name="base_link"> <visual> // <origin xyz=" 0.1 0.1 0.1" rpy="0 0 0" /> <geometry> <cylinder length="0.005" radius="0.13"/> </geometry> <material name="yellow"> <color rgba="1 0.4 0 1"/> </material> </visual> </link> //link标签描述了机器⼈某个刚体部分的外观和物理属性,包括尺⼨,颜⾊,形状惯性和碰撞参数等,visual...../visual 标签描述机器⼈某个部件的外观参数等 。origin 标签描述了所绘制外观geometry的坐标起点,⼀般对于规则形状的外观坐标起点位于规则形状的重⼼位置, cylinder 标签描述了这个圆柱体的尺⼨,m aterial 标签⽤于描述外观的颜⾊等信息 <joint name="base_left_motor_joint" type="fixed"> //joint...../joint标签⽤于描述机器⼈关节的运动学和动⼒属性 <origin xyz="0.1 0.1 0.1" rpy="0 0 0" /> <parent link="base_link"/> <child link="left_motor" /> </joint> //上述joint...../joint标签中⼀般描述origin parent child等参数,origin描述了joint连接点基于parent link="base_link" 坐标的偏移量,⼀般在rviz仿真中左上⾓Fixed Frame 的map选项设置成base_link,则base_link在rviz中为坐标原点,那么 origin所描述的joint为基于坐 标原点的偏移量,parent为jiont的⽀撑连接部件,child为⼦部件,joint就为⼦部件和⽀撑连接部件 的关节 <link name="left_motor"> <visual> <origin xyz="0.2 0.2 0.2" rpy="0 0 0" /> <geometry> <cylinder radius="0.02" length = "0.08"/> </geometry> <material name="gray"> <color rgba="0.75 0.75 0.75 1"/> </material> </visual> </link> //link name="left_motor"标签为base_left_motor_joint连接件的⼦部件,其中origin描述了该部件基于base_left_motor_joint关节 坐标的偏移点,base_left_motor_joint关节的坐标原点为origin xyz="0.1 0.1 0.1",若left_motor部件的origin xyz="0.2 0.2 0.2" 则表⽰left_motor所描述部件基于base_left_motor_joint关节坐标xyz
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>铜仁市3D地图(点击地图区域跳转到相应页面)</title> [removed][removed] [removed][removed] [removed][removed] </head> <body> <!-- 3D地图容器 --> <div id="main" 100%; height: 800px;"></div> [removed] // 初始化图表 var myChart = echarts.init(document.getElementById('main')); // JSON文件(地图数据)路径 var uploadedDataURL = "json/522200.json"; // 显示加载动画效果,可以在加载数据前手动调用该接口显示加载动画,在数据加载完成后调用 hideLoading 隐藏加载动画。 myChart.showLoading(); // 引入JSON文件 $.getJSON(uploadedDataURL, function(geoJson) { // 注册地图名字(tongren)和数据(geoJson) echarts.registerMap('tongren', geoJson); // 隐藏动画加载效果。 myChart.hideLoading(); // 图表配置项 var option = { title : { // 标题 top : '5%', text : '铜仁市3D地图', subtext : '', x : 'center', textStyle : { color : '#ccc' } }, tooltip : { // 提示框 trigger : 'item', formatter : function(params) { return params.name; } }, series: [{ type: 'map3D', // 系列类型 name: 'map3D', // 系列名称 map: 'tongren', // 地图类型。echarts-gl 中使用的地图类型同 geo 组件相同(ECharts 中提供了两种格式的地图数据,一种是可以直接 script 标签引入的 js 文件,引入后会自动注册地图名字和数据。还有一种是 JSON 文件,需要通过 AJAX 异步加载后手动注册。) // 环境贴图,支持純颜色值,渐变色,全景贴图的 url。默认为 'auto',在配置有 light.ambientCubemap.texture 的时候会使用该纹理作为环境贴图。否则则不显示环境贴图。 environment: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ // 配置为垂直渐变的背景 offset: 0, color: '#00aaff' // 天空颜色 }, { offset: 0.7, color: '#998866' // 地面颜色 }, { offset: 1, color: '#998866' // 地面颜色 }], false), label: { // 标签的相关设置 show: true, // (地图上的城市名称)是否显示标签 [ default: false ] //distance: 50, // 标签距离图形的距离,在三维的散点图中这个距离是屏幕空间的像素值,其它图中这个距离是相对的三维距离 //formatter:, // 标签内容格式器 textStyle: { // 标签的字体样式 color: '#000', // 地图初始化区域字体颜色 fontSize: 8, // 字体大小 opacity: 1, // 字体透明度 backgroundColor: 'rgba(0,23,11,0)' // 字体背景色 }, }, itemStyle: { // 三维地理坐标系组件 中三维图形的视觉属性,包括颜色,透明度,描边等。 color: 'rgba(95,158,160,0.5)', // 地图板块的颜色 opacity: 1, // 图形的不透明度 [ default: 1 ] borderWidth: 0.5, // (地图板块间的分隔线)图形描边的宽度。加上描边后可以更清晰的区分每个区域 [ default: 0 ] borderColor: '#000' // 图形描边的颜色。[ default: #333 ] }, emphasis: { // 鼠标 hover 高亮时图形和标签的样式 (当鼠标放上去时 label和itemStyle 的样式) label: { // label高亮时的配置 show: true, textStyle: { color: '#fff', // 高亮时标签颜色变为 白色 fontSize: 15, // 高亮时标签字体 变大 } }, itemStyle: { // itemStyle高亮时的配置 areaColor: '#66ffff', // 高亮时地图板块颜色改变 } }, groundPlane: { // 地面可以让整个组件有个“摆放”的地方,从而使整个场景看起来更真实,更有模型感。 show: false, // 是否显示地面。[ default: false ] color: '#aaa' // 地面颜色。[ default: '#aaa' ] }, regions: [{ // 可对单个地图区域进行设置 name: '玉屏侗族自治县', // 所对应的地图区域的名称 //regionHeight: '', // 区域的高度,可以设置不同的高度用来表达数据的大小。当 GeoJSON 为建筑的数据时,也可以通过这个值表示简直的高度。 itemStyle: { // 单个区域的样式设置 color: '#00FF00', opacity: 1, borderWidth: 0.4, borderColor: '#5F9EA0' }, }, { name: '碧江区', itemStyle: { color: '#EEEE00', opacity: 1, borderWidth: 0.4, borderColor: '#5F9EA0' }, }], //shading: 'lambert', // 三维地理坐标系组件中三维图形的着色效果,echarts-gl 中支持下面三种着色方式: // 'color' 只显示颜色,不受光照等其它因素的影响。 // 'lambert' 通过经典的 lambert 着色表现光照带来的明暗。 // 'realistic' 真实感渲染,配合 light.ambientCubemap 和 postEffect 使用可以让展示的画面效果和质感有质的提升。ECharts GL 中使用了基于物理的渲染(PBR) 来表现真实感材质。 // realisticMaterial: {} // 真实感材质相关的配置项,在 shading 为'realistic'时有效。 // lambertMaterial: {} // lambert 材质相关的配置项,在 shading 为'lambert'时有效。 // colorMaterial: {} // color 材质相关的配置项,在 shading 为'color'时有效。 light: { // 光照相关的设置。在 shading 为 'color' 的时候无效。 光照的设置会影响到组件以及组件所在坐标系上的所有图表。合理的光照设置能够让整个场景的明暗变得更丰富,更有层次。 main: { // 场景主光源的设置,在 globe 组件中就是太阳光。 color: '#fff', //主光源的颜色。[ default: #fff ] intensity: 1.2, //主光源的强度。[ default: 1 ] shadow: false, //主光源是否投射阴影。默认关闭。 开启阴影可以给场景带来更真实和有层次的光照效果。但是同时也会增加程序的运行开销。 //shadowQuality: 'high', // 阴影的质量。可选'low', 'medium', 'high', 'ultra' [ default: 'medium' ] alpha: 55, // 主光源绕 x 轴,即上下旋转的角度。配合 beta 控制光源的方向。[ default: 40 ] beta: 10 // 主光源绕 y 轴,即左右旋转的角度。[ default: 40 ] }, ambient: { // 全局的环境光设置。 color: '#fff', // 环境光的颜色。[ default: #fff ] intensity: 0.5 // 环境光的强度。[ default: 0.2 ] } }, viewControl: { // 用于鼠标的旋转,缩放等视角控制。 projection: 'perspective', // 投影方式,默认为透视投影'perspective',也支持设置为正交投影'orthographic'。 autoRotate: false, // 是否开启视角绕物体的自动旋转查看。[ default: false ] autoRotateDirection: 'cw', // 物体自传的方向。默认是 'cw' 也就是从上往下看是顺时针方向,也可以取 'ccw',既从上往下看为逆时针方向。 autoRotateSpeed: 10, // 物体自传的速度。单位为角度 / 秒,默认为10 ,也就是36秒转一圈。 autoRotateAfterStill: 3, // 在鼠标静止操作后恢复自动旋转的时间间隔。在开启 autoRotate 后有效。[ default: 3 ] damping: 0, // 鼠标进行旋转,缩放等操作时的迟滞因子,在大于等于 1 的时候鼠标在停止操作后,视角仍会因为一定的惯性继续运动(旋转和缩放)。[ default: 0.8 ] rotateSensitivity: 1, // 旋转操作的灵敏度,值越大越灵敏。支持使用数组分别设置横向和纵向的旋转灵敏度。默认为1, 设置为0后无法旋转。 rotateSensitivity: [1, 0]——只能横向旋转; rotateSensitivity: [0, 1]——只能纵向旋转。 zoomSensitivity: 1, // 缩放操作的灵敏度,值越大越灵敏。默认为1,设置为0后无法缩放。 panSensitivity: 1, // 平移操作的灵敏度,值越大越灵敏。默认为1,设置为0后无法平移。支持使用数组分别设置横向和纵向的平移灵敏度 panMouseButton: 'left', // 平移操作使用的鼠标按键,支持:'left' 鼠标左键(默认);'middle' 鼠标中键 ;'right' 鼠标右键(注意:如果设置为鼠标右键则会阻止默认的右键菜单。) rotateMouseButton: 'left', // 旋转操作使用的鼠标按键,支持:'left' 鼠标左键;'middle' 鼠标中键(默认);'right' 鼠标右键(注意:如果设置为鼠标右键则会阻止默认的右键菜单。) distance: 200, // [ default: 100 ] 默认视角距离主体的距离,对于 grid3D 和 geo3D 等其它组件来说是距离中心原点的距离,对于 globe 来说是距离地球表面的距离。在 projection 为'perspective'的时候有效。 minDistance: 40, // [ default: 40 ] 视角通过鼠标控制能拉近到主体的最小距离。在 projection 为'perspective'的时候有效。 maxDistance: 400, // [ default: 400 ] 视角通过鼠标控制能拉远到主体的最大距离。在 projection 为'perspective'的时候有效。 alpha: 40, // 视角绕 x 轴,即上下旋转的角度。配合 beta 可以控制视角的方向。[ default: 40 ] beta: 15, // 视角绕 y 轴,即左右旋转的角度。[ default: 0 ] minAlpha: -360, // 上下旋转的最小 alpha 值。即视角能旋转到达最上面的角度。[ default: 5 ] maxAlpha: 360, // 上下旋转的最大 alpha 值。即视角能旋转到达最下面的角度。[ default: 90 ] minBeta: -360, // 左右旋转的最小 beta 值。即视角能旋转到达最左的角度。[ default: -80 ] maxBeta: 360, // 左右旋转的最大 beta 值。即视角能旋转到达最右的角度。[ default: 80 ] center: [0,0,0], // 视角中心点,旋转也会围绕这个中心点旋转,默认为[0,0,0]。 animation: true, // 是否开启动画。[ default: true ] animationDurationUpdate: 1000, // 过渡动画的时长。[ default: 1000 ] animationEasingUpdate: 'cubicInOut' // 过渡动画的缓动效果。[ default: cubicInOut ] }, data: [{ // 可对单个地图区域进行设置 name: '玉屏侗族自治县', // 所对应的地图区域的名称 //regionHeight: '', // 区域的高度,可以设置不同的高度用来表达数据的大小。当 GeoJSON 为建筑的数据时,也可以通过这个值表示简直的高度。 itemStyle: { // 单个区域的样式设置 color: '#00FF00', opacity: 1, borderWidth: 0.4, borderColor: '#5F9EA0' }, }, { name: '碧江区', itemStyle: { color: '#EEEE00', opacity: 1, borderWidth: 0.4, borderColor: '#5F9EA0' }, }] }] }; // 设置图表实例的配置项以及数据,万能接口,所有参数和数据的修改都可以通过setOption完成,ECharts 会合并新的参数和数据,然后刷新图表。 myChart.setOption(option); }); // 处理点击事件并且跳转到相应的百度搜索页面 myChart.on('click', function (params) { var subSystem = params.name; var url = 'https://www.baidu.com/s?ie=UTF-8&wd;='; // 根据点击地图区域的名称,跳转到对应页面 if(subSystem == '德江县'){ window.open(url.concat(subSystem)); }else if(subSystem == '思南县'){ window.open(url.concat(subSystem)); }else if(subSystem == '江口县'){ window.open(url.concat(subSystem)); }else if(subSystem == '沿河土家自治县'){ window.open(url.concat(subSystem)); }else if(subSystem == '万山区'){ window.open(url.concat(subSystem)); }else if(subSystem == '碧江区'){ window.open(url.concat(subSystem)); }else if(subSystem == '石阡县'){ window.open(url.concat(subSystem)); }else if(subSystem == '玉屏侗族自治县'){ window.open(url.concat(subSystem)); }else if(subSystem == '松桃苗族自治县'){ window.open(url.concat(subSystem)); }else if(subSystem == '印江土家族苗族自治县'){ window.open(url.concat(subSystem)); } /*alert(params.name); */ }); [removed] </body> </html>
搭建自己的机器人模型需要进行以下步骤: 1. 安装ROS和仿真工具包 2. 创建ROS包和机器人模型 3. 编写机器人控制程序 4. 启动仿真环境并加载机器人模型 5. 运行机器人控制程序,观察仿真结果 下面是一个简单的机器人模型搭建示例,使用ROS Kinetic和Gazebo仿真工具包: 1. 安装ROS和仿真工具包 在Ubuntu系统中使用以下命令安装ROS Kinetic和Gazebo仿真工具包: ``` sudo apt-get update sudo apt-get install ros-kinetic-desktop-full sudo apt-get install ros-kinetic-gazebo-ros-pkgs ros-kinetic-gazebo-ros-control ``` 2. 创建ROS包和机器人模型 使用以下命令创建一个名为my_robot的ROS包,并在其中创建一个名为urdf的目录用于存放机器人模型文件: ``` mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src catkin_create_pkg my_robot cd my_robot mkdir urdf ``` 在urdf目录中创建一个名为my_robot.urdf机器人模型文件,内容如下: ```xml <?xml version="1.0"?> <robot name="my_robot" xmlns:xacro="http://www.ros.org/wiki/xacro"> <link name="base_link"> <visual> <geometry> <box size="0.3 0.3 0.1"/> </geometry> </visual> </link> <joint name="base_joint" type="fixed"> <parent link="world"/> <child link="base_link"/> <origin xyz="0 0 0.05"/> </joint> <link name="left_wheel_link"> <visual> <geometry> <cylinder length="0.05" radius="0.1"/> </geometry> </visual> </link> <joint name="left_wheel_joint" type="continuous"> <parent link="base_link"/> <child link="left_wheel_link"/> <origin xyz="0.15 0 -0.05"/> <axis xyz="0 1 0"/> </joint> <link name="right_wheel_link"> <visual> <geometry> <cylinder length="0.05" radius="0.1"/> </geometry> </visual> </link> <joint name="right_wheel_joint" type="continuous"> <parent link="base_link"/> <child link="right_wheel_link"/> <origin xyz="0.15 0 0.05"/> <axis xyz="0 1 0"/> </joint> </robot> ``` 这个机器人模型由一个长方体的底座和两个圆柱形的轮子组成,使用URDF格式描述。其中base_link表示机器人的底座,left_wheel_link和right_wheel_link分别表示左右两个轮子。 3. 编写机器人控制程序 在ROS包的src目录中创建一个名为my_robot_control.cpp的控制程序文件,内容如下: ```cpp #include <ros/ros.h> #include <geometry_msgs/Twist.h> int main(int argc, char** argv) { ros::init(argc, argv, "my_robot_control"); ros::NodeHandle nh; ros::Publisher cmd_vel_pub = nh.advertise<geometry_msgs::Twist>("cmd_vel", 10); ros::Rate loop_rate(10); while (ros::ok()) { geometry_msgs::Twist cmd_vel; cmd_vel.linear.x = 0.1; cmd_vel.angular.z = 0.5; cmd_vel_pub.publish(cmd_vel); ros::spinOnce(); loop_rate.sleep(); } return 0; } ``` 这个控制程序使用ROS的Twist消息类型发布机器人的线速度和角速度,以控制机器人的运动。在这个示例中,机器人线速度为0.1,角速度为0.5。 4. 启动仿真环境并加载机器人模型 使用以下命令启动Gazebo仿真环境,并加载机器人模型: ``` roslaunch my_robot my_robot.launch ``` 在my_robot包中创建一个名为my_robot.launch的启动文件,内容如下: ```xml <?xml version="1.0"?> <launch> <arg name="model" default="$(find my_robot)/urdf/my_robot.urdf"/> <param name="robot_description" textfile="$(arg model)" /> <node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-urdf -model my_robot -param robot_description -x 0 -y 0 -z 0"/> <node name="my_robot_control" type="my_robot_control" pkg="my_robot"/> <node name="gazebo_gui" pkg="gazebo" type="gazebo"/> </launch> ``` 这个启动文件首先将机器人模型文件加载到ROS参数服务器中,然后使用gazebo_ros包的spawn_model节点将机器人模型加载到Gazebo仿真环境中。同时运行my_robot_control程序节点控制机器人运动。最后启动Gazebo仿真环境的GUI界面。 5. 运行机器人控制程序,观察仿真结果 使用以下命令运行my_robot_control程序节点,控制机器人运动: ``` rosrun my_robot my_robot_control ``` 可以观察到仿真环境中的机器人开始运动,同时在控制程序的终端输出中可以看到机器人的线速度和角速度。 下图为搭建自己的机器人模型的结果截图: ![ROS机器人仿真结果截图](https://i.imgur.com/lv9v5a1.png)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangrelay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值