ROS键盘控制机器人
目录
前言&&过程分析
第一步
第二步
第三步
第四步
PC端(上位机)代码
远程机器人(下位机)代码
前言&&过程分析
当我们需要使用键盘控制机器人的时候,通常,分为几步。
第一步
首先要会读取键盘事件,并判断哪个键盘按下去了,返回按下的按键键值。
这里有检测键盘按下事件的帖子:C++监听键盘事件(读取键盘输入)_qqliuzhitong的博客-CSDN博客
第二步
然后,我们的上位机(nanopi k2)根据按下去的按键的键值,发布一个指令消息,来广播这个键值。
第三步
接着,我们用下位机,另一台nanopi k2或者是一个arduino板子,来订阅这个指令消息。
第四步
最后,下位机(nanopi k2或者arduino板子)判断指令,根据指令进行相应,控制电机或者舵机,这样就完成了一个从上位机按下键盘按键到最终机器人做出反应的一个流程。
PC端(上位机)代码
#include <ros/ros.h>
#include <std_msgs/UInt16.h>
#include <termio.h>
#include <stdio.h>#define KEYCODE_W 0x77
#define KEYCODE_A 0x61
#define KEYCODE_S 0x73
#define KEYCODE_D 0x64
#define KEYCODE_I 0x69
#define KEYCODE_J 0x6A
#define KEYCODE_K 0x6B
#define KEYCODE_L 0x6C
#define KEYCODE_SPACE 0x20#define KEYCODE_A_CAP 0x41
#define KEYCODE_D_CAP 0x44
#define KEYCODE_S_CAP 0x53
#define KEYCODE_W_CAP 0x57int key_command=0x00;void scanKeyboard()
{struct termios new_settings;struct termios stored_settings;//设置终端参数tcgetattr(0,&stored_settings);new_settings = stored_settings;new_settings.c_lflag &= (~ICANON);new_settings.c_cc[VTIME] = 0;tcgetattr(0,&stored_settings);new_settings.c_cc[VMIN] = 1;tcsetattr(0,TCSANOW,&new_settings);key_command = getchar();tcsetattr(0,TCSANOW,&stored_settings);
}int main(int argc, char *argv[])
{setlocale(LC_ALL,"");ros::init(argc,argv,"keyboard_control");ros::NodeHandle nh;ros::Publisher key_publisher = nh.advertise<std_msgs::UInt16>("key_command",10);std_msgs::UInt16 key_c;//w:1 a:2 s:3 d:4 i:5 j:6 k:7 l:8while(1){scanKeyboard();switch(key_command){case KEYCODE_W:key_c.data=1;key_publisher.publish(key_c);break;case KEYCODE_A:key_c.data=2;key_publisher.publish(key_c);break;case KEYCODE_S:key_c.data=3;key_publisher.publish(key_c);break;case KEYCODE_D:key_c.data=4;key_publisher.publish(key_c);break;case KEYCODE_I:key_c.data=5;key_publisher.publish(key_c);break;case KEYCODE_J:key_c.data=6;key_publisher.publish(key_c);break;case KEYCODE_K:key_c.data=7;key_publisher.publish(key_c);break;case KEYCODE_L:key_c.data=8;key_publisher.publish(key_c);break;default:key_c.data=1;key_publisher.publish(key_c);break;}}
}
cmakelists.txt文件:
add_executable(keyboard src/keyboard.cpp)
target_link_libraries(keyboard${catkin_LIBRARIES}
)
远程机器人(下位机)代码
#include <ros/ros.h>#include <serial/serial.h>#include <iostream>#include <std_msgs/UInt16.h>//创建一个serial类serial::Serial sp;uint8_t hello1[12]={0xfa,0x10,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xf1};uint8_t hello2[12]={0xfa,0x10,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xf2};uint8_t hello3[12]={0xfa,0x10,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xf3};uint8_t hello4[12]={0xfa,0x10,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xf4};uint8_t hello5[12]={0xfa,0x10,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xf5};uint8_t hello6[12]={0xfa,0x10,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xf6};uint8_t hello7[12]={0xfa,0x10,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xf7};uint8_t hello8[12]={0xfa,0x10,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xf8};uint8_t hello9[12]={0xfa,0x10,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xf9};uint8_t hello10[12]={0xfa,0x10,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xfa};uint8_t hello11[12]={0xfa,0x10,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xfb};void command_Callback(const std_msgs::UInt16& key_c){ros::Rate loop_rate(1);switch(key_c.data){ case 1:sp.write(hello1, 12);break;case 2:sp.write(hello2, 12);break;case 3:sp.write(hello3, 12);break;case 4:sp.write(hello4, 12);break;case 5:sp.write(hello5, 12);break;case 6:sp.write(hello6, 12);break;case 7:sp.write(hello7, 12);break;case 8:sp.write(hello8, 12);break;case 9:sp.write(hello9, 12);loop_rate.sleep();sp.write(hello10, 12);loop_rate.sleep();sp.write(hello11, 12);loop_rate.sleep();break;default:;}// ROS_INFO("hello");}int main(int argc, char** argv){ros::init(argc, argv, "serial_port");ros::NodeHandle n;//创建serial timeoutserial::Timeout to = serial::Timeout::simpleTimeout(100);//设置要打开的串口名称sp.setPort("/dev/ttyUSB0");//设置串口通信的波特率sp.setBaudrate(9600);//串口设置timeoutsp.setTimeout(to);try{//打开串口sp.open();}catch(serial::IOException& e){ROS_ERROR_STREAM("Unable to open port.");return -1;}//判断串口是否打开成功if(sp.isOpen()){ROS_INFO_STREAM("/dev/ttyUSB0 is opened.");}else{return -1;}ros::Subscriber pose_sub=n.subscribe("key_command",10,command_Callback);//// if(ros::ok())// {// uint8_t hello1[12]={0xfa,0x10,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xfb};//// uint8_t hello2[12]={0xfa,0x10,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xfb};// uint8_t hello3[12]={0xfa,0x10,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xfb};//把数据发送// sp.write(hello1, 12);// loop_rate.sleep();// sp.write(hello2, 12);// loop_rate.sleep();// sp.write(hello3, 12);// loop_rate.sleep();// }//关闭串口// sp.close();ros::spin(); sp.close();return 0;}
工程代码链接:
catkin_ws_serial.tar-Linux文档类资源-CSDN下载
ROS键盘控制机器人相关推荐
- 多车调度问题(大疆Robot Master)——ROS键盘控制失灵,小车无法收敛定位,路径规划出错
问题1 ROS键盘控制小车失灵 具体就是:用键盘左右转小车,速度贼快,而且方向不正确,检查发现是控制模块失灵,有可能是内部测量元件(陀螺仪等)烧了,换了个控制模块解决. 问题2 小车无法收敛定位 具体 ...
- ROSNOTE : 键盘控制机器人运动
ROS与底盘的通信协议: ROS平台与小车底盘通信一般是通过串口 写入串口的内容是 左右轮的速度 从串口中读取到的是小车x,y坐标,方向角,角速度 ROS平台串口处理程序: 主要是写在base_con ...
- ROS | 键盘控制
文章目录 概述 一.定义介绍 二.功能作用 三.使用方法 四.实例演示 概述 在研发机器人/自动驾驶时,可能没有遥控器,又或者是仿真环境等情况,常常需要通过键盘控制小车. 一.定义介绍 本节详 ...
- (二)ROS中控制机器人运动(示例运行)
ROS中让机器人运动的步骤如下: (1)新建机器人模型 (2)运行.launch文件加载模型 (3)加载rviz的配置文件 (4)发布消息使用机器人运动 首先使用<ROS_by_example& ...
- ubuntu14.04+windows双系统安装Ros indigo 与pioneer (测试的是3at和3dx) 键盘控制
1.安装Linux系统,通过软件UltraISO 下载软件,打开文件,找到linux.iso文件,配置硬盘,写入 安装方式(WIn10+Linux论坛找的,win7直接分出50G,插u盘装就可以,如果 ...
- ros_indigo使用keyboard键盘控制虚拟或实际机器人
首先,上参考网址: http://wiki.ros.org/Robots/TIAGo http://wiki.ros.org/teleop_twist_keyboard 第一个,使用TIAGo的gaz ...
- ROS 教程2 机器人雷达建图 蒙特卡洛定位 导航 路径规划 仿真
ros 机器人雷达建图 蒙特卡洛定位 导航 路径规划 仿真 move_base gmapping acml 博文github 一.安装 turtlebot 移动机器人底座 进行导航 1.安装系统依赖 ...
- 6 电脑键盘控制机器人
6.1 建立上位机与下位机的联系 (1)将ros_arduino_bridge拷贝进入src文件夹. (2)进入src--ros_arduino_bridge--ros_arduino_python- ...
- (四)turtlebot3控制机器人在实际环境下建图
本文实现两个功能,实际控制机器人及在实际环境下建图 实际控制机器人有两种方式,一种是在树莓派上安装和运行键盘操作程序.另外一种是在电脑上运行键盘操作程序 以下TurtleBot3 SBC 代表树莓派, ...
最新文章
- 物联网可应用于十大行业嘛?
- Win7安装软件,界面上中文显示乱码的解决方案
- 环信ease-sdk-3.3.4_r1 集成用户头像 昵称功能的简单处理方法
- VMware10.0中安装CentOS8时提示客户机操作系统已禁用CPU,请关闭或重置虚拟机
- c# 读取 txt 文件中数据(int)
- linux内存操作--ioremap和mmap
- Linux下文件系统目录结构
- 数据库零碎要点002---认识时序数据库
- 武汉市15区科技企业孵化器及众创空间补贴附武汉市科技企业孵化器和众创空间管理办法
- 【爬虫】Python爬虫实战,Python实现中国地铁数据可视化arcmap
- 黑莓8820刷机教程 设置
- 22HTML5期末大作业:电影网站设计——电影我不是药神响应式页播(4页) HTML+CSS+JavaScript 大学生电影网页作品 影视网页设计作业模板 学生网页制作源代码下载
- win10计算机安全策略设置,win10系统重置本地安全策略所有设置的操作方法
- python输入整数反转输出_Python反转输出正整数
- echarts实现组织结构图
- 游戏设计梦工厂学习笔记(一)
- HTL6033是一款专用于3串锂电池或聚合物电池的保护芯片
- 数据结构实验:城市交通咨询模拟系统
- Mc1.16forge官混教程/教补-#3 物品材质覆盖注意要点[分支1]
- 大学计算机实验六文件管理与磁盘恢复,做“文件管理与磁盘恢复”实验完成以下实验报告表并提交...
热门文章
- 历数国内外知名制作人~~制作人发展趋势
- adguard home上网慢_AdGuardHome最新版本DNS设置负载均衡设置讨论:哪种设置快
- 李岳恒:2020年的经济趋势研判
- H5架设新手小白搭建教程(适用于新手)
- 360度全方位解析死链接
- ORA-00937:不是单组分组函数 ORA-22818:这里不允许出现子查询表达式
- scrcpy - 手机无线投屏到电脑
- 如何用几何画板把圆奇数等分
- 【SpringBoot】 日志框架冲突
- 2021AAPM大赛第一名技术报告Designing an Iterative Network for Fanbeam-CTwith Unknown Geometry 阅读笔记