从零开始,自己搭建一个autonomous mobile robot做gazebo仿真(1):mobile robot建模与添加差速控制器

这样一个简单的mobile robot模型

 首先写xacro文件,创建 link joint transmission

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="whill_modelc" >

    <xacro:property name="PI" value="3.1415926"/>

    <link name="base_link">
        <visual>
            <geometry>
                <sphere radius="0.001" />
            </geometry>
        </visual>
    </link>

    <link name="base_floor">
        <visual>
            <geometry>
                <box size="0.600 0.400 0.050"/>
            </geometry>
            <material name="grey">
                <color rgba="0.5 0.5 0.5 1.0"/>
            </material>
        </visual>

        <collision>
            <geometry>
                <box size="0.600 0.400 0.050"/>
            </geometry>
        </collision>

        <inertial>
            <origin xyz="0 0 0" rpy="0 0 0" />
            <mass value="40" />
            <inertia ixx="1.0"  ixy="0.0"   ixz="0.0"
                                iyy="1.0"   iyz="0.0"
                                            izz="1.0" />
        </inertial>
    </link>

    <joint name="base_body_joint" type="fixed">
        <parent link="base_link" />
        <child link="base_floor" />
        <origin xyz="0.3 0 0.0" rpy="0 0 0"/>
    </joint>


    <link name="footrest_link">
        <collision>
            <geometry>
                <box size="0.250 0.260 0.050"/>
            </geometry>
        </collision>
        <visual>
            <geometry>
                <box size="0.250 0.260 0.050"/>
            </geometry>
            <material name="grey">
                <color rgba="0.5 0.5 0.5 1.0"/>
            </material>
        </visual>
        <inertial>
            <origin xyz="0 0 0" rpy="0 0 0" />
            <mass value="1" />
            <inertia ixx="1.0"  ixy="0.0"   ixz="0.0"
                                iyy="1.0"   iyz="0.0"
                                            izz="1.0" />
        </inertial>
    </link>

    <joint name="footrest_joint" type="fixed">
        <parent link="base_floor" />
        <child link="footrest_link" />
        <origin xyz="0.320 0 0" rpy="0 0 0"/>
    </joint>

    <link name="left_wheel_link">
        <visual>
            <geometry>
                <cylinder length="0.05" radius="0.1325"/>
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
            <material name="black" />
        </visual>

        <collision>
            <geometry>
                <cylinder length="0.05" radius="0.1325"/>
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
        </collision> 

        <inertial>
            <mass value="0.500"/>
            <inertia ixx="0.0013541667" ixy="0" ixz="0" iyy="0.0013541667" iyz="0" izz="0.0025"/>
        </inertial>
    </link>


    <joint name="leftWheel" type="continuous">
        <parent link="base_floor" />
        <child link="left_wheel_link" />
        <origin xyz="-0.3 0.245 0" rpy="${-PI / 2} 0.0 0.0" />
        <axis xyz="0 0 1" />
    </joint>


    <link name="right_wheel_link">
        <visual>
            <geometry>
                <cylinder length="0.05" radius="0.1325"/>
            </geometry>
            <origin xyz="0 0 0" rpy="0 0 0" />
            <material name="black" />
        </visual>
        <collision>
            <geometry>
                <cylinder length="0.05" radius="0.1325"/>
            </geometry>
            <origin xyz="0 0 0" rpy="0.0 0.0 0.0" />
        </collision>
        
        <inertial>
            <mass value="0.500"/>
            <inertia ixx="0.0013541667" ixy="0" ixz="0" iyy="0.0013541667" iyz="0" izz="0.0025"/>
        </inertial>
    </link>

    <joint name="rightWheel" type="continuous">
        <parent link="base_floor" />
        <child link="right_wheel_link" />
        <origin xyz="-0.3 -0.245 0" rpy="${-PI / 2} 0.0 0.0" />
        <axis xyz="0 0 1" />
    </joint>


    <link name="frontwheel_left">
        <collision>
            <geometry>
                <cylinder length="0.05" radius="0.1325"/>
            </geometry>
        </collision>

        <visual>
            <geometry>
                <cylinder length="0.05" radius="0.1325"/>
            </geometry>
            <material name="black" />
        </visual>

        <inertial>
            <origin xyz="0 0 0" rpy="0 0 0" />
            <mass value="1.0" />
            <inertia ixx="1.0"  ixy="0.0"   ixz="0.0"
                                iyy="1.0"   iyz="0.0"
                                            izz="1.0" />
        </inertial>
    </link>
    
    <joint name="frontwheel_left_joint" type="fixed">
        <parent link="base_floor" />
        <child link="frontwheel_left" />
        <origin xyz="0.3 -0.245 0" rpy="1.57 0 0" />
        <axis xyz="0 0 1" />
    </joint>



    <link name="frontwheel_right">
        <collision>
            <geometry>
                <cylinder length="0.05" radius="0.1325"/>
            </geometry>
        </collision>

        <visual>
            <geometry>
                <cylinder length="0.05" radius="0.1325"/>
            </geometry>
            <material name="black" />
        </visual>

        <inertial>
            <origin xyz="0 0 0" rpy="0 0 0" />
            <mass value="1.0" />
            <inertia ixx="1.0"  ixy="0.0"   ixz="0.0"
                                iyy="1.0"   iyz="0.0"
                                            izz="1.0" />
        </inertial>    
    </link>

    <joint name="frontwheel_right_joint" type="fixed">
        <parent link="base_floor" />
        <child link="frontwheel_right"/>
        <origin xyz="0.3 0.245 0" rpy="1.57 0 0" />
        <axis xyz="0 0 -1" />
    </joint>


    <!-- ===============  Transmission =============== -->

    <transmission name="right_wheel_trans">
        <type>transmission_interface/SimpleTransmission</type>
        <joint name="rightWheel">
            <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
        </joint>
        <actuator name="right_wheel_motor">
            <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
            <mechanicalReduction>30</mechanicalReduction>
        </actuator>
    </transmission>

    <transmission name="left_wheel_trans">
        <type>transmission_interface/SimpleTransmission</type>
        <joint name="leftWheel">
            <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
        </joint>
        <actuator name="left_wheel_motor">
            <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
            <mechanicalReduction>30</mechanicalReduction>
        </actuator>
    </transmission>

    <gazebo reference="base_floor">
        <selfCollide>true</selfCollide>
        <mu1 value="0.05" />
        <mu2 value="0.05" />
    </gazebo>

    <gazebo reference="sensor_arm_link">
        <selfCollide>true</selfCollide>
        <mu1 value="0.05" />
        <mu2 value="0.05" />
    </gazebo>

    <gazebo reference="rearwheel_right">
        <selfCollide>true</selfCollide>
        <mu1 value="1.0" />
        <mu2 value="1.0" />
    </gazebo>

    <gazebo reference="rearwheel_left">
        <selfCollide>true</selfCollide>
        <mu1 value="1.0" />
        <mu2 value="1.0" />
    </gazebo>

    <gazebo reference="frontwheel_right">
        <selfCollide>true</selfCollide>
        <mu1 value="0.0" />
        <mu2 value="0.0" />
    </gazebo>

    <gazebo reference="frontwheel_left">
        <selfCollide>true</selfCollide>
        <mu1 value="0.0" />
        <mu2 value="0.0" />
    </gazebo>

