carla与g29联合调试(一)

news2024/12/22 17:57:00

前言:

之前做的carla与g29的联合调试,现在记录一下carla控制g29的实现流程。

一、总体通讯流程

主要实现为carla中车辆的方向盘转动带着g29跟着一起转动,使用ros通讯来实现这个过程。

二、具体实现流程

2.1首先确定g29的力反馈和转动

使用的是开源的方案:g29力反馈

$ cd catkin_ws/src 
$ git clone https://github.com/ncnynl/ros-g29-force-feedback.git
$ cd ../ 
$ catkin_make

编译通过后。查看打开CMakeLists.txt文件,这里的:

 这里就是向g29发送控制指令的node,使用前必须现运行这个node。在运行前,需要确定g29插入usb的端口。

使用命令:

cat /proc/bus/input/devices

 查看g29的端口:

 现在获取它的端口为event4 js0,分别是力反馈和方向盘转动的端口。

然后修改yaml文件,一般在config文件夹里面:

 没有的话,自己创建一个。

 然后修改这里的device_name这里的部分。

然后将这个config写入,使用命令:

rosparam load ./src/ros-g29-force-feedback/config/g29.yaml 
rosrun g29_force_feedback g29_force_feedback_node 

出现下面的标志就表示g29的旋转与力反馈接口成功打开。

现在测试一下,使用命令:

source devel/setup.bash
rosrun g29_force_feedback talker.py 

然后可以在talker.py里面修改相关的参数,g29msg.angle是转动的角度,g29msg.force是力反馈的力度。

#!/usr/bin/env python                                                                                                                 
import rospy

from std_msgs.msg import String
from g29_force_feedback.msg import ForceFeedback

def talker():
    rospy.init_node('talker')
    pub = rospy.Publisher('ff_target', ForceFeedback, queue_size=20)
#    pub = rospy.Publisher('g29test', String, queue_size=20)                                                                          

    r = rospy.Rate(0.5)
    while not rospy.is_shutdown():
      # str = "angle: 0.5 force: 0.6"                                                                                                 
      g29msg = ForceFeedback()
      g29msg.angle = 0
      g29msg.force = 0.4
      rospy.loginfo(g29msg)
      pub.publish(g29msg)
      #break                                                                                                                          
      r.sleep()

if __name__ == '__main__':
    try:
        talker()
    except rospy.ROSInterruptException: pass

会输出信息:

 同时方向盘有转动,表示力反馈设置成功。这里的talker.py写的很清晰,就不解析了,之后也是在这个框架上简单的修改后达成carla中车辆控制g29方向盘的效果。

2.2 输出carla中车辆的转动信息

依据前面实现力反馈的包,使用ros来输出carla中车辆转动信息。需要自己根据carla中的车辆转动信息来自定义设置消息格式。我没有使用carla_ros_bridge自己写了单独的接口,具体实现参考前面写的文章:

carla和ros不通过carla_ros_bridge进行lidar发送_hex_refugeeeee的博客-CSDN博客

这里给出实现的源码:

# 将车辆设置成自动驾驶模式

import rospy
from pub_steer.msg import Carla_steer
import carla
import random
from agents.navigation.behavior_agent import BehaviorAgent

def get_steering_wheel_angle(vehicle):
    # 获取车辆的方向盘信息
    control = vehicle.get_control()
    steering_wheel_angle = control.steer

    return steering_wheel_angle

