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

news2024/11/24 2:09:12

在这里插入图片描述

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 ,有两种安装方法,命令行和源码安装。

  1. 命令行安装

    sudo apt install ros-<<VersionName()>>-arbotix*
    
  2. 源码安装

    首先在你的工作空间的 src 目录下下载源代码:

    git clone https://github.com/vanadiumlabs/arbotix_ros.git
    

    然后编译即可使用 Arbotix

    catkin_make # 编译
    

三、配置Arbotix控制器

Arbotix 针对不同的机器人,需要配置不同的控制器,配置文件为 yaml 格式,如下:

# 该文件是控制器配置,一个机器人模型可能有多个控制器,比如: 底盘、机械臂、夹持器(机械手)....
# 因此,根 name 是 controllers
controllers: {
    # 单控制器设置
    base_controller: {
        # 类型: 差速控制器
        type: diff_controller,
        # 参考坐标
        base_frame_id: base_link,
        # 两个轮子之间的间距,单位:m
        base_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_driverrosparam 一行是载入上文的 Arbotix 配置文件;Arbotix 不仅可以用于真实控制板,也可以用于仿真环境,如用于仿真,需将参数 sim 设置为 true

五、数据交互接口

该节点订阅一个话题:/cmd_vel,用于接收对机器人的速度控制信息

消息格式为:geometry_msgs/Twist

geometry_msgs/Vector3 linear  # 机器人三轴线速度
  float64 x
  float64 y
  float64 z
geometry_msgs/Vector3 angular  # 机器人三轴角速度
  float64 x
  float64 y
  float64 z

发布一个话题:/odom,用于发布机器人里程计信息,包括定位与速度等信息

消息格式为:nav_msgs/Odometry

std_msgs/Header header
  uint32 seq  # 消息序列号
  time stamp  # 时间戳
  string frame_id  # 消息帧id
string child_frame_id
geometry_msgs/PoseWithCovariance pose
  geometry_msgs/Pose pose
    geometry_msgs/Point position  # 机器人位置坐标
      float64 x
      float64 y
      float64 z
    geometry_msgs/Quaternion orientation # 机器人方向的四元数表示
      float64 x
      float64 y
      float64 z
      float64 w
  float64[36] covariance  # 6x6协方差矩阵的行主表示
geometry_msgs/TwistWithCovariance twist
  geometry_msgs/Twist twist
    geometry_msgs/Vector3 linear  # 机器人三轴线速度
      float64 x
      float64 y
      float64 z
    geometry_msgs/Vector3 angular  # 机器人三轴角速度
      float64 x
      float64 y
      float64 z
  float64[36] covariance  # 6x6协方差矩阵的行主表示

其中6x6协方差矩阵,用于量化位姿估计不确定性。这个矩阵对角线上的元素分别代表了位置与方向估计值的方差,而矩阵的非对角线元素则表示了位置与方向各估计值之间的协方差。矩阵各向量依次表示 (x,y,z,绕x轴旋转,绕y轴旋转,围绕z轴旋转)的估计不确定性。

有了这两个话题,我们就可以控制并获取机器人的位姿了。

六、在rviz中仿真控制机器人

使用前文 [5.1.3 URDF建模实践](#5.1.3 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_noderobot_odom_node ,如下:
在这里插入图片描述

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

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

相关文章

独著和第一主编的区别有哪些?

独著&#xff0c;合著&#xff0c;包本 大量主编&#xff0c;副主编位置 国家级出版社&#xff0c;省级科技社 纸质书号&#xff08;带CIP&#xff09;电子专著&#xff0c;总署可查 国家级出版社&#xff0c;省级社&#xff0c;百级社 qkfb88688 独著和第一主编主要有以下区别…

免费使用GPT-4生成图片的方法

写在前言 hello&#xff0c;大家好&#xff0c;我是一点&#xff0c;喜欢编程&#xff0c;目前持续在关注AI领域的发展&#xff0c;希望可以结交一些有意思的朋友。 大家可以关注我的公号&#xff1a;【一点sir】&#xff0c;了解更多文章&#xff0c;希望可以和你们成为朋友…

变频器多段速位置定位控制注意事项

本篇博客介绍利用变频器多段速实现位置控制时的注意事项,T型和S型速度曲线轨迹规划请参考下面文章链接: S速度曲线轨迹规划(普通变频位置闭环控制算法详细介绍+SCL代码)_位置闭环算法-CSDN博客文章浏览阅读1.9k次,点赞2次,收藏9次。位置控制用PD控制器,详细内容介绍请查看…

后端服务器启动访问

VisualStudioCode(VSCode) 服务器启动 浏览器中测试访问 http://localhost:3000

JavaScript基础(十二)

截取字符串 //对象名.toLowerCase();将字符串转为小写 var strLAOWANG; strstr.toLowerCase(); console.log(str); //对象名.toUpperCase();将字符串转为大写 var str1laowang str1str1.toUpperCase(); console.log(str1); 截取字符串 //方法1&#xff1a;对象名.substr(a,b); …

Python实现连连看9

&#xff08;2&#xff09;标识选中的图片 在判断出玩家选中的是哪一张图片之后&#xff0c;接下来就可以标识选中的图片了&#xff0c;即在该选中的图片外围画矩形。代码如下所示。 FIRSTCLICK True #FIRSTCLICK是全局变量 if(click_col>0 and click_row>0) and \(no…

Layui:一款强大的前端UI框架

随着互联网技术的快速发展&#xff0c;前端技术也在不断更新和演进。前端工程师们面临着越来越多的挑战&#xff0c;需要在短时间内构建出高质量、高效率的网页应用。为了提高开发效率和降低开发难度&#xff0c;许多前端UI框架应运而生。在这些框架中&#xff0c;Layui凭借其优…

XUbuntu22.04之ssh+x11显示远程图形到本机(二百四十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

python数据分析——聚类

参考资料&#xff1a;活用pandas库 1、k均值聚类 使用k均值算法&#xff0c;首先要选定数据中的群集数&#xff08;k&#xff09;。它会随机选取数据中的k个点&#xff0c;计算每个数据点到最初选取的k个点之间的距离。最接近某个群集的点会被划分到同一个集群组。然后把每个群…

23种模式之一— — — —适配器模式的详细介绍与讲解

适配器介绍与讲解 一、概念二、适配器模式结构适配器分类核心思想核心角色模式的UML类图应用场景模式优点模式缺点 实例演示图示代码演示运行结果 一、概念 适配器模式&#xff08;别名&#xff1a;包装器&#xff09; 是一种结构型设计模式 将一个类的接口转换成客户希望的另…

机器学习与数据挖掘知识点总结(二)之常用的分类算法

目录 1、什么是数据挖掘 2、为什么要有数据挖掘 3、数据挖掘用在分类任务中的算法 朴素贝叶斯算法 svm支持向量机算法 PCA主成分分析算法 k-means算法 决策树 1、什么是数据挖掘 数据挖掘是从大量数据中发现隐藏在其中的模式、关系和规律的过程。它利用统计学、机器学…

Transformer 动画讲解:多层感知机

暑期实习基本结束了&#xff0c;校招即将开启。 不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。提前准备才是完全之策。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c…

Python GUI编程:深入探索现代GUI库及其创新应用

目录 引言 Python GUI库概览 1. Tkinter 2. PyQt/PySide 3. wxPython 4. Kivy 5. PyGTK 6.FLTK (pyFLTK) 创新应用案例 1. 交互式数据分析工具 2. 智能物联网(IoT)仪表板 3. 增强现实(AR)辅助设计软件 4. 跨平台的科学计算软件 5. 交互式教育软件 实战示例1&…

Vue13-计算属性的简写

一、计算属性的简写 注意&#xff1a; 当计算属性只有get&#xff0c;没有set的时候&#xff0c;才能用简写形式&#xff01;&#xff01;&#xff01;

【kyuubi-spark】从0-1部署kyuubi集成spark执行spark sql到k8s读取iceberg的minio数据

一、背景 团队在升级大数据架构 前端使用trino查询&#xff0c;对trino也进行了很多优化&#xff0c;目前测试来看&#xff0c;运行还算稳定&#xff0c;但是不可避免的trino的任务总会出现失败的情况。原来的架构是trino失败后去跑hive&#xff0c;而hive是跑mapreduce依赖于…

基于深度学习的红外船舶检测识别分类完整实现数据集8000+张

随着遥感技术的快速发展&#xff0c;包括无人机、卫星等&#xff0c;红外图像在船舶检测识别中的作用日益凸显。相对于可见光图像&#xff0c;红外图像具有在夜晚和恶劣天气条件下高效检测识别船舶的天然优势。近年来&#xff0c;深度学习作为一种强大的图像处理技术&#xff0…

汇编:数组定义数据填充

数组的定义 在32位汇编语言中&#xff0c;定义数组时&#xff0c;通常使用定义数据指令&#xff08;如 DB, DW, DD,DQ &#xff09;和标签来指定数组的名称和内容。DB定义字节数组&#xff08;每个元素占1字节&#xff09;、DW定义字数组&#xff08;每个元素占2字节&#xff…

计算机网络 —— 网络层(IP数据报)

计算机网络 —— 网络层&#xff08;IP数据报&#xff09; 网络层要满足的功能IP数据报IP数据报格式IP数据报首部格式数据部分 IP数据报分片 我们今天进入网络层的学习。 网络层要满足的功能 网络层作为OSI模型中的第三层&#xff0c;是计算机网络体系结构的关键组成部分&…

lua vm 五: upvalue

前言 在 lua vm 中&#xff0c;upvalue 是一个重要的数据结构。upvalue 以一种高效的方式实现了词法作用域&#xff0c;使得函数能成为 lua 中的第一类值&#xff0c;也因其高效的设计&#xff0c;导致在实现上有点复杂。 函数 (proto) upvalue 构成了闭包&#xff08;closu…

【讯为Linux驱动开发】2.注册一个字符设备

【问】如何描述一个字符设备&#xff1f; dev结构体 其中需要关心三个成员变量&#xff1a; 所属模块 &#xff1a;struct module *owner; 文件操作结构体&#xff1a; const struct file_operations *ops 设备号 &#xff1a; dev_t 当应用层使用指令open("/dev/hello&…