</robot>

创建xcaro模型时,下面几个地方要注意:

(1)

车轮是一个cylinder link,

<link name="right_wheel_link">
        <visual>
            <geometry>
                <cylinder length="0.05" radius="0.1325"/>
            </geometry>
            <origin xyz="0 0 0" rpy="0 0 0" />
            <material name="black" />
        </visual>
        <collision>
            <geometry>
                <cylinder length="0.05" radius="0.1325"/>
            </geometry>
            <origin xyz="0 0 0" rpy="0.0 0.0 0.0" />
        </collision>

link的局部坐标系原点在这个物体的形心右手坐标系

<joint name="rightWheel" type="continuous">
        <parent link="base_floor" />
        <child link="right_wheel_link" />
        <origin xyz="-0.3 -0.245 0" rpy="${-PI / 2} 0.0 0.0" />
        <axis xyz="0 0 1" />
    </joint>

车轮在跟父link连接的时候,放在父link局部坐标系中-0.3 -0.245 0这个位置,然后绕child link自己的X轴转-90度(rpy=-pi/2 0 0),也就是这样转下来,原来的z轴转到原来的y轴位置

<axis xyz="0 0 1" />

这句话的意思是,这个物体绕自己的z轴旋转(注意z轴已经有刚才的 rpy命令移动了) 。

