从零开始,自己搭建一个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坐标系在往后退

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【点云、图像】学习中 常见的数学知识及其中的关系与python实操[更新中]

文章目录 前言一、平均值、方差、协方差平均值&#xff08;mean&#xff09;np.mean()方差&#xff08;variance&#xff09;np.var()总体方差 np.var(a, ddof0)无偏样本方差np.var(a, ddof1)有偏样本方差标准差&#xff08;standard deviation&#xff09;np.std(a, ddof1)默认…

Docker 部署考核

Docker安装 安装必要的系统工具 yum install -y yum-utils device-mapper-persistent-data lvm2 添加docker-ce安装源&#xff1a; yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 配置阿里云Docker Yum源: yum-config-manager --ad…

2024.1.19 网络编程 作业

思维导图 练习题 1> UDP传输实现聊天室 服务器端 #include <myhead.h> #define SER_IP "192.168.125.151" #define SER_PORT 9999 typedef struct Msg {char user[32]; //用户名int type; //执行操作1.登录、2.发消息、0.退出char text[1024]; …

【Flink-CDC】Flink CDC 介绍和原理概述

【Flink-CDC】Flink CDC 介绍和原理概述 1&#xff09;基于查询的 CDC 和基于日志的 CDC2&#xff09;Flink CDC3&#xff09;Flink CDC原理简述4&#xff09;基于 Flink SQL CDC 的数据同步方案实践4.1.案例 1 : Flink SQL CDC JDBC Connector4.2.案例 2 : CDC Streaming ETL…

在 Python 中检查一个数字是否是同构数

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 同构数&#xff0c;又称为自守数或自同构数&#xff0c;是一类特殊的数字&#xff0c;它们具有一种有趣的性质&#xff1a;将其平方后的数字&#xff0c;可以通过某种方式重新排列得到原来的数字。本文将详细介绍…

2024Java高频面试题之MQ消息中间件,面试都问些什么?(附详细答案)

最近很多同学问我有没有java学习资料&#xff0c;我根据我从小白到架构师多年的学习经验整理出来了一份50W字面试解析文档、简历模板、学习路线图、java必看学习书籍 、 需要的小伙伴 可以关注我公众号&#xff1a;“ Tom聊架构 ”&#xff0c; 回复暗号&#xff1a;“ 578”即…

Dockerfile镜像构建

Dockerfile镜像构建 1、部署harbor仓库 #部署docker #解压harbor安装包 rootharbor:~# cd /app/harbor/ rootharbor:/app/harbor# ll total 597560 drwxr-xr-x 3 root root 180 Jan 13 13:17 ./ drwxr-xr-x 4 root root 77 Jan 13 13:14 ../ drwxr-xr-x 3 root …

element-ui 打包流程源码解析(下)

目录 目录结构和使用1&#xff0c;npm 安装1.1&#xff0c;完整引入1.2&#xff0c;按需引入 2&#xff0c;CDN3&#xff0c;国际化 接上文&#xff1a;element-ui 打包流程源码解析&#xff08;上&#xff09; 文章中提到的【上文】都指它 ↑ 目录结构和使用 我们从使用方式来…

零基础学Python(3)— 注释、代码缩进和编码规范

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。在使用Python语言进行编程的时候&#xff0c;需要遵循一定的规范标准。本节课就带大家了解下Python语言在注释、缩进和编码方面的规范!~&#x1f308; 目录 &#x1f680;1.注释 &#x1f680;2.代码缩进 &#x1f68…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)--大模型、扩散模型、视觉导航

专属领域论文订阅 关注{晓理紫|小李子}&#xff0c;每日更新论文&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持 VX关注&#xff0c;并留下邮箱可获得每日定时推送 分类: 大语言模型LLM视觉模型VLM扩散模型视觉导航具身智能&#xff0c;机器人强化…

深入Android S (12.0) 探索Framework之输入子系统InputReader的流程

