[ROS 系列学习教程] 建模与仿真 - 使用 Arbotix 控制机器人

ROS 系列学习教程(总目录)
本文目录
- 一、Arbotix 简介
- 二、安装Arbotix
- 三、配置Arbotix控制器
- 四、配置launch启动文件
- 五、数据交互接口
- 六、在rviz中仿真控制机器人
- 6.1 直接发topic控制
- 6.2 使用键盘控制
- 6.3 编写代码控制机器人移动
前面讲了机器人的建模,是静态的,接下来介绍对机器人的仿真控制,让你的机器人动起来。
一、Arbotix 简介
Arbotix 是一款控制电机、舵机的硬件控制板,并提供相应的 ros 功能包,是一款基于 ROS的机器人控制系统,它旨在为小型机器人提供硬件控制和传感器接口,以便于机器人的运动和感知。它不仅可以驱动真实的 arbotix 控制板,还提供一个差速控制器,通过接收速度控制指令更新机器人的 joint 状态,从而帮助我们实现机器人在仿真环境中的运动。
它的源代码可以在这个里得到:https://github.com/vanadiumlabs/arbotix_ros
arbotix_ros 源码包含如下几部分:

其中,
arbotix_controllers:控制器,现已合并到arbotix_python中。arbotix_firmware:处理与 ArbotiX-ROS 绑定通信的固件源代码。arbotix_msgs:ArbotiX 的消息和服务定义。arbotix_python:驱动程序、用于与驱动程序交互的 GUI 以及用于设置伺服电器的终端工具。arbotix_sensors:包含几个传感器模块,可在 arbotix_python 的基本结构上添加额外的 ROS 接口层。
我们主要使用 arbotix_python 的驱动程序模块 arbotix_driver 中的差速底盘控制器 diff_controller。
更多关于 Arbotix 的信息见 https://wiki.ros.org/arbotix
关于 diff_controller 的信息见 http://wiki.ros.org/arbotix_python/diff_controller
二、安装Arbotix
对于 ROS1 ,有两种安装方法,命令行和源码安装。
-
命令行安装
sudo apt install ros-<<VersionName()>>-arbotix* -
源码安装
首先在你的工作空间的
src目录下下载源代码:git clone https://github.com/vanadiumlabs/arbotix_ros.git然后编译即可使用
Arbotixcatkin_make # 编译
三、配置Arbotix控制器
Arbotix 针对不同的机器人,需要配置不同的控制器,配置文件为 yaml 格式,如下:
# 该文件是控制器配置,一个机器人模型可能有多个控制器,比如: 底盘、机械臂、夹持器(机械手)....
# 因此,根 name 是 controllers
controllers: {# 单控制器设置base_controller: {# 类型: 差速控制器type: diff_controller,# 参考坐标base_frame_id: base_link,# 两个轮子之间的间距,单位:mbase_width: 0.38,# 机器人每移动一米,电机编码器所记录的脉冲数ticks_meter: 2000,# PID控制参数,使机器人车轮快速达到预期速度Kp: 12,Kd: 12,Ki: 0,Ko: 50,# 加速度限制accel_limit: 1.0}
}
四、配置launch启动文件
启动时 Arbotix 会作为一个节点加入到 ROS Master 中,我们使用 launch 文件配置快速启动。
<node name="arbotix" pkg="arbotix_python" type="arbotix_driver" output="screen"><rosparam file="$(find simulation_learning)/config/mbot_arbotix.yaml" command="load" /><param name="sim" value="true"/>
</node>
其中,节点名注册为 arbotix,包名为 arbotix_python,节点可执行文件名为 arbotix_driver;rosparam 一行是载入上文的 Arbotix 配置文件;Arbotix 不仅可以用于真实控制板,也可以用于仿真环境,如用于仿真,需将参数 sim 设置为 true。
五、数据交互接口
该节点订阅一个话题:/cmd_vel,用于接收对机器人的速度控制信息
消息格式为:geometry_msgs/Twist
geometry_msgs/Vector3 linear # 机器人三轴线速度float64 xfloat64 yfloat64 z
geometry_msgs/Vector3 angular # 机器人三轴角速度float64 xfloat64 yfloat64 z
发布一个话题:/odom,用于发布机器人里程计信息,包括定位与速度等信息
消息格式为:nav_msgs/Odometry
std_msgs/Header headeruint32 seq # 消息序列号time stamp # 时间戳string frame_id # 消息帧id
string child_frame_id
geometry_msgs/PoseWithCovariance posegeometry_msgs/Pose posegeometry_msgs/Point position # 机器人位置坐标float64 xfloat64 yfloat64 zgeometry_msgs/Quaternion orientation # 机器人方向的四元数表示float64 xfloat64 yfloat64 zfloat64 wfloat64[36] covariance # 6x6协方差矩阵的行主表示
geometry_msgs/TwistWithCovariance twistgeometry_msgs/Twist twistgeometry_msgs/Vector3 linear # 机器人三轴线速度float64 xfloat64 yfloat64 zgeometry_msgs/Vector3 angular # 机器人三轴角速度float64 xfloat64 yfloat64 zfloat64[36] covariance # 6x6协方差矩阵的行主表示
其中6x6协方差矩阵,用于量化位姿估计不确定性。这个矩阵对角线上的元素分别代表了位置与方向估计值的方差,而矩阵的非对角线元素则表示了位置与方向各估计值之间的协方差。矩阵各向量依次表示 (x,y,z,绕x轴旋转,绕y轴旋转,围绕z轴旋转)的估计不确定性。
有了这两个话题,我们就可以控制并获取机器人的位姿了。
六、在rviz中仿真控制机器人
使用前文 URDF建模实践 创建的机器人模型,在 launch 文件中添加 Arbotix 节点的启动配置,启动后如下图:

