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

之后就能正常调用了。

相关推荐
music&movie4 小时前
NLP工程师逐步切入机器人和具身智能方向
人工智能·自然语言处理·机器人
刘什么洋啊Zz6 小时前
使用Dify将AI机器人嵌入到你的前端页面中及chrome的扩展应用
人工智能·ai·机器人
ai_vx_33076231726 小时前
智能语音机器人为电销行业带来一场革命性的变化
人工智能·机器人·语音识别
仗剑走代码7 小时前
开源基准测试模拟器:BlueROV2 水下机器人的控制
机器人·ardusub
五行缺觉3289 小时前
ROS ur10机械臂添加140夹爪全流程记录
c++·经验分享·机器人·github·ur机械臂·moveit!
yidiancaijing13 小时前
机器人“战场”:创新、落地与未来
机器人·魔法原子
小刘私坊15 小时前
双足肌肉骨骼机器人 VS 传统钢铁结构机器人:科技新趋势与跨界创新
科技·机器人
szxinmai主板定制专家17 小时前
基于全志T536+FPGA+AI的智能服务机器人解决方案
大数据·运维·人工智能·fpga开发·机器人·边缘计算
Lionel_SSL1 天前
python脚本实现接入企微机器人
python·机器人·企业微信