实体机器人在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>

之后就能正常调用了。

相关推荐
曹勖之6 小时前
在 UE5 蓝图中配置Actor类型的Asset以作为位置和旋转设置目标
ue5·机器人
曹勖之6 小时前
UE 5 和simulink联合仿真,如果先在UE5这一端结束Play,过一段时间以后**Unreal Engine 5** 中会出现显存不足错误
matlab·ue5·机器人
曹勖之8 小时前
撰写脚本,通过发布/joint_states话题改变机器人在Rviz中的关节角度
开发语言·python·机器人·ros2
奔跑吧邓邓子12 小时前
DeepSeek 赋能智能养老:情感陪伴机器人的温暖革新
人工智能·机器人·deepseek·智能养老·情感陪伴
VR最前沿15 小时前
全新Xsens Animate版本是迄今为止最大的软件升级,提供更清晰的数据、快捷的工作流程以及从录制开始就更直观的体验
人工智能·科技·机器人·自动化
CHOTEST中图仪器15 小时前
激光干涉仪:解锁协作机器人DD马达的精度密码
机器人·激光干涉仪
Tisfy16 小时前
LeetCode 2434.使用机器人打印字典序最小的字符串:贪心(栈)——清晰题解
leetcode·机器人·字符串·题解·贪心·
敢敢のwings16 小时前
论文速读《DexWild:野外机器人策略的灵巧人机交互》
机器人·人机交互
AiTEN_Robotics1 天前
仓库自动化搬运:自动叉车与AGV选型要点及核心技术解析
人工智能·机器人·自动化
FREEDOM_X1 天前
新版NANO下载烧录过程
ubuntu·机器人