如何让罗技29方向盘像视频中的那样转动起来?

news2024/11/26 20:22:35

​​​​​​​[vlog]Autoware Carla G29 自动驾驶仿真_哔哩哔哩_bilibili

话接上文,在我之前一篇博客中已经讲解了如何给罗技29方向盘装上力反馈,也就是在拨动方向盘的时候感觉有一个力组织你过度的拨动方向盘,其实它真正的用处是用于实现对方向盘发送控制指令,这不就是所谓的自动驾驶嘛!!!!(2条消息) logitech G29 Carla_”悟道“的博客-CSDN博客

最上面B站上有一个视频,展示的是Autoware发送rviz中虚拟方向盘的控制指令,Up写了一个转发的ros节点,将控制指令给转发出来,通过对罗技29的力反馈句柄上发送控制指令,实现了如此酷炫的效果,我也尝试自己写出一个转发节点,今天开源给大家,供大家参考;

#include <iostream>                                           //文件流头文件
#include "rclcpp/rclcpp.hpp"                                    
#include "sensor_msgs/msg/joy.hpp"                            
#include "ros_g29_force_feedback/msg/force_feedback.hpp"      //之前博客中的力反馈头文件

class Voyager : public rclcpp::Node                            
{
public:
  Voyager() : Node("voyager")                                //转发节点的名字叫voyager
  {
    subscription_=this->create_subscription<sensor_msgs::msg::Joy>(
      "/joy", 10, std::bind(&Voyager::callback, this, std::placeholders::_1)); //订阅者
    publisher_ = this->create_publisher<ros_g29_force_feedback::msg::ForceFeedback>(
      "/ff_target", 10);                                        //发布者
  }

private:
    void callback(const sensor_msgs::msg::Joy::SharedPtr msg)
    {
      RCLCPP_INFO(this->get_logger(), "Steering tire angle: %f", msg->axes[0]);
      auto ff_msg = ros_g29_force_feedback::msg::ForceFeedback();
      // ff_msg.header.stamp = msg->header.stamp;
      ff_msg.header.stamp = msg->header.stamp;
      ff_msg.header.frame_id=" ";
      // ff_msg.position = msg->axes[0];
      if(msg->axes[0] > 0){
        ff_msg.position = -1 * (msg->axes[0]+0.09);
      }
      else if (msg->axes[0] < 0){
        ff_msg.position = -1 * msg->axes[0] + 0.09;
      }
      else {
        ff_msg.position = 0;
      }
      // ff_msg.position = -1 * (msg->axes[0]+0.09);
      ff_msg.torque = 0.5;
      // RCLCPP_INFO(this->get_logger());
      publisher_->publish(ff_msg);
    }
  rclcpp::Subscription<sensor_msgs::msg::Joy>::SharedPtr subscription_;
  rclcpp::Publisher<ros_g29_force_feedback::msg::ForceFeedback>::SharedPtr publisher_;
};

int main(int argc, char * argv[])
{
  rclcpp::init(argc, argv);
  rclcpp::spin(std::make_shared<Voyager>());
  rclcpp::shutdown();
  return 0;
}

这里面有一个Ubuntu的包叫joy,一般用于各鼠标键盘按压数据的接收的,我们这里可以用他来记录罗技29的转动角度(通过录rosbag的方式),到时候只需要播放bag包,罗技29方向盘就可以自己转动了;如果你想直接从autoware中获取方向盘的转动角度,也是可以的,需要修改一个subscribe(订阅者)的msg,然后根据发送过来的消息,将其中重要的数据,方向盘的转动角度,进行转发,转发给罗技方向盘就可以;

package.xml

<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
  <name>voyager_pub_sub</name>
  <version>0.0.0</version>
  <description>TODO: Package description</description>
  <maintainer email="m0_48707860@example.com">voyager</maintainer>
  <license>TODO: License declaration</license>

  <buildtool_depend>ament_cmake</buildtool_depend>

  <build_depend>rosidl_default_generators</build_depend>
  <exec_depend>rosidl_default_runtime</exec_depend>
  <member_of_group>rosidl_interface_packages</member_of_group>

  <depend>std_msgs</depend>
  <depend>rclcpp</depend>
  <depend>ros_g29_force_feedback</depend>
  <depend>sensor_msgs</depend>

  <test_depend>ament_lint_auto</test_depend>
  <test_depend>ament_lint_common</test_depend>

  <export>
    <build_type>ament_cmake</build_type>
  </export>
</package>

CMakeLists.txt怎么写呢?

cmake_minimum_required(VERSION 3.8)
project(voyager_pub_sub)


# Default to C99
if(NOT CMAKE_C_STANDARD)
  set(CMAKE_C_STANDARD 99)
endif()

# Default to C++14
if(NOT CMAKE_CXX_STANDARD)
  set(CMAKE_CXX_STANDARD 14)
endif()

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()

find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)
find_package(rosidl_default_generators REQUIRED)

find_package(ros_g29_force_feedback REQUIRED)
find_package(sensor_msgs REQUIRED)
# find_package(joy REQUIRED)

