实体机器人在gazebo中的映射

这一部分目的是将真实的机器人映射到gazebo中,使得gazebo中的其他虚拟机器人能识别到真实世界的wheeltec机器人。

真实机器人的型号的wheeltec旗下的mini_mec。

一、在wheeltec官方百度云文档中找到URDF原始导出功能包.zip

找到对应的包

拷贝到工作空间下

在原有文件基础上新建如下文件

mini_mec_robot_run.urdf.xacro文件内容

复制代码
<?xml version="1.0"?>
<robot name="mini_mec_robot" xmlns:xacro="http://www.ros.org/wiki/xacro">
    <xacro:property name="prefix" value="$(arg prefix)" />

    <xacro:if value="${prefix == '/' or prefix == '' or prefix == ' '}">
    <xacro:property name="tf_prefix" value="" />
    </xacro:if>

    <xacro:unless value="${prefix == '/' or prefix == '' or prefix == ' '}">
    <xacro:property name="tf_prefix" value="${prefix}/" />
    </xacro:unless>

    <xacro:include filename="$(find mini_mec_robot)/urdf/mini_mec_robot.urdf.xacro" />
    <xacro:include filename="$(find mini_mec_robot)/urdf/lidar_gazebo.xacro" />
    <mini_mec_robot/>

</robot>

mini_mec_robot.urdf.xacro

这个文件是基于mini_mec_robot.urdf制作的,主要是copy mini_mec_robot.urdf文件中的关节和link关系,再配置gazebo中关键link的颜色材质,以及odom的计算,并发布odom到baselink之间的tf变换。

复制代码
<?xml version="1.0" encoding="utf-8"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro">

这里插入urdf中robot内部的内容(link和joint前面都加上${tf_prefix})
  <gazebo reference="${tf_prefix}base_link">
    <material>Gazebo/Grey</material>
  </gazebo>
  
  <gazebo reference="${tf_prefix}lb_wheel_link"> 
    <mu1>0.1</mu1>
    <mu2>0.1</mu2>
    <kp>500000.0</kp>
    <kd>10.0</kd>
    <material>Gazebo/DarkGrey</material>
    <maxVel>0.1</maxVel>
    <minDepth>0.001</minDepth>
    <fdir1>1 0 0</fdir1>
  </gazebo>
  <gazebo reference="${tf_prefix}lf_wheel_link">
    <mu1>0.1</mu1>
    <mu2>0.1</mu2>
    <kp>500000.0</kp>
    <kd>10.0</kd>
    <material>Gazebo/DarkGrey </material>
    <maxVel>0.1</maxVel>
    <minDepth>0.001</minDepth>
    <fdir1>1 0 0</fdir1>
  </gazebo>
  <gazebo reference="${tf_prefix}rf_wheel_link">
    <mu1>0.1</mu1>
    <mu2>0.1</mu2>
    <kp>500000.0</kp>
    <kd>10.0</kd>
    <material>Gazebo/DarkGrey </material>
    <maxVel>0.1</maxVel>
    <minDepth>0.001</minDepth>
    <fdir1>1 0 0</fdir1>
  </gazebo>
  <gazebo reference="${tf_prefix}rb_wheel_link">
    <mu1>0.1</mu1>
    <mu2>0.1</mu2>
    <kp>500000.0</kp>
    <kd>10.0</kd>
    <material>Gazebo/DarkGrey </material>
    <maxVel>0.1</maxVel>
    <minDepth>0.001</minDepth>
    <fdir1>1 0 0</fdir1>
  </gazebo>
  <!-- <gazebo reference="${tf_prefix}caster_wheel_link"> 
    <material>Gazebo/DarkGrey </material>
    <maxVel>0.0</maxVel>
    <minDepth>0.001</minDepth>
  </gazebo> -->
 
<!-- controller 这是2轮为odom到bselink的tf-->
  <!-- <gazebo>
  <plugin name="differential_drive_controller" 
          filename="libgazebo_ros_diff_drive.so">
    <rosDebugLevel>Error</rosDebugLevel>
    <publishWheelTF>false</publishWheelTF>
    <robotNamespace>/</robotNamespace>
    <publishTf>true</publishTf>
    <publishOdomTF>true</publishOdomTF>
    <publishWheelJointState>false</publishWheelJointState>
    <updateRate>50</updateRate>
    <legacyMode>false</legacyMode> -->

    <!-- 前轮 -->
    <!-- <leftJoint>${tf_prefix}lf_wheel_joint</leftJoint>
    <rightJoint>${tf_prefix}rf_wheel_joint</rightJoint> -->

    <!-- 轮子的相关参数 -->
    <!-- <wheelSeparation>0.1</wheelSeparation>
    <wheelDiameter>0.043</wheelDiameter>
    <broadcastTF>1</broadcastTF>
    <wheelTorque>20</wheelTorque>
    <wheelAcceleration>1.0</wheelAcceleration> -->

    <!-- 控制命令与里程计话题 -->
    <!-- <commandTopic>${tf_prefix}cmd_vel</commandTopic>
    <odometryFrame>${tf_prefix}odom</odometryFrame>
    <odometryTopic>${tf_prefix}odom</odometryTopic>
    <odometrySource>world</odometrySource>
    <robotBaseFrame>${tf_prefix}base_link</robotBaseFrame>
  </plugin>
这是4全向轮计算odom并发布odom和baselinkTF的
</gazebo> -->
 <gazebo>

  <plugin name="mecanum_controller" 
    filename="libgazebo_ros_planar_move.so">
