此功能常用于上位机跑飞导致的车辆失控后的手动控制
拿起遥控器,按一下侧键,切换成上位机控制模式:
切换成功后,车辆表现为扣油门不动,打转向不转。此时表示车辆受上位机控制,若想返回遥控控制,只需要再按一下,就可以使用遥控控制油门和方向了
通过上面的操作,我们已经知道了小车是会如何与上位机通讯了,现在我们可以根据上面的提示和原理,进行ROS程序的编写
程序模板位于src下,还不完善,只是实现了收发,请老师们根据通讯协议,用实车调试、完善下代码
在LINUX系统下,所有串口设备被统一表示为ttyUSB*,找到这个串口,然后放到launch文件下,就可以对串口进行打开读写操作。
直接把程序放在catkin_ws/src下进行编译。
请阅读程序模板,里面给出了读写串口的示例。
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); //取所有数值(除了帧头帧尾)加起来的低八位
}
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
}
}
请先查看ROS小车 请将code文件夹里面的文件复制到catkin_ws本地文件夹中,直接编译即可。
cp -r code ~/catkin_ws
cd ~/catkin_ws
catkin build
然后launch启动传输节点(此处未测试可能有小bug)
roslaunch driver.launch
从这开始,节点会监听/cmd_vel的twist.x和twist.z信息,twist.x表示时速,twist.z表示转角。发布该消息即可实现上位机控制。
示例源码:example下,可以直接编译进行导航,但是目前下位机还未完善IMU等部分,需要等待完善。
目前还没有想好GPS和IMU使用什么通讯协议上传,所以不在上传列表里面,接下来可能会采用Mavlink协议进行通讯,这两个模块功能可以通过重新编译下位机程序查看和实现。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。