​​​​​​​[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(dependenciesrclcppstd_msgsros_g29_force_feedbacksensor_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_nodeDESTINATION 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.bashcolcon build --allow-overriding autoware_auto_vehicle_msg

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

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

#!/bin/bashevent=$(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.yamlecho "Event changed"

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

#!/bin/bashgnome-terminal -e 'ls -l'source /opt/ros/galactic/setup.bashcd Lg29/ros2_ws/source install/setup.bashros2 run ros_g29_force_feedback g29_force_feedback --ros-args --params-file src/ros-g29-force-feedback/config/g29.yaml

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

#!/bin/bashgnome-terminal -e 'ls -l'cd record_g29/source install/setup.bashros2 run voyager_pub_sub voyager_node

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

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

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

  1. Unity接入罗技G29方向盘,通过SDK获取按键信息

    Unity接入罗技G29方向盘,通过SDK获取按键信息 说明:   最近需要做一个外设汽车驾驶相关的软件,采用的外设 罗技G29方向盘,项目中遇到的问题这里记录一下. 项目准备:   1.下载罗技的S ...

  2. 面部表情视频中进行远程心率测量:ICCV2019论文解析

    面部表情视频中进行远程心率测量:ICCV2019论文解析 Remote Heart Rate Measurement from Highly Compressed Facial Videos: an ...

  3. 读后感与机翻《从视频中推断力量和学习人类效用》

    以下是研究朱松纯FPICU概念中U(utility)的相关论文记录: 读后感: 作者干了什么事? (1)算法能够预测当人们与物体交互时,身体各个部位(臀部.背部.头部.颈部.手臂.腿等)所承受的力/压 ...

  4. Python使用OpenCV+pillow提取AVI视频中关键帧图像

    问题描述:使用OpenCV把AVI视频切分成静态图像,提取视频中的关键帧,保存为0.jpg.1.jpg.2.jpg....... 实现步骤: 1)安装扩展库 2)准备一个AVI视频,这里以微课系列(5 ...

  5. 【视频相关】视频中常出现的参数解释——2018年6月16日

    视频中常出现的参数解释 [帧 Frame] 帧速率(FPS,frame per second 帧率):每秒钟出现的帧数 由胶片概念的产生而出现,把静态的连续画面进行播放以达到动态影像需要每秒出现8格, ...

  6. Android 音视频配音之音频提取、截断、混音、合并、合成(一)——从视频中提取音频文件

    目录 前言 提取前提----了解提取需要用到的工具类:MediaExtractor.MediaCodec 1.MediaExtractor 2.MediaCodec 3.释放 具体提取转码代码 调用 ...

  7. python识别视频中某个物体的轨迹_用Matlab来识别视频中物体的运动轨迹!

    对于很多生命科学领域的研究者来说,研究生物的行为是很多人研究工作中必不可少的部分.在进行生物行为研究工作的时候,生物的运动又是重中之重.这这里我以小鼠的一段运动视频为例,教大家用Matlab来分析视频 ...

  8. ubuntu20.04安装Carla并配置罗技G29方向盘使用

    环境:ubuntu20.04+anaconda+python3.7+ros2 foxy+Logitech g29 一.安装Carla github地址: https://github.com/carl ...

  9. HIveSQL面试题52:近一个月发布的视频中热度最高的top3视频【抖音面试题,不得不去吐槽的一个题目】

    目录 0 问题描述 1 数据准备 2 问题分析 3 小结 0 问题描述 现有用户-视频互动表tb_user_video_log id uid video_id start_time end_time ...

最新文章

  1. warning LNK4098: 默认库“MSVCRT”与其他库的使用冲突;使用 /NODEFAULTLIB:library问题解决方法
  2. 闲诗一首:《扬州即行》
  3. 子元素的margin-top影响父元素原因和解决办法
  4. 当代年轻人加班报告!
  5. 关于Clipboard剪切板获取值为NULL问题解决方法
  6. mybatis项目报错:java.sql.SQLException: ORA-00911: 无效字符 解决方法
  7. 这是一条“神奇”的评论
  8. String.Format数字格式化参考
  9. BIO,NIO的区别,使用场景。
  10. 7 Web前端性能优化
  11. creo数控编程怎么样_Creo4.0数控加工教程
  12. 初学者,学哪一种3d模型设计软件比较好?
  13. f(x)对g(x)求导的理解
  14. Scala中TypeTags和Manifests的用法
  15. 将两条类似的sql合并
  16. android 8.0设置横幅通知,安卓微信8.0.3正式更新:新增公告横幅提醒等8大更新!...
  17. 简化版的宿舍管理系统(有细微的逻辑问题,没优化)
  18. 华为的王炸黑科技鸿蒙系统,华为黑科技“cyberverse”发布,“鸿蒙系统”在其面前都不值一提...
  19. 揭开人创造思维之谜:浴缸和床最易引发灵感
  20. 表格头固定而列可滚动的效果

热门文章

  1. 京东前端工程化和静态资源管理全面总结
  2. 电脑开始锁定计算机有什么用,电脑Scroll Lock键有什么用的
  3. 邮寄快递时应注意的7点
  4. 搞定Flink架构流程图
  5. DW1000开发笔记(二)使用STM32硬件SPI+STM32cubeMX+HAL库测试DW1000通信
  6. 数据库视图的作用和优势
  7. Spring注解介绍
  8. (附AK代码)第四届“传智杯”全国大学生IT技能大赛(决赛B组)题解
  9. 我们身边40岁的Android程序员的“晚年“
  10. WebDriver 的协议标准 W3C