自动驾驶系列(十)编写电动车ROS节点(刹车)

2023-05-16

一、硬件控制协议

       对于不同的设备,底层的通讯方式都不一致,因此需要根据具体硬件具体分析。本系统 采用了1个CAN盒子控制转向,1路DA控制油门,另外一路DA控制刹车。

1,转向协议

      CAN协议获取当前状态的帧ID是0x322,发送控制指令的ID是0x215。500kbps。

     一条十六进制控制码是 00 31 X1 X2 Y1 00 00 00。

     其中X1*256+X2=控制角度 Y1控制角速度。

2,油门协议

      串口转DA控制模块,设置波特率9600bps。

      一条十六进制控制码是 01 06 00 00 X1 X2 Y1 Y2。

     其中,X1*256+X2控制DA输出电压。空载测试大约 5km/h对应 01 99,10km/h对应 03 33。

     Y1和Y2分别是对前八位数据进行CRC校验后的输出结果。

3,刹车协议

     串口转DA控制模块,设置波特率9600bps。

     启动刹车:01 06 00 00 0c cd 4d 5f。

     取消刹车:01 06 00 00 00 00 89 ca。

二、ROS节点接收速度控制消息

     对于ROS节点的编写规则,可以参考本系列第二讲中推荐的ros基本教程。

    首先创建功能包,实现监听cmd_vel消息,命名为bjtucar:

cd ~/catkin_ws/src
catkin_create_pkg bjtucar std_msgs std_msgs roscpp

 创建节点订阅文件myCar.cpp

cd ~/catkin_ws/src/bjtucar/src/
gedit myCar.cpp

在文件中粘贴以下内容:

#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
void cmd_vel_callback(const geometry_msgs::Twist& vel_cmd)
{
    ROS_INFO("I heard: [%f]", vel_cmd.linear.y);
     ROS_INFO("I heard: [%f]", vel_cmd.linear.x);
    std::cout << "Twist Received " << std::endl;
}
int main( int argc, char* argv[] )
{
    ros::init(argc, argv, "myCar" );
    ros::NodeHandle n;
    ros::Subscriber sub = n.subscribe("/turtle1/cmd_vel", 1000, cmd_vel_callback);
    while( n.ok() )
    {
        ros::spin();
    }
    return 1;
}

在CMakeList.txt文件最后增加代码:

add_executable(bjtucar ./src/myCar.cpp)
target_link_libraries(bjtucar ${catkin_LIBRARIES})

重新编译

cd ~/catkin_ws
catkin_make

测试:打开4个终端,分别运行以下节点

启动内核:   roscore

启动仿真乌龟节点: rosrun turtlesim turtlesim_node

启动键盘控制节点: rosrun turtlesim turtle_teleop_key

启动myCar节点: rosrun bjtucar bjtucar

可以通过输入方向键,发送cmd_vel消息,myCar节点监听该消息后打印出来。

 新终端,rqt_graph查看当前节点状态

 三、ROS节点控制刹车

控制油门和刹车,都需要添加串口节点,我们先假设配置油门是串口1,刹车是串口2。首先按照一个串口添加。

3.1添加串口功能

查看串口设备,修改串口名称:ls /dev/tty*。  一般是ttyACM0 或者 ttyUSB0。

#include <ros/ros.h>
#include <geometry_msgs/Twist.h>

#include <serial/serial.h>
serial::Serial ser; //声明串口对象 1
void cmd_vel_callback(const geometry_msgs::Twist& vel_cmd)
{
    ROS_INFO("I heard: [%f]", vel_cmd.linear.y);
     ROS_INFO("I heard: [%f]", vel_cmd.linear.x);
    std::cout << "Twist Received " << std::endl;
}
int main( int argc, char* argv[] )
{
    ros::init(argc,argv,"serial_port");
    //设置串口属性,并打开串口
    ser.setPort("/dev/ttyACM0");
    ser.setBaudrate(9600);
    serial::Timeout to = serial::Timeout::simpleTimeout(100);
    ser.setTimeout(to);
    try
    {
        ser.open();
    }
    catch (serial::IOException& e)
    {
        ROS_ERROR_STREAM("Unable to open port ");
        return -1;
    }
    //检测串口是否已经打开,并给出提示信息
    if(ser.isOpen())
    {
        ROS_INFO_STREAM("Serial Port initialized");
    }
    else
    {
        return -1;
    }

    ros::init(argc, argv, "myCar" );
    ros::NodeHandle n;
    ros::Subscriber sub = n.subscribe("/turtle1/cmd_vel", 1000, cmd_vel_callback);
    while( n.ok() )
    {
        ros::spin();
    }
    return 1;
}

修改CMakeList.txt文件,添加了serial的包依赖。

cmake_minimum_required(VERSION 3.0.2)
project(bjtucar)

