首页 > 其他分享 >ros2 slam - 订阅ROS2 Twist

ros2 slam - 订阅ROS2 Twist

时间:2024-07-02 11:33:05浏览次数:23  
标签:updateMotorSpeed Twist slam motor 70 msg ROS2

本节我们结合上一节电机控制以及前面章节的MicroROS话题订阅部分知识点,来实现一个可以用键盘遥控的小车。

新建工程example24_ros2_car

 修改配置

[env:featheresp32]  ; 这是一个环境配置标签,指定了代码将运行的硬件平台和框架
platform = espressif32  ; 指定了使用的平台为Espressif 32
board = featheresp32  ; 指定使用的硬件板为Feather ESP32
framework = arduino  ; 指定使用的框架为Arduino
board_microros_transport = wifi  ; 指定使用的Micro-ROS传输方式为Wi-Fi
lib_deps =  ; 列出所有依赖库的URL,这些库将被下载和安装
    https://github.com/fishros/Esp32McpwmMotor.git  ; ESP32-MCPWM-Motor库,用于驱动电机
    https://gitee.com/ohhuo/micro_ros_platformio.git  ; Micro-ROS平台库,用于在ESP32上运行ROS 2

二、编写代码

#include <Arduino.h>
#include <Esp32McpwmMotor.h>
#include <Arduino.h>
#include <micro_ros_platformio.h>
#include <WiFi.h>
#include <rcl/rcl.h>
#include <rclc/rclc.h>
#include <rclc/executor.h>
#include <geometry_msgs/msg/twist.h>

// 定义 ROS2 执行器和支持结构
rclc_executor_t executor;
rclc_support_t support;
// 定义 ROS2 内存分配器
rcl_allocator_t allocator;
// 定义 ROS2 节点和订阅者
rcl_node_t node;
rcl_subscription_t subscriber;
// 定义接收到的消息结构体
geometry_msgs__msg__Twist sub_msg;

// 定义控制两个电机的对象
Esp32McpwmMotor motor;

// 回调函数,当接收到新的 Twist 消息时会被调用
void twist_callback(const void *msg_in)
{
  // 将接收到的消息指针转化为 geometry_msgs__msg__Twist 类型
  const geometry_msgs__msg__Twist *twist_msg = (const geometry_msgs__msg__Twist *)msg_in;
  // 从 Twist 消息中获取线速度和角速度
  float linear_x = twist_msg->linear.x;
  float angular_z = twist_msg->angular.z;
  // 打印接收到的速度信息
  Serial.printf("recv spped(%f,%f)\n", linear_x, angular_z);
  // 如果速度为零,则停止两个电机
  if (linear_x == 0 && angular_z == 0)
  {
    motor.updateMotorSpeed(0, 0);
    motor.updateMotorSpeed(1, 0);
    return;
  }

  // 根据线速度和角速度控制两个电机的转速
  if (linear_x > 0)
  {
    motor.updateMotorSpeed(0, 70);
    motor.updateMotorSpeed(1, 70);
  }

  if (linear_x < 0)
  {
    motor.updateMotorSpeed(0, -70);
    motor.updateMotorSpeed(1, -70);
  }

  if (angular_z > 0)
  {
    motor.updateMotorSpeed(0, -70);
    motor.updateMotorSpeed(1, 70);
  }

  if (angular_z < 0)
  {
    motor.updateMotorSpeed(0, 70);
    motor.updateMotorSpeed(1, -70);
  }
}

void setup()
{
  // 初始化串口
  Serial.begin(115200);

  // 初始化两个电机的引脚
  motor.attachMotor(0, 22, 23);
  motor.attachMotor(1, 12, 13);

  // 设置 micro-ROS 通信参数,连接到指定的 ROS2 代理
  IPAddress agent_ip;
  agent_ip.fromString("192.168.2.105");
  set_microros_wifi_transports("fishbot", "12345678", agent_ip, 8888);
  delay(2000);

  // 初始化 ROS2 执行器和支持结构
  allocator = rcl_get_default_allocator();
  rclc_support_init(&support, 0, NULL, &allocator);
  // 初始化 ROS2 节点
  rclc_node_init_default(&node, "esp32_car", "", &support);
  // 初始化订阅者
  rclc_subscription_init_default(
      &subscriber,
      &node,
      ROSIDL_GET_MSG_TYPE_SUPPORT(geometry_msgs, msg, Twist),
      "/cmd_vel");
  rclc_executor_init(&executor, &support.context, 1, &allocator);
  // 设置订阅的回调函数
  rclc_executor_add_subscription(&executor, &subscriber, &sub_msg, &twist_callback, ON_NEW_DATA);
}

void loop()
{
  rclc_executor_spin_some(&executor, RCL_MS_TO_NS(100)); // 循环处理数据
}

代码使用 Esp32McpwmMotor 库初始化电机,设置 micro-ROS 通信参数以连接到 ROS2 代理,并初始化一个 ROS2 节点和一个订阅者,以订阅 /cmd_vel 主题上的 Twist 消息。
当接收到新的 Twist 消息时,调用 twist_callback() 函数提取线性和角速度,并相应地控制电机。如果两个速度都为零,则电机停止。否则,根据方向设置电机速度。在正向方向上,速度设置为 70,在反向方向上为 -70。
loop() 函数重复调用 rclc_executor_spin_some() 来处理来自 ROS2 网络的传入数据。
需要注意的是,你要根据自己的网络情况修改下面的代码以实现无线通信,如果不知道怎么设置,请回看前面章节。