def main():
    client = carla.Client('localhost', 2000)
    client.set_timeout(10.0)
    world = client.get_world()
    origin_settings = world.get_settings()
    settings = world.get_settings()
    settings.synchronous_mode = True
    settings.fixed_delta_seconds = 0.05
    world.apply_settings(settings)

    blueprint_library = world.get_blueprint_library()

    try:
        # 确定起点和终点
        p11 = carla.Location(229, 116, 2)
        p12 = carla.Location(240, 116, 2)
        p21 = carla.Location(20, 194, 2)
        p22 = carla.Location(20, 198, 2)
        start_point1 = carla.Transform(p11, carla.Rotation(0,90,0))

        end_point1 = carla.Transform(p21, carla.Rotation(0, 0, 0))

        
        # 创建车辆
        ego_vehicle_bp = blueprint_library.find('vehicle.audi.a2')
        ego_vehicle_bp.set_attribute('color', '0, 0, 0')

        # ROS节点初始化
        rospy.init_node('carla_steer_publisher', anonymous=True)
        car_info_pub = rospy.Publisher('vehicle_steer_info', Carla_steer, queue_size=10)

        # 两种模式,设置成自动驾驶模式
        spawn_points = world.get_map().get_spawn_points()
        random.shuffle(spawn_points)

        vehicle1 = world.spawn_actor(ego_vehicle_bp, spawn_points[3])
        # 设置车辆的驾驶模式
        agent1 = BehaviorAgent(vehicle1, behavior='normal')
        if spawn_points[0].location != agent1._vehicle.get_location():
            destination = spawn_points[0]
        else:
            destination = spawn_points[1]

        agent1.set_destination(end_point1.location)

        while not rospy.is_shutdown():
            world.tick()
            agent1._update_information()
            if (len(agent1._local_planner._waypoints_queue) < 1):
                random.shuffle(spawn_points)
                if spawn_points[0].location != agent1._vehicle.get_location():
                    destination = spawn_points[0]
                else:
                    destination = spawn_points[1]
                agent1.set_destination(destination.location)
            # 设置速度限制
            speed_limit1 = vehicle1.get_speed_limit()
            agent1.get_local_planner().set_speed(speed_limit1)
 
            control1 = agent1.run_step(debug=True)
            vehicle1.apply_control(control1)

            # 获得carla中车辆的方向盘传动信息 steering_angle
            steering_angle = get_steering_wheel_angle(vehicle1)
            
            car_info_msg = Carla_steer()
            car_info_msg.steer_angle = steering_angle
            print("方向盘转动:", steering_angle)
            car_info_pub.publish(car_info_msg)
    
    finally:
        world.apply_settings(origin_settings)
        vehicle1.destroy()

if __name__ == '__main__':

    try:
        main()
    except KeyboardInterrupt:
        pass
    finally:
        print('\ndone.')

注释写的很清晰,注意使用了自定义消息类型,我写的自定义消息类型是这个,可以根据不同的需要自己写:

 主要实现就是这些,其他的部分比较简单。

这节就将carla中车辆的转向消息通过ros自定义消息类型发送出去了,整个项目实现了2/3了。

2.3 接收carla发送的方向盘转动信息

这节就是前面提到的,根据talker.py的框架写的接收上一节中发送的方向盘转动信息。比较简单,直接给出源码。

#!/usr/bin/env python                                                                                                                 
import rospy

from g29_force_feedback.msg import Carla_steer
from g29_force_feedback.msg import ForceFeedback    


pub = rospy.Publisher('ff_target', ForceFeedback, queue_size=20)

def sub_g29(data):
    steer_datas = data.steer_angle
    print(steer_datas)    
    g29msg = ForceFeedback()
    g29msg.angle = steer_datas
    g29msg.force = 0.4
    # rospy.loginfo(g29msg)
    pub.publish(g29msg)

def talker():
    rospy.init_node('talker')

    rospy.Subscriber('vehicle_steer_info', Carla_steer, sub_g29)

    rospy.spin()                                                            

if __name__ == '__main__':
    try:
        talker()
    except rospy.ROSInterruptException: pass

到这里基本上所有的实现就完成了,rqt:

 视频效果还是比较明显的,就是力反馈的设置需要调试,使得它归零的时候会左右摇摆:

Carla中车辆反向控制g29_哔哩哔哩_bilibili

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

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

相关文章

基于LoRA微调部署Stable Diffusion【免费试用阿里云】