set(dependencies
  rclcpp
  std_msgs
  ros_g29_force_feedback
  sensor_msgs
)

# Generate project targer with msg
# rosidl_generate_interfaces(${PROJECT_NAME}
  # "msg/ForceFeedback.msg"
  # DEPENDENCIES rosidl_default_generators std_msgs)

# Add executable
add_executable(voyager_node src/voyager.cpp)
ament_target_dependencies(voyager_node ${dependencies})

install(TARGETS voyager_node
  DESTINATION lib/${PROJECT_NAME})

ament_export_dependencies(rosidl_default_runtime)

if(BUILD_TESTING)
  find_package(ament_lint_auto REQUIRED)
  # the following line skips the linter which checks for copyrights
  # uncomment the line when a copyright and license is not present in all source files
  #set(ament_cmake_copyright_FOUND TRUE)
  # the following line skips cpplint (only works in a git repo)
  # uncomment the line when this package is not in a git repo
  #set(ament_cmake_cpplint_FOUND TRUE)
  ament_lint_auto_find_test_dependencies()
endif()

ament_package()

 其中msg文件下存放的是,之前博客中罗技29的消息体;

include中没有东西;

然后C++代码写完,剩下的就是编译了,把这个节点编译出来

source /autoware/install/setup.bash

colcon build --allow-overriding autoware_auto_vehicle_msg

1.脚本1:用于更新代码中罗技29的event口

由于每次罗技29插在电脑上,开机重启的时候这个event可能会改变,所以我用shell脚本,写了一个找到罗技29的event,并修改代码;

#!/bin/bash

event=$(cat /proc/bus/input/devices | grep "Logitech G29 Driving Force Racing Wheel" -A 5 | grep "Handlers" | grep -o "event[0-9]*")

echo "Event number: $event"

sed -i "s|/dev/input/event[0-9]*|/dev/input/$event|" Lg29/ros2_ws/src/ros-g29-force-feedback/config/g29.yaml

echo "Event changed"

2.脚本2:用于启动罗技29的节点

#!/bin/bash

gnome-terminal -e 'ls -l'

source /opt/ros/galactic/setup.bash

cd Lg29/ros2_ws/

source install/setup.bash

ros2 run ros_g29_force_feedback g29_force_feedback --ros-args --params-file src/ros-g29-force-feedback/config/g29.yaml

3.脚本3:启动转发节点

#!/bin/bash


gnome-terminal -e 'ls -l'


cd record_g29/

source install/setup.bash

ros2 run voyager_pub_sub voyager_node

4.脚本4:如果是自己通过罗技29录制的rosbag,可以选择播放rosbag,也可以选择从autoware中把节点转发出来,然后启动autoware的节点:

今日思考:其实可以对方向盘的转动做出平滑,这样方向盘的转动会更舒缓;期待大家的改进!!!

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

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

相关文章

【Web3】认识区块链

目录 区块链特征 区块链类型 区块链的概念 区块链特征 去中心化&#xff1a;区块链是由一个分布在多个参与者之间的网络组成&#xff0c;没有中央机构或中介控制整个系统。所有参与者共同维护和验证账本的完整性&#xff0c;减少了单点故障和集中式控制的风险。共识机制&…

【HTTPS】采用的加密策略, 什么是中间人攻击? 什么是证书?

文章目录 前言一、认识 HTTPS 协议1, 对称加密2, 非对称加密 二、HTTPS 加密策略1, 只采用对称加密 : 不安全2, 引入非对称加密3, 中间人攻击之偷梁换柱4, 引入证书4.1 什么是证书4.2, 证书如何能解决"中间人攻击" 总结 前言 各位读者好, 我是小陈, 这是我的个人主页…

日历与时钟

目录 公历 黑色星期五 生物韵律 公历 在公历中&#xff0c;当年份为4的整数倍&#xff0c;但不是100的整数倍时&#xff0c;会出现闰年的现象。 y40 mod(y,4) 0 && mod(y,100)||mod(y,400)0 输出当时的年、月、日、时、分、秒 f%6d %6d %6d %6d %6d %9.3f\n cclock …

MySQL学习基础篇(八)---聚合函数

MySQL学习基础篇(八)—聚合函数 聚合&#xff08;或聚集、分组&#xff09;函数&#xff0c;它是对一组数据进行汇总的函数&#xff0c;输入的是一组数据的集合&#xff0c;输出的是单个值。 1. 聚合函数介绍 什么是聚合函数&#xff1a;聚合函数作用于一组数据&#xff0c;…

前端实战——尚品汇(网页开发)