注意左右车轮的z轴正向要是一致的,否则会出现,你给往前走的指令,robot旋转,你给旋转的指令,robot反而向前走直线!

transmission是给车轮绑定一个gazebo中的电机

然后在transmission下面加入一个双轮差速控制器

<gazebo>
        <plugin name="differential_drive_controller" filename="libgazebo_ros_diff_drive.so">
            <rosDebugLevel>Debug</rosDebugLevel>
            <publishWheelTF>true</publishWheelTF>
            <robotNamespace>/</robotNamespace>
            <publishTf>1</publishTf>
            <publishWheelJointState>true</publishWheelJointState>
            <alwaysOn>true</alwaysOn>
            <updateRate>100.0</updateRate>
            <legacyMode>true</legacyMode>
            <leftJoint>leftWheel</leftJoint> <!-- 左轮 -->
            <rightJoint>rightWheel</rightJoint> <!-- 右轮 -->
            <wheelSeparation>0.49</wheelSeparation> <!-- 车轮间距 -->
            <wheelDiameter>0.265</wheelDiameter> <!-- 车轮直径 -->
            <broadcastTF>false</broadcastTF>
            <wheelTorque>30</wheelTorque>
            <wheelAcceleration>1.8</wheelAcceleration>
            <commandTopic>cmd_vel</commandTopic> <!-- 运动控制话题 -->
            <odometryFrame>odom</odometryFrame> 
            <odometryTopic>odom</odometryTopic> <!-- 里程计话题 -->
            <robotBaseFrame>base_link</robotBaseFrame> <!-- 根坐标系 -->
        </plugin>
    </gazebo>

在给双轮差速器发送控制指令的时候,topic是robotNamespace+commandTopic,具体来说,robotNamespace是 / ,commandTopic是 cmd_vel,那就要发送 /cmd_vel,如果robotNamespace是 /robot,那就要发送 /robot/cmd_vel

下一步写luanch文件

<launch>

  <!-- these are the arguments you can pass this launch file, for example paused:=true -->
  <arg name="paused" default="false"/>
  <arg name="use_sim_time" default="true"/>
  <arg name="gui" default="true"/>
  <arg name="headless" default="false"/>
  <arg name="debug" default="false"/>

  <!-- We resume the logic in empty_world.launch -->
  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <arg name="debug" value="$(arg debug)" />
    <arg name="gui" value="$(arg gui)" />
    <arg name="paused" value="$(arg paused)"/>
    <arg name="use_sim_time" value="$(arg use_sim_time)"/>
    <arg name="headless" value="$(arg headless)"/>
  </include>

  <!-- Load the URDF into the ROS Parameter Server -->
  <param name="robot_description" command="$(find xacro)/xacro '$(find ros_whill)/xacro/modelc.xacro'" /> 


  <!-- Run a python script to the send a service call to gazebo_ros to spawn a URDF robot -->
  <node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
  args="-urdf -model whill_modelc -param robot_description"/> 

  <!-- 运行joint_state_publisher节点,发布机器人的关节状态  -->
  <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
  
  <!-- 运行robot_state_publisher节点,发布tf  -->
  <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher">
    <remap from="/joint_states" to="/whill_modelc/joint_states" />
  </node>

 
</launch>

用rqt发送控制指令,rviz可视化,rviz可视化的时候,注意 Fixed Frame是odom