6.1 直接发topic控制
发布 /cmd_vel 话题控制机器人移动,并订阅 /odom 显示机器人的实时位置与速度信息:

6.2 使用键盘控制
运行ROS提供的键盘控制包,控制机器人移动:

6.3 编写代码控制机器人移动
写两个节点,一个发布速度,一个订阅里程计,如下:
move.cpp 用于发布速度:
#include "ros/ros.h"
#include "geometry_msgs/Twist.h"geometry_msgs::Twist moveRobot(const double& linear, const double& angular)
{geometry_msgs::Twist msg;msg.linear.x = linear;msg.linear.y = 0.0;msg.linear.z = 0.0;msg.angular.x = 0.0;msg.angular.y = 0.0;msg.angular.z = angular;ROS_INFO("moveRobot, linear: %.3lf, angular: %.1lf", linear, angular*180/M_PI);return msg;
}int main(int argc, char **argv)
{ros::init(argc, argv, "move_robot");ros::NodeHandle nh;ros::Publisher velPub = nh.advertise<geometry_msgs::Twist>("/cmd_vel", 10);ros::Rate r(1);while (ros::ok()){velPub.publish(moveRobot(0.5, -0.3));ros::Duration(3.0).sleep();velPub.publish(moveRobot(-0.5, -0.3));ros::Duration(3.0).sleep();r.sleep();}return 0;
}
odom.cpp 用于订阅里程计:
#include "ros/ros.h"
#include "nav_msgs/Odometry.h"void odomCallback(const nav_msgs::Odometry::ConstPtr& msg)
{geometry_msgs::Quaternion q = msg->pose.pose.orientation;ROS_INFO("pose: [%.2lf, %.2lf, %.1lf], linear: %.2lf, angular: %.2lf", msg->pose.pose.position.x, msg->pose.pose.position.y, std::atan2(2.0 * (q.w * q.z + q.x * q.y), 1.0 - 2.0 * (q.y * q.y + q.z * q.z))*180/M_PI, msg->twist.twist.linear.x, msg->twist.twist.angular.z*180/M_PI);
}int main(int argc, char **argv)
{ros::init(argc, argv, "robot_odom");ros::NodeHandle nh;ros::Subscriber odomSub = nh.subscribe<nav_msgs::Odometry>("/odom", 10, odomCallback);ros::spin();return 0;
}
CMakeList.txt 中添加内容:
add_executable(move_robot_node src/move.cpp)
add_executable(robot_odom_node src/odom.cpp)target_link_libraries(move_robot_node${catkin_LIBRARIES}
)target_link_libraries(robot_odom_node${catkin_LIBRARIES}
)
启动 rviz 后,运行 move_robot_node 和 robot_odom_node ,如下:

