从零开始,自己搭建一个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…

docker 挂载的文件同步问题 及 telnet redis账号可用

在一台新的服务器上部署docker发现redis服务因白名单没配不通&#xff0c;可以通过telnet来进行测试&#xff0c;包括账号是否可用&#xff1a; 1 telnet 192.168.1.11 6379 # ip port 2 ctrl ] 3 回车 4 键入 auth 111111 # 密码 5 成功 OK 失败 -WRONGPASS invalid us…

UE学习笔记--如何区分FString、FName、FText,以及使用场景

目录 前言FStringFNameFTextFString、FName 和 Text 之间的区别可变性内存开销用例表现本地化支持 结论参考链接 前言 最近在学习 UE&#xff0c;发现 UE 基本没有用到 std::string&#xff0c;基本使用的是FString、FName、FText。去网络上查了些资料并且学习了下&#xff0c…

Numpy中的矩阵运算

一、Matrix和Array Matrix名为矩阵&#xff0c;Array名为阵列&#xff0c;它们都可以作为矩阵运算的结构&#xff0c;功能上Matrix是Array的子集&#xff0c;Matrix运算符相较于Array简单。本文章主要讲解Numpy中的Matrix和Array关于矩阵运算的区别&#xff0c;代码部分已经给出…

Mysql数据库:快速入门

目录 一. 介绍 1. 数据库基础概念 2 MySQL简介 二. 安装与配置 1. 下载与安装 MySQL 2. 配置 MySQL 三. 基本操作 1. 数据库的创建与删除 3 数据操作语言&#xff08;DML&#xff09; 4 数据查询语言&#xff08;DQL&#xff09; 5 数据控制语言&#xff08;DCL&…

年终总结:我的2023编程之旅

1. 成果回顾 在这一年中&#xff0c;我成功地完成了多个项目&#xff0c;其中最重要的是我们团队开发的“智能数据分析平台”。我负责了后端开发的核心部分&#xff0c;该平台目前每天处理超过100万条数据&#xff0c;为我们的客户提供了宝贵的信息和建议。同时&#xff0c;我…

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;可以通过某种方式重新排列得到原来的数字。本文将详细介绍…

Java读取制表符文本转换为JSON

在Java开发中&#xff0c;处理各种数据格式是常见的任务。本文将介绍如何使用Java读取制表符文本文件&#xff0c;并将其转换为JSON格式&#xff0c;以便于后续的数据处理和分析。我们将使用Java中的相关库来实现这个过程&#xff0c;并提供详细的代码示例。 引言&#xff1a;…

4654. 消除游戏

4654. 消除游戏 - AcWing题库 #include <iostream> #include <vector> #include <cstring> using namespace std;const int N 1e6 10; char s[N]; int l[N], r[N]; vector<int> v, p; bool st[N]; void ins(int i) {if (st[i]) return;st[i] true;…

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;机器人强化…

网络爬虫原理介绍

网络爬虫是一种按照一定规则自动浏览、检索网页信息的程序或者脚本。它能够自动请求网页&#xff0c;并将所需要的数据抓取下来。通过对抓取的数据进行处理&#xff0c;从而提取出有价值的信息。 Python 爬虫是指用 Python 语言编写的网络爬虫程序。Python 爬虫几乎成了网络爬…

Mysql三种常用的删除方式

前言 在 MySQL 中&#xff0c;有三种常用的方式可以删除表中的数据或整个表&#xff0c;它们分别是 TRUNCATE、DROP 和 DELETE。 TRUNCATE TABLE TRUNCATE TABLE属于DDL语言&#xff0c;不走事务&#xff0c;数据不会回滚 TRUNCATE TABLE 语句会删除表中的所有数据&#xff…

深入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 机制…