find_package(catkin REQUIRED COMPONENTS
  serial
  roscpp
  std_msgs
  std_msgs
)

catkin_package(
)


include_directories(
# include
  ${catkin_INCLUDE_DIRS}
)

add_executable(bjtucar ./src/myCar.cpp)
target_link_libraries(bjtucar ${catkin_LIBRARIES})

安装serial包,再次编译通过。

sudo apt-get install ros-melodic-serial
cd ~/catkin
catkin_make

启动内核节点:roscore

启动myCar节点: rosrun bjtucar bjtucar

修改USB权限: sudo chmod 666 /dev/ttyUSB0
再次运行,成功。

 3.2串口调试工具cutecom

 (1)终端下载命令:sudo apt-get install cutecom 

 (2)通过终端打开软件:sudo cutecom (需要root权限,否则无法打开串口)

 3.3输出控制指令

当键盘按下”↑“时,刹车踏板松开。当键盘按下”↓“时,刹车踩下。

修改myCar.cpp文件内容如下:

#include <ros/ros.h>
#include <geometry_msgs/Twist.h>

#include <serial/serial.h>
serial::Serial ser; //声明串口对象 1

//static unsigned char doBrake[8];	//分配静态存储空间
unsigned char doBrake[8]={0x01, 0x06, 0x00, 0x00, 0x0c, 0xcd, 0x4d, 0x5f};
unsigned char noBrake[8]={0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x89, 0xca};

//int doBrake[8]={1, 6, 0, 0, 12, 205, 77, 95};
//int noBrake[8]={1, 6, 0, 0, 0, 0, 137, 202};
void cmd_vel_callback(const geometry_msgs::Twist& vel_cmd)
{
    ROS_INFO("I heard: [%f]", vel_cmd.linear.y);
     ROS_INFO("I heard: [%f]", vel_cmd.linear.x);
    std::cout << "Twist Received " << std::endl;

    if(vel_cmd.linear.x>0)
        ser.write(noBrake,8);
    else if(vel_cmd.linear.x<0)
        ser.write(doBrake,8);
    else;
}
int main( int argc, char* argv[] )
{
    ros::init(argc,argv,"serial_port");
    //设置串口属性,并打开串口
    ser.setPort("/dev/ttyUSB0");
    ser.setBaudrate(9600);
    serial::Timeout to = serial::Timeout::simpleTimeout(100);
    ser.setTimeout(to);
    try
    {
        ser.open();
    }
    catch (serial::IOException& e)
    {
        ROS_ERROR_STREAM("Unable to open port ");
        return -1;
    }
    //检测串口是否已经打开,并给出提示信息
    if(ser.isOpen())
    {
        ROS_INFO_STREAM("Serial Port initialized");
    }
    else
    {
        return -1;
    }

    ros::init(argc, argv, "myCar" );
    ros::NodeHandle n;
    ros::Subscriber sub = n.subscribe("/turtle1/cmd_vel", 1000, cmd_vel_callback);
    while( n.ok() )
    {
        ros::spin();
    }
    return 1;
}

重新编译

cd ~/catkin
catkin_make

测试:

1,用两个串口模块连接到电脑端。并查看串口号。ttyUSB0的输出用导线连接到ttyUSB1的输入。

 2,打开串口调试工具,监控串口ttyUSB1。

sudo cutecom

 3,依次启动节点

启动内核:   roscore

启动键盘控制节点: rosrun turtlesim turtle_teleop_key

启动myCar节点: rosrun bjtucar bjtucar

 

 在键盘输入的终端,分别输入方向按键,可以监控到串口出不同的刹车指令。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自动驾驶系列(十)编写电动车ROS节点(刹车) 的相关文章