agent_ip.fromString("192.168.2.105");
set_microros_wifi_transports("fishbot", "12345678", agent_ip, 8888);

三、下载测试
将代码下载到小车,运行agent,点击RST等待接入。

sudo docker run -it --rm -v /dev:/dev -v /dev/shm:/dev/shm --privileged --net=host microros/micro-ros-agent:$ROS_DISTRO udp4 --port 8888 -v6

接着我们使用ROS 2的键盘控制节点来进行控制测试

ros2 run teleop_twist_keyboard teleop_twist_keyboard

 

接着按下入JKL,几个按键,看一下小车是否动了起来。

四、总结
本节我们通过将小车接入MicroROS完成了一个遥控小车的开发。下一节我们开始使用编码器来测量轮子的转速。

 

 



 

标签:updateMotorSpeed,Twist,slam,motor,70,msg,ROS2
From: https://www.cnblogs.com/ai-ldj/p/18279568

相关文章

  • ros - slam - 电机控制之速度控制实验
    前面说到通过控制对应的IO上的PWM占空比即可完成对电机速度的控制。关于PWM的介绍在ROS2硬件控制篇的舵机控制中已经介绍过了,所以我们知道通过改变PWM的占空比可以实现对输出电压的大小调节。占空比越大,输出电压越高;占空比越小,输出电压越低。接着我们通过一个实验来验证下一、新建......
  • ros slam 之移动机器人常用传感器
    本节我们对移动机器人底盘结构进行简单的介绍,并着重介绍FishBot基础版的组成结构。对于一个移动底盘来说,所要提供的核心功能有两个-感知和执行能力,我们分别进行介绍。一、感知-传感器所谓感知即通过给类传感器获取环境信息的能力。在移动机器人中,我们常用的传感器有 距离传......
  • ros slam microros之H电桥电机驱动原理介绍
    一、电机驱动原理介绍正式编写代码前,我们先了解下电机驱动的原理,以便于我们了解我们如何才能通过代码控制电机的转速和正反转。1.1H桥电路让电机动起来只需要通电就行,比如我们用的额定电压为12V130RPM的电机,当给到12V的电压时可以达到额定转速130转/分,但如果我们给8V的电压,此时......
  • ros2 - microros - 雷达 -可视化点云
    上一节完成了指定角度距离的测量这一节我们将其合成ROS的laserscan消息,并将其通过microros发布到上位机,最终实现rviz2的可视化。 一、雷达消息介绍使用指令ros2interfaceshowsensor_msgs/msg/LaserScan,可以看到ROS2对雷达数据接口的定义。#Singlescanfromaplanarlas......
  • ROS2创建简单的C++功能包
    1.创建功能包终端下,进入ws00_helloworld/src目录,使用如下指令创建一个C++功能包:ros2pkgcreatepkg01_helloworld_cpp--build-typeament_cmake--dependenciesrclcpp--node-namehelloworld执行完毕,在src目录下将生成一个名为pkg01_helloworld_cpp的目录,且目录中已经......
  • ORB-SLAM3 源码分析
    一、ORB-SLAM3介绍ORB-SLAM3是一个先进的同时定位与地图构建(SimultaneousLocalizationandMapping,SLAM)系统,实现了基于视觉惯导紧耦合,同时能够对多地图进行复用;另外支持单目/双目/RGB-D作为输入,支持针孔以及鱼眼相机模型。是目前种类最齐全、工程化最好、精度和鲁棒性整体最佳的......
  • 使用 ROS2的多机器人探索
    原文链接:https://www.youtube.com/watch?v=J0RZP_xJ3XA ThisvideoshowsademonstrationoftheSOSproject,dedicatedtoforestfiredetectionusingafleetofrobots.Severalimportantissuesareaddressed.这段视频展示了SOS项目的演示,该项目致力于使用机器人......
  • ros2bag_convert 使用记录 | ros2 bag 转csv格式
    fishrosyyds:GitHub-fishros/ros2bag_convert:ConvertROS2bagfilestoCSV,JSON,etc.需要把ros2bag记录的机械臂关节信息读出来,再发送给机械臂重复记录的动作。现在要先转换成csv格式,记录一下。1.转到你的工作环境里,在该环境安装(我没有用sudo,因为只想装在某个cond......
  • ROS1迁移到ROS2
    在将ROS1迁移到ROS2的过程中,需要考虑以下几个重要的注意事项:1.**先决条件**:在开始迁移之前,请确保ROS1包的所有依赖项在ROS2中都是可用的。2.**包规范格式**:ROS2不支持ROS1的包规范格式1,只支持较新的格式版本(2及更高版本)。如果`package.xml`文件使用的是格式1,需要至少......
  • (slam工具)6 python四元数转化旋转矩阵
       importnumpyasnpfromscipy.spatial.transformimportRotationasRimportpyprojfrompyprojimportProj,transform#0.0169380355232107080.58455146147157355-0.488705791564092830.64744060819180593-129342.747563395343469822.8668770161534369......