/* 基础设置 */ .container {width: 1190px;margin: 0 auto; } /* #region顶部导航条start */ .topbar {height: 30px;background-color: #ececec; } .welcome {height: 30px;line-height: 30px;font-size: 0;color: #666; } .welcome span,.welcome a {font-size: 12px; } .we…

AIGC - Stable Diffusion WebUI 图像生成工具的环境配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/131528224 Stable Diffusion WebUI 是一款基于深度学习的图像生成工具&#xff0c;根据用户的输入文本或图像&#xff0c;生成高质量的新图像&…

关于VMware虚拟空间的创建、Linux系统的安装

文章目录 前言一、Windows用户安装VMware软件1.1 下载VMware1.2 正常安装VMware后&#xff0c;该软件是要收费的&#xff0c;但是下面的链接可以让你使用很久 二、Mac用户安装VMware软件2.1 下载macOS版本&#xff1a;VMware Fusion2.2 正常安装VMware后&#xff0c;该软件是要…

「2024」预备研究生mem-形式逻辑强化:推矛盾

一、推矛盾 易错题&#xff1a;重点 重点&#xff1a; 二、课后题 三、每日一练

新版本vscode使用配置文件功能,解决不同项目使用不同的插件

如果你同时有vue2,vue3的项目。一定会遇到插件的问题。因为vue2项目插件是使用vetur的&#xff0c;vue3是使用volar的。 以前vscode为了在不同项目中能使用不同的配置文件&#xff0c;是使用工作区的概念去解决的&#xff0c;但是比较复杂而且不好用。 现在新版本的vscode&…

【温故而知新】Android架构模式

Android项目工程中常用的架构模式有MVC, MVP, MVVM以及现在新出的MVI。 下面一起温故而知新。 MVC MVC&#xff08;Model-View-Controller&#xff09;是一种在Android应用程序中使用的架构模式&#xff0c;用于实现松耦合、可测试和可维护的应用程序。 MVC架构模式包括三个…

高级篇十六、多版本并发控制(重要)

目录 1、什么是MVCC2、快照读与当前读2.1 快照读2.2 当前读 3、复习3.1 隔离级别3.2 隐藏字段、Undo Log版本链 4、MVCC实现原理之ReadView4.1 什么是ReadView&#xff1f; 1、什么是MVCC MVCC &#xff08;Multiversion Concurrency Control&#xff09;&#xff0c;多版本并…

Django之ORM的锁,开启事务,Ajax

一、行锁 select_for_update(nowaitFalse, skip_lockedFalse) 注意必须用在事务里面&#xff0c;至于如何开启事务&#xff0c;我们看下面的事务一节 Book.objects.select_for_update().filter(nid3) # 锁住nid3的行select_for_update中的两个参数了解即可&#xff0c;因为在…

机器学习入门

AI人工智能 ANI 弱人工智能&#xff0c;狭义人工智能&#xff0c;指的是一种针对特定任务或领域进行优化的人工智能&#xff0c;例如语音识别、图像识别、自然语言处理、推荐系统 AGI 通用人工智能&#xff0c;强人工智能&#xff0c; ASI 超级人工智能&#xff0c;超人工智…

Erupt框架学习

Erupt框架学习 Erupt框架Erupt简介学习EruptEruptFieldErupt的逻辑删除Erupt的自定义按钮多数据源配置 Erupt框架 Erupt简介 最近因为工作所以接触到了一个低代码框架Erupt。这是一个通用的配置管理框架&#xff0c;主打就是零前端代码&#xff0c;急速开发通用管理框架。 Er…

C# 如何调用python,避免重复造轮子

文章目录 原因资源调用python文件需求解决方案1、C#里面运行python引入python文件&#xff0c;再调用其中的方法启动python脚本&#xff0c;监听返回值改造一下&#xff0c;可以入参的python调用查看是否等待python运行完成之后再运行C#如果参数比较复杂 开一个python网络后端 …

如何用Airtest脚本无线连接Android设备?

1. 前言 之前我们已经详细介绍过如何用AirtestIDE无线连接Android设备&#xff1a; 手把手教你用AirtestIDE无线连接手机&#xff01; &#xff0c;它的关键点在于&#xff0c;需要先 adb connect 一次&#xff0c;才能点击 connect 按钮无线连接上该设备&#xff1a; 但是有很…

​浅谈大型语言模型

大型语言模型&#xff08;Large Language Models&#xff0c;LLMs&#xff09;是一类强大的人工智能模型&#xff0c;具有出色的自然语言处理能力。它们在许多任务中表现出色&#xff0c;如机器翻译、文本摘要、对话生成和情感分析等。下面我们将介绍大型语言模型的训练和生成过…

海康监控摄像机接入NTV GBS GB28181平台实现远程调取监控视频

海康威视各种型号监控摄像头或硬盘录像机(NVR/HVR)接入NTV GBS GB28181平台配置过程都非常简单明了&#xff0c;但有些细节需要注意&#xff0c;避免走弯路踩泥坑。 1、基本要求 1)网络要求 总体来说&#xff0c;只要监控设备和GB28181平台的网络是连通的&#xff0c;设备可以主…

MATLAB基础篇(上)

一、MATLAB简介 MATLAB(Matrix Laboratory, 即矩阵实验室)是MathWork公司推出的一套高效率的数值计算和可视化软件.MATLAB是当今科学界最具影响力、也是最具活力的软件, 它起源于矩阵运算, 并已经发展成一种高度集成的计算机语言.它提供了强大的科学运算、灵活的程序设计流程、…