实体机器人在gazebo中的映射

news/2025/2/27 2:01:08

这一部分目的是将真实的机器人映射到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>

之后就能正常调用了。


http://www.niftyadmin.cn/n/5869372.html

相关文章

【C++】深入理解List:双向链表的应用

凭时间赢来的东西&#xff0c;时间肯定会为之作证。 前言 这是我自己学习C的第七篇博客总结。后期我会继续把C学习笔记开源至博客上。 上一期笔记是关于C的vector类知识&#xff0c;没看的同学可以过去看看&#xff1a;【C】探索Vector&#xff1a;灵活的数据存储解决方案-CS…

图扑农牧林数据分析可视化平台:智慧农业的“数字大脑”

在现代农业的发展中&#xff0c;数据的价值不言而喻。图扑推出的农牧林数据分析可视化平台&#xff0c;正是为农业数字化转型而生。 图扑平台基于自研的HT for Web GIS技术&#xff0c;结合遥感和卫星观测&#xff0c;构建了一个完整的农牧林数据可视化生态系统。平台不仅支持地…

elfk+zookeeper+kafka​数据流

申请7台部署elfkzookeeperkafka 数据流&#xff1a; filebeat(每台app) ------>【logstash(2) kafka(3)】 -------> logstash(1) -------> 【elasticsearch(3) kibana(1)】

Redis 中有序集合(Sorted Set)的使用方法

文章目录 前言1. 有序集合的特点2. 常用命令2.1 添加元素&#xff08;ZADD&#xff09;2.2 获取元素分数&#xff08;ZSCORE&#xff09;2.3 获取元素排名&#xff08;ZRANK / ZREVRANK&#xff09;2.4 获取范围内的元素&#xff08;ZRANGE / ZREVRANGE&#xff09;2.5 获取分数…

八、Spring Boot:RESTful API 应用

创建第一个 Spring Boot RESTful API 应用 在现代 Web 开发中&#xff0c;RESTful API 是一种非常流行的设计风格&#xff0c;它基于 HTTP 协议&#xff0c;提供了简单、灵活的方式来构建网络应用。Spring Boot 作为一款强大的微服务框架&#xff0c;提供了丰富的工具和支持&a…

ubuntu 20.04系统离线安装nfs

前提 OS&#xff1a;ubuntu 20.04 LTS 1,下载对应安装包 下载地址&#xff1a; https://ubuntu.pkgs.org/20.04/ubuntu-updates-main-amd64/nfs-common_1.3.4-2.5ubuntu3.7_amd64.deb.html 也可以采用我整理好的资源&#xff1a; https://download.csdn.net/download/m0_624…

JVM可用的垃圾回收器

个人博客地址&#xff1a;JVM可用的垃圾回收器 | 一张假钞的真实世界 垃圾收集器分类 Java HotSpot VM有三种不同类型的收集器&#xff0c;每种收集器具有不同的性能特征。 串行收集器使用单个线程来执行所有垃圾收集工作&#xff0c;这使得它相对高效&#xff0c;因为线程之…

C#实现本地AI聊天功能(Deepseek R1及其他模型)。

前言 1、C#实现本地AI聊天功能 WPFOllamaSharpe实现本地聊天功能,可以选择使用Deepseek 及其他模型。 2、此程序默认你已经安装好了Ollama。 在运行前需要线安装好Ollama,如何安装请自行搜索 Ollama下载地址&#xff1a; https://ollama.org.cn Ollama模型下载地址&#xf…