<!-- 这两个似乎会自带${tf_prefix} -->
    <commandTopic>cmd_vel</commandTopic>

    <odometryTopic>odom</odometryTopic>

    <odometryFrame>${tf_prefix}odom</odometryFrame>

    <leftFrontJoint>lf_wheel_joint</leftFrontJoint>

    <rightFrontJoint>rf_wheel_joint</rightFrontJoint>

    <leftRearJoint>lb_wheel_joint</leftRearJoint>

    <rightRearJoint>rb_wheel_joint</rightRearJoint>

    <odometryRate>20.0</odometryRate>
    <odometrySource>world</odometrySource>
    <robotBaseFrame>${tf_prefix}base_link</robotBaseFrame>

  </plugin>
</gazebo>


</robot>

lidar_gazebo.xacro这是虚拟雷达文件

复制代码
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="lidar">

        <!-- Create laser reference frame -->
 <gazebo reference="${tf_prefix}laser"> 
            <sensor type="ray" name="rplidar">
                <pose>0 0 0 0 0 0</pose>
                <visualize>false</visualize>
                <update_rate>5.5</update_rate>
                <ray>
                    <scan>
                      <horizontal>
                        <samples>360</samples>
                        <resolution>1</resolution>
                        <min_angle>-3</min_angle>
                        <max_angle>3</max_angle>
                      </horizontal>
                    </scan>
                    <range>
                      <min>0.10</min>
                      <max>6.0</max>
                      <resolution>0.01</resolution>
                    </range>
                    <noise>
                      <type>gaussian</type>
                      <mean>0.0</mean>
                      <stddev>0.01</stddev>
                    </noise>
                </ray>
                <plugin name="gazebo_rplidar" filename="libgazebo_ros_laser.so">
                    <robotNamespace>/</robotNamespace>
                    <topicName>${tf_prefix}scan</topicName>
                    <frameName>${tf_prefix}laser</frameName>
                </plugin>
            </sensor>
        </gazebo>


</robot>

新建一个功能包wheeltec 新建launch/includes/model_wheeltec.launch.xml

复制代码
<launch>
    <!-- 迷你机器人,基础参数 -->
    <arg name="robot_name" />
  
    <arg name="model" />
    <arg name="gui" default="False" />

    <!-- 加载机器人模型描述参数 -->
    <param name="robot_description" command="$(find xacro)/xacro --inorder '$(find mini_mec_robot)/urdf/mini_mec_robot_run.urdf.xacro' prefix:=$(arg robot_name)" />
    <!-- 运行joint_state_publisher节点,发布机器人的关节状态  -->
    <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" >
        <param name="rate" value="50"/>
    </node> 


    <!-- 运行robot_state_publisher节点,发布tf  -->
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"  output="screen" >
        <param name="publish_frequency" type="double" value="50.0" />
    </node>
</launch>

在我的wxfpublish功能包的launch文件夹新建 spawn_wheeltec.launch

复制代码
<launch>

  <!-- 迷你机器人,基础参数 -->
  <arg name="robot_name" default="wheeltec_01" />
  <!-- 仿真环境机器人初始位置 -->
  <arg name="initial_pose_x"  default="-1.0"/>
  <arg name="initial_pose_y"  default="0.0"/>
  <!-- <arg name="initial_pose_Y"  default="0.0581694505"/> -->
  <!-- 偏航角,wxf手动调教的参数,还有一些误差在 -->
  <arg name="initial_pose_Y"  default="0"/><!-- 偏航角,wxf手动调教的参数,还有一些误差在 -->
  

  <arg name="init_pose" value="-x $(arg initial_pose_x) -y $(arg initial_pose_y) -Y $(arg initial_pose_Y)" />
  <!-- 迷你机器人模型 -->
  <include ns="$(arg robot_name)" file="$(find wheeltec)/launch/includes/model_wheeltec.launch.xml">
    <arg name="robot_name" value="$(arg robot_name)" />
  </include>
  
  <!-- 在gazebo中加载机器人模型-->
  <node ns="$(arg robot_name)" name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
    args="$(arg init_pose) -urdf -model $(arg robot_name) -param robot_description"/>
  
</launch>

之后就能正常调用了。

相关推荐
找方案18 小时前
2056台机器人北京集结,世界人形机器人运动会开赛
机器人·具身智能·人形机器人·机器人运动会·vla大模型·冰丝带
恒锐丰小瑞18 小时前
率能SS8841T 40V/2.5A/双通道H桥驱动芯片,PWM控制接口与低导通电阻(350mΩ),用于POS打印机/安防相机/机器人
单片机·嵌入式硬件·机器人
lancyu19 小时前
关于多轮对话机器人的上下文Token优化和解决方案
人工智能·python·深度学习·机器学习·chatgpt·机器人·prompt
YQ_011 天前
Autoware NDT 独立定位模块
机器人
机器人梦想家1 天前
具身机器人视觉服务的异步回调与并发控制
数据库·算法·机器人
TMT星球1 天前
伽利略机器人亮相WRC 2026,突破形态局限发布“陆行具身系统”Galileo X
大数据·人工智能·机器人
老兵发新帖1 天前
快速理解机器人各个坐标系的关系
机器人
老兵发新帖1 天前
机器人坐标系:各坐标系分别是谁在用,会影响谁?
机器人
极客互动API1 天前
企业微信 iPad 协议消息接口开发:文本 / 图片 / 群发消息的统一封装
人工智能·ios·微信·机器人·企业微信·ipad
老兵发新帖1 天前
机器人坐标系中:odom主要是做代价地图用?
机器人