不然就会看到,robot在rviz中不动,odom坐标系在往后退

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

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

相关文章

JS-元素尺寸与位置

通过js的方式&#xff0c;得到元素在页面中的位置 获取宽高 元素.offsetWidth 元素.offsetHeight 1&#xff09;获取元素的自身宽高、包括元素自身设置的宽高paddingborder 2&#xff09;获取出来的是数值&#xff0c;方便计算 3&#xff09;注意&#xff1a;获取的是可视…

(2023版)斯坦福CS231n学习笔记:DL与CV教程 (14) | 强化学习(Robot Learning)

前言 &#x1f4da; 笔记专栏&#xff1a;斯坦福CS231N&#xff1a;面向视觉识别的卷积神经网络&#xff08;23&#xff09;&#x1f517; 课程链接&#xff1a;https://www.bilibili.com/video/BV1xV411R7i5&#x1f4bb; CS231n: 深度学习计算机视觉&#xff08;2017&#xf…

【Unity】URP报错Object reference not set to an instance of an object

使用URP之后&#xff0c;Unity报错&#xff1a;显示不正常 NullReferenceException: Object reference not set to an instance of an object UnityEngine.Rendering.Universal.UniversalAdditionalCameraData.get_cameraStack () (at Library/PackageCache/com.unity.render-p…

富士康在印度受挫,在郑州建设新能源汽车工厂,还是中国制造可靠

日前消息指富士康宣布在郑州建设新能源汽车工厂&#xff0c;此前它一直推动印度制造&#xff0c;如此做法形成了鲜明对比&#xff0c;这显示出富士康在印度多番努力之后&#xff0c;终于还是认清了现实&#xff0c;印度难以担起富士康的事业。 此前富士康大举向印度转移的是手机…

可视化k8s页面(Kubepi)

Kubepi是一个简单高效的k8s集群图形化管理工具&#xff0c;方便日常管理K8S集群&#xff0c;高效快速的查询日志定位问题的工具 随便在哪个节点部署&#xff0c;我这里在主节点部署 docker pull kubeoperator/kubepi-server docker run --privileged -itd --restartunless-st…

探索curl的高级应用:HTTP请求的大师级技巧

探索curl的高级应用&#xff1a;HTTP请求的大师级技巧 引言高级用法概览1. HTTP请求与响应处理2. 身份验证与安全3. 进阶技巧4. Cookie管理与会话保持5. 脚本自动化 HTTP请求与响应处理1. 自定义请求头2. 发送数据3. 处理响应 身份验证与安全1. 基本认证2. 摘要认证3. HTTPS安全…

力扣:494. 目标和(动态规划)(01背包)

题目&#xff1a; 给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 ‘’ 或 ‘-’ &#xff0c;然后串联起所有整数&#xff0c;可以构造一个 表达式 例如&#xff0c;nums [2, 1] &#xff0c;可以在 2 之前添加 ‘’ &#xff0c;在 1 之前添加…

独立服务器和云服务器的区别

独立服务器和云服务器的区别是很多用户在选择服务器时要做的课程&#xff0c;那么独立服务器和云服务器的区别有哪些呢? 独立服务器和云服务器是两种不同的服务器部署方式&#xff0c;它们在性能、成本、资源利用、安全性和维护等方面存在显著差异。 1. **性能对比**&#xff…

【CentOS 7联网】手把手解决CentOS7虚拟机的网络连接问题

在安装CentOS7虚拟机之后发现连不上网络&#xff0c;捣鼓了好久都没有弄好&#xff0c;一路上走了很多弯路&#xff0c;希望我的经验能够帮助到大家。这里我是通过NAT连接配置静态网络的方式来连接的。 本机&#xff1a;windows1 虚拟机&#xff1a;centos7 x86_64 网络连接…

Java 应用部署包优化经验分享

