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

之后就能正常调用了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/978023.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

8、HTTP/1.0和HTTP/1.1的区别【高频】

第一个是 长连接&#xff1a; HTTP/1.0 默认 短连接&#xff0c;&#xff08;它也可以指定 Connection 首部字段的值为 Keep-Alive实现 长连接&#xff09;而HTTP/1.1 默认支持 长连接&#xff0c;HTTP/1.1是基于 TCP/IP协议的&#xff0c;创建一个TCP连接是需要经过三次握手的…

kafka-leader -1问题解决

一. 问题&#xff1a; 在 Kafka 中&#xff0c;leader -1 通常表示分区的领导者副本尚未被选举出来&#xff0c;或者在获取领导者信息时出现了问题。以下是可能导致出现 kafka leader -1 的一些常见原因及相关分析&#xff1a; 1. 副本同步问题&#xff1a; 在 Kafka 集群中&…

stm32hal库寻迹+蓝牙智能车(STM32F103C8T6)

简介: 这个小车的芯片是STM32F103C8T6&#xff0c;其他的芯片也可以照猫画虎,基本配置差不多,要注意的就是,管脚复用,管脚的特殊功能,(这点不用担心,hal库每个管脚的功能都会给你罗列,很方便的.)由于我做的比较简单,只是用到了几个简单外设.主要是由带霍尔编码器电机的车模,电机…

使用DeepSeek/ChatGPT等AI工具辅助编写wireshark过滤器

随着deepseek,chatgpt等大模型的能力越来越强大&#xff0c;本文将介绍借助deepseek&#xff0c;chatgpt等大模型工具&#xff0c;通过编写提示词&#xff0c;辅助生成全面的Wireshark显示过滤器的能力。 每一种协议的字段众多&#xff0c;流量分析的需求多种多样&#xff0c;…

飞鱼科技游戏策划岗内推

协助策划完成相关工作&#xff0c;包括但不仅限于策划配置&#xff0c;资料搜集&#xff0c;游戏体验&#xff1b; 游戏策划相关作品&#xff1b;游戏大赛经历&#xff1b;游戏demo制作经历&#xff1b;游戏公司策划岗位实习经历优先 内推码 DSZP7YFU

解决中文乱码:字符编码全攻略 - ASCII、Unicode、UTF-8、GB2312详解

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

Mesh自组网技术及应用

前言&#xff1a; Mesh自组网随着无线技术发展&#xff0c;在消费领域最近比较有热度。当然应用的场景不限于普通消费领域&#xff0c;在工业、军事领域被也是越来越重要。 一、什么是无线Mesh技术 1.1 无线自组网概念 无线Mesh是一种智能、自组织、多跳、移动、对等、去中心…

滑动验证组件-微信小程序

微信小程序-滑动验证组件&#xff0c;直接引用就可以了&#xff0c;效果如下&#xff1a; 组件参数&#xff1a; 1.enable-close&#xff1a;是否允许关闭&#xff0c;默认true 2.bind:onsuccess&#xff1a;验证后回调方法 引用方式&#xff1a; <verification wx:if&qu…

11.Docker 之分布式仓库 Harbor

Docker 之分布式仓库 Harbor Docker 之分布式仓库 Harbor1. Harbor 组成2. 安装 Harbor Docker 之分布式仓库 Harbor Harbor 是一个用于存储和分发 Docker 镜像的企业级 Registry 服务器&#xff0c;由 VMware 开源&#xff0c;其通过添加一些企业必需的功能特性&#xff0c;例…

(一)趣学设计模式 之 单例模式!

目录 一、啥是单例模式&#xff1f;二、为什么要用单例模式&#xff1f;三、单例模式怎么实现&#xff1f;1. 饿汉式&#xff1a;先下手为强&#xff01; &#x1f608;2. 懒汉式&#xff1a;用的时候再创建&#xff01; &#x1f634;3. 枚举&#xff1a;最简单最安全的单例&a…

Chrome 浏览器(版本号49之后)‌解决跨域问题

谷歌浏览器解决跨域问题 如何查看 Chrome 浏览器版本号 打开 Chrome 浏览器点击右上角的三个点&#xff0c;打开“设置”页面 点击“关于Chrome” 查看版本号 解决跨域操作&#xff1a;windows系统为例 方法一&#xff1a;命令行启动方式&#xff08;最简单&#xff09; …

python中的JSON数据格式

文章目录 什么是json主要功能Python数据和Json数据的相互转化 什么是json JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去组织和封装数据。JSON本质上是一个带有特定格式的字符串。 主要功能 json就是一种在各个编程语言中流通的数据格式&#xff0c;负责不同编…

汽车智能制造企业数字化转型SAP解决方案总结

一、项目实施概述 项目阶段划分&#xff1a; 蓝图设计阶段主数据管理方案各模块蓝图设计方案下一阶段工作计划 关键里程碑&#xff1a; 2022年6月6日&#xff1a;项目启动会2022年12月1日&#xff1a;系统上线 二、总体目标 通过SAP实施&#xff0c;构建研产供销协同、业财一…

JavaWeb-在idea中配置Servlet项目

文章目录 在idea中进行Servlet项目的配置(较新的idea版本)创建一个空的JavaSE项目(Project)创建一个普通的JavaSE板块(module)添加Web项目的配置定义一个对象模拟实现接口在web.xml中配置路径映射配置项目到Tomcat服务器启动Tomcat服务器进行测试 在idea中进行Servlet项目的配置…

【深度学习神经网络学习笔记(二)】神经网络基础

神经网络基础 神经网络基础前言1、Logistic 回归2、逻辑回归损失函数3、梯度下降算法4、导数5、导数计算图6、链式法则7、逻辑回归的梯度下降 神经网络基础 前言 Logistic 回归是一种广泛应用于统计学和机器学习领域的广义线性回归模型&#xff0c;主要用于解决二分类问题。尽…

力扣hot100 —— 电话号码字母组合; 子集 (非回溯做法)简单易懂

由于博主对回溯也不是很熟悉&#xff0c;这里提出一种简单易懂的解法&#xff08;有点暴力&#xff09; 解题思路&#xff1a; 每个数字对应有自己的字母串&#xff1b; 首先遍历将每个字母存入也就是 res{{a},{b},{c}} 然后遍历后续数子对应的字母&#xff0c;让每个字母与…

React 源码揭秘 | 更新队列

前面几篇遇到updateQueue的时候&#xff0c;我们把它先简单的当成了一个队列处理&#xff0c;这篇我们来详细讨论一下这个更新队列。 有关updateQueue中的部分&#xff0c;可以见源码 UpdateQueue实现 Update对象 我们先来看一下UpdateQueue中的内容&#xff0c;Update对象&…

解锁养生密码,拥抱健康生活

在快节奏的现代生活中&#xff0c;养生不再是一种选择&#xff0c;而是我们保持活力、提升生活质量的关键。它不是什么高深莫测的学问&#xff0c;而是一系列融入日常的简单习惯&#xff0c;每一个习惯都在为我们的健康加分。 早晨&#xff0c;当第一缕阳光洒进窗户&#xff0c…

muduo网络库2

Muduo网络库&#xff1a;底层实质上为Linux的epoll pthread线程池&#xff0c;且依赖boost库。 muduo的网络设计核心为一个线程一个事件循环&#xff0c;有一个main Reactor负载accept连接&#xff0c;然后把连接分发到某个sub Reactor(采用轮询的方式来选择sub Reactor)&…