相关文章:
[ROS 系列学习教程] 建模与仿真 - 使用 Arbotix 控制机器人
ROS 系列学习教程(总目录) 本文目录 一、Arbotix 简介二、安装Arbotix三、配置Arbotix控制器四、配置launch启动文件五、数据交互接口六、在rviz中仿真控制机器人6.1 直接发topic控制6.2 使用键盘控制6.3 编写代码控制机器人移动 前面讲了机器人的建模,是静态的&…...
java:使用JSqlParser给sql语句增加tenant_id和deleted条件
# 示例代码 【pom.xml】 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-core</artifactId><version>3.4.3.1</version> </dependency>【MyJSqlParserTest.java】 package com.chz.myJSqlParser;pu…...
华三HCL模拟器安装及华三防火墙配置
0、前言 最近跟模拟器杠上了,主要是需要运行防火墙,目前已经成功模拟出华为、山石防火墙,而且模拟出来的设备能与物理网络环境进行互联。现在我又盯上华三防火墙了。 首先下载模拟器: 下载地址:H3C网络设备模拟器官方免…...
MySQL基础---库的操作和表的操作(配着自己的实操图,简单易上手)
绪论 勿问成功的秘诀为何,且尽全力做您应该做的事吧。–美华纳;本章是MySQL的第二章,本章主要写道MySQL中库和表的增删查改以及对库和表的备份处理,本章是基于上一章所写若没安装mysql可以查看Linux下搭建mysql软件及登录和基本…...
【6】第一个Java程序:Hello World
一、引言 Java,作为一种广泛使用的编程语言,其强大的跨平台能力和丰富的库函数使其成为开发者的首选。对于初学者来说,编写并运行第一个Java程序是一个令人兴奋的时刻。本文将指导你使用Eclipse这一流行的集成开发环境(IDE&#…...
pytorch神经网络训练(AlexNet)
导包 import osimport torchimport torch.nn as nnimport torch.optim as optimfrom torch.utils.data import Dataset, DataLoaderfrom PIL import Imagefrom torchvision import models, transforms 定义自定义图像数据集 class CustomImageDataset(Dataset): 定义一个自…...
构建大语言模型友好型网站
以大语言模型为代表的AI 技术迅速发展,将会影响原有信息网络的方式。其中一个明显的趋势是通过chatGPT 对话代替搜索引擎和浏览器来获取信息。 互联网时代,主要是通过网站(website)提供信息。网站主要为人类阅读的方式构建的。主要…...
Git代码冲突原理与三路合并算法
Git代码冲突原理 Git合并文件是以行为单位进行一行一行合并的,但是有些时候并不是两行内容不一样Git就会报冲突,这是因为Git会帮助我们进行分析得出哪个结果是我们所期望的最终结果。而这个分析依据就是三路合并算法。当然,三路合并算法并不…...
聆思CSK6大模型开发板英语评测类开源SDK详解
离线英文评测算法SDK 能力简介 CSK6 大模型开发套件可以对用户通过语音输入的英文单词进行精准识别,并对单词的发音、错读、漏读、多读等方面进行评估,进行音素级的识别,根据用户的发音给出相应的建议和纠正,帮助用户更好地掌握单…...
通用大模型VS垂直大模型,你更青睐哪一方?
这里写目录标题 一、通用大模型简介二、垂直大模型简介三、通用大模型与垂直大模型的比较四、如何选择适合的模型五、通用大模型和垂直大模型的应用场景六、总结 近年来,随着人工智能技术的飞速发展,大模型的应用越来越广泛。无论是自然语言处理、计算机…...
Python第二语言(十四、高阶基础)
目录 1. 闭包 1.1 使用闭包注意事项 1.2 小结 2. 装饰器:实际上也是一种闭包; 2.1 装饰器的写法(闭包写法) :基础写法,只是解释装饰器是怎么写的; 2.2 装饰器的语法糖写法:函数…...
python脚本之调用其他目录脚本
import sys# 添加新路径到搜索路径中 sys.path.append(/脚本父级)# 现在可以导入该路径下的模块了 from 脚本 import 方法方法()...
C# 事件(Event)定义及其使用
1.定义个委托和类 //委托 public delegate void ProductEventHandler(Product product);/// <summary> /// 产品 /// </summary> public class Product {public int Id { get; set; }public string Code { get; set; }public string Name { get; set; }private de…...
2.负载压力测试
负载压力测试是一种重要的系统测试方法,旨在评估系统在正常和峰值负载情况下的性能表现。 一、基本概念: 负载压力测试是在一定约束条件下,通过模拟实际用户访问系统的行为,来测试系统所能承受的并发用户数、运行时间、数据量等&…...
【AI工具】jupyter notebook和jupyterlab对比和安装
简单说,jupyterlab是jupyter notebook的下一代。 选择安装一个即可。 一、这里是AI对比介绍 Jupyter Notebook和JupyterLab都是基于Jupyter内核的交互式计算环境,但它们在设计和功能上有一些关键的区别: 用户界面: Jupyter Not…...
Linux 基本指令3
date指令 date[选项][格式] %Y--年 %m--月 %d--日 %H--小时 %M--分 %S--秒 中间可用其他符号分割,不能使用空格。 -s 设置时间,会返回设置时间的信息并不是改变当前时间 设置全部时间年可用-或者:分割日期和时间用空格分隔ÿ…...
在Linux系统中,可以使用OpenSSL来生成CSR(Certificate Signing Request)、PEM格式的公钥和PEM格式的私钥。
在Linux系统中,可以使用OpenSSL来生成CSR(Certificate Signing Request)、PEM格式的公钥和PEM格式的私钥。以下是生成这些文件的命令: 首先,生成私钥(通常是以.key结尾,但可以转换成PEM格式&am…...
【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 团队派遣(100分) - 三语言AC题解(Python/Java/Cpp)
🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍓OJ题目截图 📎在线评测链接 团队派遣(100分) 🌍 评测功能需要订阅专栏…...
Python数据分析与机器学习在医疗诊断中的应用
文章目录 📑引言一、数据收集与预处理1.1 数据收集1.2 数据预处理 二、特征选择与构建2.1 特征选择2.2 特征构建 三、模型选择与训练3.1 逻辑回归3.2 随机森林3.3 深度学习 四、模型评估与调优4.1 交叉验证4.2 超参数调优 五、模型部署与应用5.1 模型保存与加载5.2 …...
vite.config.js如何使用env的环境变量
了解下环境变量在vite中 官方文档走起 https://cn.vitejs.dev/guide/env-and-mode.html#env-variables-and-modes 你见到的.env,.env.production等就是放置环境变量的 官方文档说到.env.[mode] # 只在指定模式下加载,比如.env.development只在开发环境加载 至于为什么是deve…...
忍者像素绘卷惊艳案例:生成支持CSS Sprite切片的像素角色动作序列图
忍者像素绘卷惊艳案例:生成支持CSS Sprite切片的像素角色动作序列图 1. 像素艺术的新纪元 在游戏开发领域,像素艺术始终保持着独特的魅力。忍者像素绘卷作为一款基于Z-Image-Turbo深度优化的图像生成工具,为开发者带来了革命性的解决方案。…...
Calypso vs PC-DMIS:三坐标两大软件脱机编程实战对比与选型指南
Calypso vs PC-DMIS:三坐标测量软件脱机编程深度对比与实战选型策略 在精密制造领域,三坐标测量机(CMM)的脱机编程能力直接决定了检测效率与资源利用率。作为行业两大标杆,蔡司Calypso与海克斯康PC-DMIS在用户界面设计、编程逻辑、仿真验证等…...
30天小白进阶AI大神:收藏这份路线图,免费工具玩转大模型!
本文为AI学习新手提供了30天的系统学习路线图,涵盖了AI技术栈的三个层次:应用层、模型层和基础设施层。文章建议从应用层入手,逐步向下理解,并推荐了主流AI工具的对比及免费工具的入门使用。此外,还提供了给初学者的五…...
Ubuntu 22.04 改IP重启失效?别急,可能是OVS的ovsdb-server在捣鬼
Ubuntu 22.04网络配置失效:当OVS与netplan的隐秘博弈 在虚拟化技术大行其道的今天,Open vSwitch(OVS)作为开源虚拟交换机的标杆,已经成为众多云计算平台和容器网络的核心组件。然而,当它遇上Ubuntu 22.04默…...
Rust DLL注入技术深度解析:Rust-for-Malware-Development完整实现指南
Rust DLL注入技术深度解析:Rust-for-Malware-Development完整实现指南 【免费下载链接】Rust-for-Malware-Development Rust for malware Development is a repository for advanced Red Team techniques and offensive malwares & Ransomwares, focused on Rus…...
go-zero v1.10.1 更新解析:JSON5 配置正式支持 Redis 通用命令 Do DoCtx 上线 Go 1.24 升级与 core/codec 关键安全修复全梳理
一、版本总览:go-zero v1.10.1,微服务框架的又一次关键迭代 2026年3月28日,国产高性能Go微服务框架go-zero正式发布v1.10.1版本。作为一次补丁式更新,该版本并非简单的问题修复,而是集新功能拓展、核心安全加固、底层依…...
一篇帮你搞定Arrays工具类!!!
一、引言最近在刷算法题的时候,用到了很多次Arrays的方法,因此,写一篇博客来整理一下相关用法二、介绍java.util.Arrays 是 Java 提供的数组操作工具类,包含了数组排序、查找、复制、比较、打印、填充等常用静态方法,无…...
iarduino_KB矩阵键盘库:硬件感知型Arduino按键驱动方案
1. 项目概述iarduino_KB是由俄罗斯嵌入式开发团队 iArduino.ru 面向 Arduino IDE 推出的专用矩阵键盘驱动库。该库并非通用型扫描抽象层,而是针对其自研四款物理形态与电气特性高度定制化的柔性/机械式矩阵键盘模块进行深度适配的固件级解决方案。其核心价值在于将底…...
CentOS部署PHP项目完整步骤
CentOS 7.9 部署 PHP 7.4 MySQL 5.7.44 完整步骤 由于 CentOS 7 已于 2024 年 6 月 30 日停止官方维护,原有的 yum 源已不可用,因此必须首先更换为阿里云镜像源才能正常安装软件。 一、系统环境准备 1.1 更换阿里云 YUM 源 # 1. 备份原有源 mv /etc/yum…...
RK3568上Qt5.12.8编译eglfs报错?手把手教你解决fbdev_window.h缺失问题
RK3568 Qt5.12.8编译eglfs报错全解析:从fbdev_window.h缺失到完整解决方案 在嵌入式开发领域,RK3568作为Rockchip推出的高性能处理器,结合Qt框架的图形界面开发能力,为工业控制、智能终端等场景提供了强大的解决方案。然而&#…...