背景 最近接手了一个 2018 年的老项目&#xff0c;因为太久远了&#xff0c;功能上的代码不敢乱动&#xff0c;虽然是老项目&#xff0c;但最近一年也在持续加功能&#xff0c;功能不稳定&#xff0c;于是我就进入了救火式改 Bug 的状态。 功能不能妄动&#xff0c;但是这个项…

yum配置文件及NFS共享

一 yum配置文件及命令 1 /etc/yum.conf //主配置文件 2 /etc/yum.repos.d/*.repo //yum仓库文件位置 写错一个字母就不行&#xff0c;可以ping www.google.com 测试网络 3 /var/log/yum.log //日志文件 二 yum命令 1 [rootlocalhost ~…

“盲盒+互联网”模式下的盲盒小程序带来了哪些机遇?

近几年&#xff0c;盲盒逐渐兴起&#xff0c;深受大众的喜爱。盲盒中拥有各类随机商品&#xff0c;包括玩偶手办等&#xff0c;让消费者无法自拨。盲盒拥有神秘感和不确定性&#xff0c;消费者在购买前并不知道盲盒中是什么商品&#xff0c;因此具有较大的惊喜感&#xff0c;能…

SpringBoot+beetl idea热更新解决方案

SpringBootbeetl idea热更新解决方案 第一在application中开启&#xff1a; beetl:resource-auto-check: true #热加载beetl模板&#xff0c;开发时候用第二在application中开启&#xff1a; devtools: 这个部分专门用于配置Spring Boot DevTools的相关参数。DevTools…

【LeetCode】数学精选4题

目录 1. 二进制求和&#xff08;简单&#xff09; 2. 两数相加&#xff08;中等&#xff09; 3. 两数相除&#xff08;中等&#xff09; 4. 字符串相乘&#xff08;中等&#xff09; 1. 二进制求和&#xff08;简单&#xff09; 从字符串的右端出发向左做加法&#xff0c;…

记录::关键点检测数据转化和可视化LSP、FLIC转yolov8-pose的txt

最近想试一下关键点检测的效果&#xff0c;先从yolov8-pose开始&#xff0c;不想跑coco那么大的数据集&#xff0c;就找了两个比较小的 yolov8-pose的txt数据格式如下&#xff1a; 类别、box、节点&#xff0c;数据做了归一化 可视化只显示了点&#xff0c;没有连线 参数&…

day23 修剪二叉搜索树 将有序数组转换为二叉搜索树 将二叉搜索树转换为累加树

题目1&#xff1a;669 修剪二叉搜索树 题目链接&#xff1a;669 修剪二叉搜索树 题意 将二叉搜索树的节点值修剪到[low,high]这个范围内 递归 递归三部曲&#xff1a; 1&#xff09;递归函数的参数和返回值 2&#xff09;终止条件 3&#xff09;单层递归逻辑 代码 /**…

Cobbler部署(PXE二次封装)

文章目录 Cobbler 部署一、Cobbler简介二、Cobbler的工作原理三、Cobbler安装1、操作过程命令格式2、cobbler安装图文详解 Cobbler 部署 一、Cobbler简介 Cobbler是一款Linux生态的自动化运维工具&#xff0c;基于Python2开发&#xff0c;用于自动化批量部署安装操作系统&…

MySQL运维篇(二)主从复制

一、概述 主从复制是指将主数据库的 DDL 和 DML 操作通过 二进制日志 传到从库服务器中&#xff0c;然后在从库上对这些日志重新执行&#xff08;也叫重做&#xff09;&#xff0c;从而使得从库和主库的数据保持同步。 MySQL 支持一台主库同时向多台从库进行复制&#xff0c; 从…

网络安全防护部署所需要注意的几点

顶层设计概念 考虑项目各层次和各要素&#xff0c;追根溯源&#xff0c;统揽全局&#xff0c;在最高层次上寻求问题的解决之道 顶层设计”不是自下而上的“摸着石头过河”&#xff0c;而是自上而下的“系统谋划” 网络安全分为 物理、网络、主机、应用、管理制度 边界最强 接…

springboot109新闻稿件管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的新闻稿件管理系统 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获…