Framework层之输入系统 第一篇 深入Android S (12.0) 探索Framework之输入系统IMS的构成与启动 第二篇 深入Android S (12.0) 探索Framework之输入子系统InputReader的流程 文章目录 Framework层之输入系统前言一、基础知识1、输入子系统2、INotify 与 Epoll2.1、INotify 机制…

SpringBoot+dynamic-datasource实现多数据源(msyql、sqlserver、postgresql)手动切换

场景 SpringBootMybatisPlusdynamic-datasources实现连接Postgresql和mysql多数据源&#xff1a; SpringBootMybatisPlusdynamic-datasources实现连接Postgresql和mysql多数据源-CSDN博客 上面实现通过注解和配置文件的方式去进行多数据源操作。 如果业务需求&#xff0c;比…

Spark流式读取文件数据

流式读取文件数据 from pyspark.sql import SparkSession ss SparkSession.builder.getOrCreate() # todo 注意1&#xff1a;流式读取目录下的文件 --》一定一定要是目录&#xff0c;不是具体的文件&#xff0c;# 目录下产生新文件会进行读取# todo 注意点2&#xff1…

大模型日报-20240120

这里写目录标题 视觉Mamba来了&#xff1a;速度提升2.8倍&#xff0c;内存能省87%一键实景转动画&#xff0c;清华系初创公司全球首发4D骨骼动画框架&#xff0c;还能生成个性化角色如何利用革命性的蛋白质结构工具来发现药物&#xff1f;AlphaFold 发现了数千种可能的致幻剂扎…

Unity关于纹理图片格式带来的内存问题和对预制体批量格式和大小减半处理

我们经常会遇到内存问题&#xff0c;这次就是遇到很多图片的默认格式被改成了RGB32&#xff0c;导致Android打包后运行内存明显增加。 发生了什么 打包Android后&#xff0c;发现经常崩溃&#xff0c;明显内存可能除了问题&#xff0c;看了内存后发现了问题。 见下图&#xf…

1.C语言——基础知识

C语言基础知识 1.第一个C语言程序2.注释3.标识符4.关键字5.数据类型6.变量7.常量8.运算符9.输入输出输入输出 1.第一个C语言程序 C语言的编程框架 #include <stdio.h> int main() {/* 我的第一个 C 程序 */printf("Hello, World! \n");return 0; }2.注释 单行…

【Qt5】QString的成员函数chop

2024年1月19日&#xff0c;周五下午 QString 的 chop 方法用于从字符串的末尾移除指定数量的字符。这个方法会修改原始字符串&#xff0c;并返回 void。 下面是一个简单的示例&#xff1a; #include <QString> #include <QDebug>int main() {QString originalStr…

Jetson AGX Orin安装archiconda、Pytorch

想在Jetson AGX Orin创建一个虚拟环境&#xff0c;然后安装pytorch&#xff0c;过程中遇到了很多的坑&#xff0c;这篇文章主要用于记录过程~因为Orin本身是Arm架构&#xff0c;X86架构可以装Anaconda&#xff0c;对于ARM要装archiconda。 1.安装archiconda 1.1确定操作系统架…

KBP206-ASEMI小功率家用电源KBP206

编辑&#xff1a;ll KBP206-ASEMI小功率家用电源KBP206 型号&#xff1a;KBP206 品牌&#xff1a;ASEMI 正向电流&#xff08;Id&#xff09;&#xff1a;2A 反向耐压&#xff08;VRRM&#xff09;&#xff1a;600V 正向浪涌电流&#xff1a;60A 正向电压&#xff08;V…

BeanUtils工具类简介

BeanUtils工具类 一、简介 ​ BeanUtils 是 Apache commons组件的成员之一&#xff0c;主要用于简化JavaBean封装数据的操作。可以将一个表单提交的所有数据封装到JavaBean中。 二、pom依赖 <dependency><groupId>commons-beanutils</groupId><artifa…