文章目录 Stable Diffusion介绍环境及资源准备过程注交互式建模&#xff08;PAI-DSW&#xff09;的试用在创建的工作空间中创建实例安装 Diffusers Stable Diffusion介绍 Stable Diffusion 是一种文本到图像的潜在扩散模型&#xff0c;由 Runway 和慕尼黑大学合作构建&#xf…

学习day52

1.关于 error Component name "School" should always be multi-word vue/multi-word-component-names 这里是因为脚手架的规范原因&#xff0c; 解决办法&#xff1a; 我是在vue.comfig.js文件中加入了一条配置&#xff0c;即 lintOnSave:false 整个文件的完整…

Spring Boot单元测试入门指南

Spring Boot单元测试入门指南 JUnit是一个成熟和广泛应用的Java单元测试框架&#xff0c;它提供了丰富的功能和灵活的扩展机制&#xff0c;可以帮助开发人员编写高质量的单元测试。通过JUnit&#xff0c;开发人员可以更加自信地进行重构、维护和改进代码&#xff0c;同时提高代…

(学习笔记)如何理解TCP是面向字节流的协议,UDP是面向报文的协议?

如何理解字节流&#xff1f; 之所以会说TCP是面向字节流的协议&#xff0c;UDP是面向报文的协议&#xff0c;是因为操作系统对TCP和UDP协议的发送方的机制不同&#xff0c;也就是问题原因在发送方 为什么UDP协议是面向报文的协议&#xff1f; 当用户消息通过UDP协议传输时&…

从原理到实践,分析 Redisson 分布式锁的实现方案(二)

上篇讲解了如何用 Redis 实现分布式锁的方案&#xff0c;它提供了简单的原语来实现基于Redis的分布式锁。然而&#xff0c;Redis作为分布式锁的实现方式也存在一些缺点。本文将引入Redisson来实现分布式锁。 一、Redisson是什么 Redisson是一个基于Redis的分布式Java框架。它提…

flutter(01) windows桌面版 编译环境安装指南

1 flutter环境安装 flutter官网参考&#xff1a;Install | Flutter 先下载flutter SDK>&#xff1a;flutter sdk下载--官网&#xff0c;之后解压到C:\Users\XXX\data&#xff08;这里以该路径为例&#xff0c;但可以为其他自定义路径&#xff09;目录下&#xff0c;在这里…

5.python设计模式【单例模式】

内容&#xff1a;保证一个类只有一个实例&#xff0c;并提供一个访问它的全局访问点角色&#xff1a; 单例&#xff08;Singleton&#xff09; UML图 举个例子&#xff1a; 需求&#xff1a;一个类只能实例化一个对象&#xff0c;不能实例化多个对象 from abc import abstract…

MATLAB与ROS联合仿真——ROS环境搭建及相关准备工作(上)

本篇文章主要介绍在安装完ROS后&#xff0c;在进行MATLAB与ROS联合仿真之前&#xff0c;需要进行的一些环境搭建以及准备工作&#xff0c;主要分为 创建ROS工作空间及功能包、必备功能包安装、安装Gazebo11、导入实验功能包至工作空间、安装Visual_Studio_Code(选做)、常用便捷…

python 面向对象 - 类 - 实例 - 类的使用 - self - init方法 - ATM面向对象实验

目录 面向过程和面向对象的对比&#xff1f; 面向对象 面向对象两个重要概念&#xff1a; > class&#xff08;类&#xff09;、实例 类&#xff1a;具有相同属性或方法的对象的集合 属性(变量)&#xff1a;编号、位置、余额 方法&#xff08;函数&#xff09;&#xf…

[论文阅读笔记24]Social-STGCNN: A Social Spatio-Temporal GCNN for Human Traj. Pred.

论文: 论文地址 代码: 代码地址 作者在这篇文章中直接用GNN对目标的轨迹时空特征进行建模, 并用时序CNN进行预测, 代替了训练难度较大和速度较慢的RNN类方法. 0. Abstract 行人轨迹预测是一个比较有挑战性的任务, 有着许多的应用. 一个行人的轨迹不仅是由自己决定的, 而且受…