随机推荐

  • 6.1、startx命令怎么不能进入图形界面

    命令行界面输入startx命令怎么不能进入图形界面 复制链接 发表于 2010 1 29 12 55 来自 51CTO网页 只看他 楼主 我在虚拟机 xff08 vmware xff09 上新安装的red hat linux 9 0在命令行
  • 7.1、mysql mha 主从自动切换 高可用

    是这个博主写的 xff0c 但是找不到地址了 写了他的另一个MHA地址 感谢原创的贡献 mysql mha 主从自动切换 高可用 mha xff08 Master High Availability xff09 目前在MySQL多服务器 x
  • 7.3、mysql主主循环备份数据库

    绿色部分是我根据需要自己写的 mysql 主主互备 双机热备的概念简单说一下 xff0c 就是要保持两个数据库的状态自动同步 对任何一个数据库的操作都自动应用到另外一个数据库 xff0c 始终保持两个数据库数据一致 这样做的好处多 1 可以
  • 7.4、Slave_SQL_Running: No mysql同步故障解决方法

    Slave SQL Running No mysql同步故障解决方法 2010 02 21 16 31 30 标签 xff1a mysql 数据库 同步 双机 休闲 原创作品 xff0c 允许转载 xff0c 转载时请务必以超链接形式标明文
  • 7.5、mysql破解密码

    找不到原创了 xff0c 百度了一下 xff0c 这个比较像 感谢原创的贡献 vi etc my cnf 在配置文件中加入 s kip grant tables mysqld safe skip grant tables amp 最佳答案
  • Scrum实践系列之三--敏捷教练的修炼之路

    敏捷教练与项目经理 在被奉为 项目管理圣经 的PMBOK中 xff0c 对项目经理在各阶段的职责有着清晰的界定 xff0c 比如项目经理制定规则 安排进度 监控执行中的各项风险并实时汇报状态 xff0c 等等 然而在敏捷的世界里 xff0c
  • 知识图谱_概述:课程PPT+个人理解

    2019 05 08 一 概念 xff08 是什么 xff09 1 知识 xff1a 有不同的解释 xff0c 可以是 不变的真理 经验 背景 解释 交工的信息 xff08 1 xff09 分类 陈述性知识 gt 描述客观事物的性状和关系等
  • chatgpt

    transformer GitHub Topics GitHub
  • Apollo:source cyber/setup.bash的作用

    source cyber setup bash 是在使用Apollo开发过程中 xff0c 用于加载Apollo软件的配置以及环境变量的脚本 Apollo是一款自动驾驶开发平台 xff0c cyber是其中的一个核心模块 xff0c 提供了
  • 什么样的人当不好程序员?

    什么样的人当不好程序员 xff1f 2016 01 21 程序员之家 来源 xff1a 36Kr 译文 xff1a http 36kr com p 5042433 html 原文 xff1a https goo gl jLfUFq 软件蚕食
  • java基础语法(顺便回顾cpp语法并比较与java的异同)

    变量 标识符 关键字与数据类型 1 标识符命名风格约定 xff1a 不能以数字开头 xff0c 也不能有 等符号 可以有 和 但不用作开头 方法名 变量名首单词小写 xff0c 其余单词首字母大写 如anyVariableName 类名 接
  • 刷leetcode,锻炼编程能力(c++)

    力扣20 xff0c 有效的括号 xff0c 栈 span class token macro property span class token directive keyword include span span class toke
  • 华为笔试题库之困难--难度

    题记 xff1a 若立志投身算法研究 xff0c 可精研理论算法 xff1a 动态规划 递归 深度搜索等 xff1b 若以解决问题为目的 xff0c 主要为了工作内容 xff0c 当尝试快而简单的方法 xff0c 这该是学习的本意 1 素数
  • C++ - opencv应用实例之矩形框检测

    C opencv应用实例之矩形框检测 现阶段下 目标检测在实际应用场景中的表现颇为重要 工业质检 移动机器人视觉伺服 作业 交通监控 安防领域等均需要通过目标检测来实现对目标的定位 测量或者统计 辅助控制等 目前目标检测主要分为两个方向的发
  • cpp-5 : Depends: gcc-5-base (= 5.3.1-14ubuntu2) but 5.4.0-6ubuntu1~16.04.11 is to be installed

    在5 4 0 6ubuntu1 16 04 11 cpp 5 amd64 Xenial 16 04 Ubuntu上下载对应的版本 xff0c 国 内源的版本都是5 4 0 6ubuntu1 16 04 12 xff0c 最后一位是12 xf
  • Questasim SystemC 指令sccom

    QuestaSim sccom 10 6c 1 compiler 2017 09 Sep 15 2017 Usage sccom options CPP compiler options lt CPP files gt General Op
  • MacOS 安装curl和wget

    目录 1 什么是curl和wget1 1 curl1 2 wget1 3 curl和wget的区别 2 安装curl2 1 利用wget安装curl2 2 直接下载curl源码编译安装 推荐 3 安装wget3 1 利用Homebrew安装
  • linux tty core 源码分析__tty_read,__tty_write,__tty_poll,

    转载 xff1a http blog csdn net sirzjp article details 6134489 前面分析了open操作 xff0c 现在分析读操作tty read tty read直接调用线路规程中的读操作从tty g
  • D触发器二分频电路

    D触发器二分频电路 有时真的要感慨一下自己电路学的够烂的 xff0c 啥都不会 xff0c 做示波器要学习分频电路 xff0c 学呗 将D触发器的Q非端接到数据输入端D即可实现二分频 xff0c 说白了就是CLK时钟信号的一个周期Q端电平反
  • 自动驾驶系列(十)编写电动车ROS节点(刹车)

    一 硬件控制协议 对于不同的设备 xff0c 底层的通讯方式都不一致 xff0c 因此需要根据具体硬件具体分析 本系统 采用了1个CAN盒子控制转向 xff0c 1路DA控制油门 xff0c 另外一路DA控制刹车 1 xff0c 转向协议