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

  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 ,如下:
在这里插入图片描述

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

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

相关文章

力扣 240.搜素矩阵II

题目描述&#xff1a; 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9…

Kali Linux 2024.2 释出

渗透测试发行版 Kali Linux 释出了最新的 2024.2。 主要新特性包括&#xff1a;桌面环境更新到 GNOME 46&#xff0c;Xfce 环境加入 HiDPI 模式&#xff0c;更新了网络侦察工具 AutoRecon&#xff0c;监视 Linux 进程的命令行工具 pspy&#xff0c;提取和显示 CVE 信息的 Splo…

Oxlint 会取代 Eslint 吗?

最近&#xff0c;一个基于 Rust 的代码检查工具 Oxlint 在国外前端社区引起了热议&#xff0c;许多专家对其给予了高度评价。那么&#xff0c;相比于它的大哥 Eslint&#xff0c;Oxlint 有哪些优势&#xff1f;它会在未来取代 Eslint 吗&#xff1f;本文将讨论这个话题。 Oxc 和…

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

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

[羊城杯 2023]CSGO

主函数初始化时&#xff0c;有反调试检测 打个断点在前面&#xff0c;然后nop掉 go语言的主函数是main_main 直接来到main_main&#xff0c;发现能可能是base64变表 在前面打个断点&#xff0c;F9 此处为base64变表&#xff0c;来到v25的地址处 得到变表LMNOPQRSTUVWXYZab…

[大模型]CharacterGLM-6B Transformers部署调用

环境准备 在autodl平台中租一个3090等24G显存的显卡机器&#xff0c;如下图所示镜像选择PyTorch–>2.0.0–>3.8(ubuntu20.04)–>11.8 接下来打开刚刚租用服务器的JupyterLab&#xff0c;并且打开其中的终端开始环境配置、模型下载和运行demo。 pip换源和安装依赖包 …

PyQt5 多进程 多任务 多线程实现进度条功能 无边框 含源码

概述&#xff1a; 在项目 中我们常遇到&#xff0c;大量计算或者加载数据时&#xff0c;需要用到多线程&#xff0c;此时只能等待&#xff0c;我们这个时间需要添加一下进度条&#xff0c;告诉用户当前需要等待&#xff0c;这时间就需要用到多线程和等待进度条&#xff1b; 效…

SpringCloudAlibaba基础二 Nacos注册中心

一 什么是 Nacos 官方&#xff1a;一个更易于构建云原生应用的动态服务发现(Nacos Discovery )、服务配置(Nacos Config)和服务管理平台。 集 注册中心配置中心服务管理 平台。 Nacos 的关键特性包括: 服务发现和服务健康监测动态配置服务动态 DNS 服务服务及其元数据管理 …

【教程】让小爱音箱Play增强版接入Mi-GPT

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 项目地址&#xff1a;https://github.com/idootop/mi-gpt MiIOT&#xff1a;小米小爱音箱Play 增强版 - 产品规格 - Xiaomi Miot Spec 实现效果图&…

Eslint配置指南

1. Eslint配置指南 1.1. 安装 ESLint1.2. 生成配置文件1.3. 修改配置文件1.4. 创建 .eslintignore 文件1.5. 运行 ESLint1.6. 整合到编辑器/IDE1.7. 自动修复 2. 配置prettier 2.1. 安装依赖包2.2. .prettierrc.json添加规则2.3. .prettierignore忽略文件2.4. 保存自动格式化 3…

二进制中1的个数-java

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、二进制中1的个数 二、算法思路 1.将一个整数转化成二进制形式 2.查询一个数的二进制数中的第k位是多少 3.lowbit(x)操作 三、代码如下 1.代码如下&…

Docker的资源限制

文章目录 一、什么是资源限制1、Docker的资源限制2、内核支持Linux功能3、OOM异常4、调整/设置进程OOM评分和优先级4.1、/proc/PID/oom_score_adj4.2、/proc/PID/oom_adj4.3、/proc/PID/oom_score 二、容器的内存限制1、实现原理2、命令格式及指令参数2.1、命令格式2.2、指令参…

docker部署redis实践

1.拉取redis镜像 # 拉取镜像 sudo docker pull redis2.创建映射持久化目录 # 创建目录 sudo mkdir -p $PWD/redis/{conf,data}3. 运行redis 容器&#xff0c;查看当前redis 版本号 # 运行 sudo docker run --name redis -d -p 6379:6379 redis # 查看版本号 sudo docker ex…

coap:安装libcoap

# 称最新版的openssl 安装依赖东东 yum install -y libtool doxygen asciidoc perl-IPC-Cmd下载解压 cd /chz/install/openssl wget https://www.openssl.org/source/openssl-3.3.1.tar.gz tar zxvf openssl-3.3.1.tar.gz编译安装 cd /chz/install/openssl/openssl-3.3.1 .…

数据挖掘--聚类分析:基本概念和方法

数据挖掘--引论 数据挖掘--认识数据 数据挖掘--数据预处理 数据挖掘--数据仓库与联机分析处理 数据挖掘--挖掘频繁模式、关联和相关性&#xff1a;基本概念和方法 数据挖掘--分类 数据挖掘--聚类分析&#xff1a;基本概念和方法 聚类分析 聚类分析是把一个数据对象&…

计算机组成原理复习笔记

前言 就是按照考试的题型写的总结 非常应试版 题型 一、进制转换 只考 十进制 二进制 十六进制 之间的相互转换 一个个看 &#xff08;1&#xff09;十进制 转其他 转二进制&#xff1a;除以2 从小到大取余数&#xff08;0或1&#xff09; 转十六进制 &#xff1a; 除以1…

进军rust:从0开始学习rust语法

一.变量类型 Rust语言中的基础数据类型有以下几种&#xff1a; 1.整数型 整数型简称整型&#xff0c;按照比特位的长度和有无符号位可以分为以下几种 isize和usize两种整数类型是用来衡量数据大小的&#xff0c;它们的位长度取决于所运行的目标平台&#xff0c;如果是32位架…

如何在 iPhone 上恢复已删除的短信

本文介绍如何检索已删除的短信和 iMessage 以及恢复丢失的消息。说明适用于 iOS 17 及更高版本。 如何在 iOS 17及更高版本中恢复文本 恢复已删除短信的最简单方法是使用 iOS 17。从删除短信到恢复它有 30 到 40 天的时间。 在“信息”的对话屏幕中&#xff0c;选择“过滤器”…

老旧机子装linux——Xubuntu

目录 前言 正文 下载系统 ​编辑 制作系统盘&#xff1a; 安装界面 Xubuntu ​编辑 lubuntu 后语 前言 有两台电脑&#xff0c;一台装了Ubuntu22&#xff0c;一台装了debuntu。虽然debuntu界面与乌班图大体一样&#xff0c;但是编译器好像有点区别。由于机子为10年前的老…

二分【1】二分查找框架 查找指定元素

目录 二分查找 基本思想 几种情况汇总 一。严格递增序列 1.查找本身 2.查找第一个大于等于自己的 3.查找第一个大于自己的 4.严格递减序列 二。有重复元素 1.取其中第一个出现的 2.取其中最后一个出现的 二分查找 基本思想 几种情况汇总 一。严格递增序列 1.查找本身…