Vue消息订阅与发布

引入第三方库pubsub.js: npm i pubsub-js Student.vue import pubsub from pubsub-jsmethods:{sendStudentName(){// this.$bus.$emit(hello,this.name)pubsub.publish(hello,666)}}, School.vue import pubsub from pubsub-jsmounted() {// console.log("school&quo…

【监控系统】Promethus的查询PromQL详解及案例实战

首先我们先来了解一下什么是PromQL。 PromQL是Prometheus提供了内置的数据查询语言PromQL&#xff0c;全称为Prometheus Query Language。PromQL是对指标(Metric)的查询/聚合/过滤的处理&#xff0c;Metric的语法格式 <metric name>{<label name><label value&…

优维低代码实践:添加构件

优维低代码技术专栏&#xff0c;是一个全新的、技术为主的专栏&#xff0c;由优维技术委员会成员执笔&#xff0c;基于优维7年低代码技术研发及运维成果&#xff0c;主要介绍低代码相关的技术原理及架构逻辑&#xff0c;目的是给广大运维人提供一个技术交流与学习的平台。 优维…

Mac 安装启动RabbitMq

使用HomeBrew安装 未安装的请参照我的这篇Mac安装HomeBrew文章 安装 执行命令 brew install rabbitmq启动方式 brew services start rabbitmq端口说明 端口用处5672RabbitMQ通讯端口&#xff0c;也就是连接使用的端口15672RabbbitMQ管理界面端口&#xff0c;需要开启Manage…

区块链实验室(10) - 实例说明PBFT的共识过程

前面描述过PBFT的仿真方式&#xff0c;见区块链实验室(3) – 用Go语言仿真PBFT算法&#xff0c;本文以上述仿真程序说明PBFT的共识过程。 为叙述方便&#xff0c;首先给出1个简化的网络&#xff0c;共4个节点&#xff0c;构成如下图所示的网络。这样的网络可以避免冗余的网络报…

ASEMI快恢复二极管SFP6012A参数, SFP6012A规格

编辑-Z SFP6012A参数描述&#xff1a; 型号&#xff1a;SFP6012A 最大峰值反向电压(VRRM)&#xff1a;1200V 平均整流正向电流(IF)&#xff1a;60A 非重复峰值浪涌电流(IFSM)&#xff1a;500A 工作接点温度和储存温度(TJ, Tstg)&#xff1a;-40 to 175℃ 最大热阻(RθJC…

链动2+1营销系统开发模式深度解析

链动21模式其实是一种针对快消品行业的营销模式&#xff0c;主要逻辑就是用薄利多销丰厚返利的方式来吸引客户&#xff0c;同时快速裂变团队。 这个模式的玩法也很简单&#xff0c;只有代理和老板两种身份&#xff0c;代理身份是用户购买499元产品可以解锁&#xff0c;同时享受…

【压测指南|压力测试核心性能指标及行业标准】

文章目录 压力测试核心性能指标及行业标准指标1&#xff1a;响应时间指标2&#xff1a;吞吐量&#xff08;TPS)指标3&#xff1a;失败率总结&#xff1a; 压力测试核心性能指标及行业标准 在做压力测试时&#xff0c;新手测试人员常常在看报告时倍感压力&#xff1a;这么多性能…

58,#include<algorithm>集合算法set_difference

功能描述&#xff1a; 求两个集合的差集 函数原型&#xff1a; set_difference(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest); //求两个集合的差集 //注意&#xff1a;两个集合必须是有序序列 //beg1 容器1开始迭代器 //end1 容器1结束迭代…

【Visual Studio】解决编译时报 .dll 缺失

VS启动白屏&#xff1a; VS2015启动界面卡在白屏的处理方法&#xff08;亲测有效&#xff09; 目前我遇到的 .dll 缺失错误&#xff0c;分为两种情况。 系统 .dll 文件缺失&#xff1a; 点击【调试】->【选项】&#xff0c;在弹出的对话框中点击【调试】->【符号】&…