# ROS绝尘小车说明 **Repository Path**: harryzhangabc/ros-vehicle-tasks ## Basic Information - **Project Name**: ROS绝尘小车说明 - **Description**: ROS绝尘智能下位机开发说明 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 7 - **Created**: 2020-12-09 - **Last Updated**: 2022-02-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ROS智能下位机开发说明 # 0x01 切换至上位机控制模式 **此功能常用于上位机跑飞导致的车辆失控后的手动控制** 拿起遥控器,按一下侧键,切换成上位机控制模式: ![遥控侧键](pic/1.jpg) **切换成功后,车辆表现为扣油门不动,打转向不转。此时表示车辆受上位机控制,若想返回遥控控制,只需要再按一下,就可以使用遥控控制油门和方向了** # 0x02 测试自适应串口上位机 - 首先,先把控制器上的typeC线插入一台安装有Windows系统的电脑。 - 然后打开设备管理器->端口。 ![串口](pic/2.png) - 记录下该端口,打开tools/XCOM.exe - 打开该端口,波特率随意,然后配置成如图所示: ![配置](pic/3.png) - 打开tools/发送帧计算器.xlsx,输入速度为30,方向为45 **(请保证车辆处于上位机控制模式)**。 ![xlsx](pic/4.png) - 切换回XCOM.exe,把十六进制这一行复制到发送区域中,数值与数值之间用空格连接,由于直接复制过来数值之间不是空格,需要手动用空格隔开。 ![xlsx](pic/5.png) - 点击发送,此时车轮应该旋转,方向并转一定角度。 # 0x03 编写ROS上位机控制程序 **通过上面的操作,我们已经知道了小车是会如何与上位机通讯了,现在我们可以根据上面的提示和原理,进行ROS程序的编写** **程序模板位于src下,还不完善,只是实现了收发,请老师们根据通讯协议,用实车调试、完善下代码** ### 串口设备说明 在LINUX系统下,所有串口设备被统一表示为ttyUSB*,找到这个串口,然后放到launch文件下,就可以对串口进行打开读写操作。 ### 编译程序模板 直接把程序放在catkin_ws/src下进行编译。 ### 串口操作方式 请阅读程序模板,里面给出了读写串口的示例。 ### 发送帧编码说明(这里用C代码实现,根据原理用python也可以实现) ![发送](pic/6.png) ```cpp void encode(void) { unsigned char sand_buff[14]; unsigned long sum; float speed; float direction; sand_buff[0] = sand_buff[1] = 0xaa;//帧头 sand_buff[13] = sand_buff[14] = 0xbb;//帧尾 sand_buff[2] = ((unsigned short)speed & 0xff00)>> 8; //取速度的高八位 sand_buff[3] = (unsigned short)speed & 0x00ff ; //取速度的低八位 sand_buff[4] = (unsigned short)(speed * 100) & 0xff; //取小数点后两位 sum=0; for(i=2;i<=10;i++) sum+=pack_data[i]; sand_buff[11] = (uint8_t)(sum & 0xff); //取所有数值(除了帧头帧尾)加起来的低八位 } ``` ### 接收解码说明 ![解码](pic/7.png) ```cpp static unsigned char rev_data[14];//接收数组 void decode(void) { if(rev_data[0] == 0xaa && rev_data[1] == 0xaa && rev_data[12] == 0xbb && rev_data[13] == 0xbb)//检查帧头帧尾 { for(i=2;i<=10;i++) sum += rev_data[i]; if((sum&0xff) != rev_data[11]) return -1; //计算校验和 float speed = (float)((int16_t)(rev_data[2]<<8 | rev_data[3])) + ((float)(int8_t)rev_data[4]/100);//接收到实时速度 unsigned char sbus_ch1 = rev_data[7]; //遥控器通道1 unsigned char sbus_ch1 = rev_data[8]; //遥控器通道2 unsigned char sbus_ch1 = rev_data[9]; //遥控器通道3 unsigned char sbus_ch1 = rev_data[10]; //遥控器通道4 } } ``` # 0x04 通过ROS控制小车 请先查看ROS小车 请将code文件夹里面的文件复制到catkin_ws本地文件夹中,直接编译即可。 ```bash cp -r code ~/catkin_ws cd ~/catkin_ws catkin build ``` 然后launch启动传输节点(**此处未测试可能有小bug**) ```bash roslaunch driver.launch ``` ### 通过上位机控制车速和转角 从这开始,节点会监听/cmd_vel的twist.x和twist.z信息,twist.x表示时速,twist.z表示转角。发布该消息即可实现上位机控制。 示例源码:example下,可以直接编译进行导航,但是目前下位机还未完善IMU等部分,需要等待完善。 # 0x05 使用遥控器和cartographer建图 [传送链接](https://gitee.com/iColin18/for-soft-links) # 0x06 GPS和IMU和其他 目前还没有想好GPS和IMU使用什么通讯协议上传,所以不在上传列表里面,接下来可能会采用Mavlink协议进行通讯,这两个模块功能可以通过重新编译下位机程序查看和实现。 # 0x07 下位机源码 [传送连接](https://gitee.com/harryzhangabc/cartographer-stm32)