基于ROS平台的移动机器人-3-小车底盘与ROS的通信

基于ROS平台的移动机器人-3-小车底盘与ROS的通信

1.ROS平台与底盘通信协议

ROS平台与小车底盘的通信一般是通过串口或者CAN总线。我这里采用的是串口,以下为我自定义的通信数据格式:

(1)底盘串口部分

1.串口接收
 (1)内容:小车左右轮速度,单位:mm/s(所有数据都为   float型,float型占4字节)
 (2)格式:10字节 
[右轮速度4字节][左轮速度4字节][结束符"\r\n"2字节]

2.串口发送
 (1)内容:里程计(x,y坐标、线速度、角速度和方向角,单位依次为:mm,mm,mm/s,rad/s,rad,所有数据都为float型,float型占4字节)
 (2)格式:21字节 
[x坐标4字节][y坐标4字节][方向角4字节][线速度4字节][角速度4字节][结束符"\n"1字节]

(2)ROS平台串口节点部分

1.写入串口
(1)内容:左右轮速度,单位为mm/s
(2)格式:10字节,[右轮速度4字节][左轮速度4字节][结束符"\r\n"2字节]
2.读取串口
(1)内容:小车x,y坐标,方向角,线速度,角速度,单位依次为:mm,mm,rad,mm/s,rad/s
(2)格式:21字节,[X坐标4字节][Y坐标4字节][方向角4字节][线速度4字节][角速度4字节][结束符"\n"1字节]

2.串口通信处理程序

(1)小车底盘串口处理程序。

底盘串口处理的程序主要写在了 main.c 文件中。

底盘向串口发送里程计代码:

if(main_sta&0x01)//执行发送里程计数据步骤
{
    //里程计数据获取
    x_data.odoemtry_float=position_x;//单位mm
    y_data.odoemtry_float=position_y;//单位mm
    theta_data.odoemtry_float=oriention;//单位rad
    vel_linear.odoemtry_float=velocity_linear;//单位mm/s
    vel_angular.odoemtry_float=velocity_angular;//单位rad/s

    //将所有里程计数据存到要发送的数组
    for(j=0;j<4;j++)
    {
        odometry_data[j]=x_data.odometry_char[j];
        odometry_data[j+4]=y_data.odometry_char[j];
        odometry_data[j+8]=theta_data.odometry_char[j];
        odometry_data[j+12]=vel_linear.odometry_char[j];
        odometry_data[j+16]=vel_angular.odometry_char[j];
    }

    odometry_data[20]='\n';//添加结束符

    //发送数据要串口
    for(i=0;i<21;i++)
    {
        USART_ClearFlag(USART1,USART_FLAG_TC);  //在发送第一个数据前加此句,解决第一个数据不能正常发送的问题             
        USART_SendData(USART1,odometry_data[i]);//发送一个字节到串口 
        while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); //等待发送结束            
    }

    main_sta&=0xFE;//执行计算里程计数据步骤
}

底盘接收串口发来的速度代码:

if(USART_RX_STA&0x8000)  // 串口1接收函数
{           
    //接收左右轮速度
    for(t=0;t<4;t++)
    {
        rightdata.data[t]=USART_RX_BUF[t];
        leftdata.data[t]=USART_RX_BUF[t+4];
    }

    //储存左右轮速度
    odometry_right=rightdata.d;//单位mm/s
    odometry_left=leftdata.d;//单位mm/s

    USART_RX_STA=0;//清楚接收标志位
}

(2)ROS平台串口处理程序

ROS平台串口处理程序主要写在 base_controller.cpp 文件中。

ROS平台向串口发送速度代码:

void callback(const geometry_msgs::Twist & cmd_input)//订阅/cmd_vel主题回调函数
{
    string port("/dev/ttyUSB0");    //小车串口号
    unsigned long baud = 115200;    //小车串口波特率
    serial::Serial my_serial(port, baud, serial::Timeout::simpleTimeout(1000)); //配置串口

    angular_temp = cmd_input.angular.z ;//获取/cmd_vel的角速度,rad/s
    linear_temp = cmd_input.linear.x ;//获取/cmd_vel的线速度.m/s

    //将转换好的小车速度分量为左右轮速度
    left_speed_data.d = linear_temp - 0.5f*angular_temp*D ;
    right_speed_data.d = linear_temp + 0.5f*angular_temp*D ;

    //存入数据到要发布的左右轮速度消息
    left_speed_data.d*=ratio;   //放大1000倍,mm/s
    right_speed_data.d*=ratio;//放大1000倍,mm/s

    for(int i=0;i<4;i++)    //将左右轮速度存入数组中发送给串口
    {
        speed_data[i]=right_speed_data.data[i];
        speed_data[i+4]=left_speed_data.data[i];
    }

    //在写入串口的左右轮速度数据后加入”/r/n“
    speed_data[8]=data_terminal0;
    speed_data[9]=data_terminal1;
    //写入数据到串口
    my_serial.write(speed_data,10);
}

ROS平台接收串口发来的里程计代码:

rec_buffer =my_serial.readline(25,"\n");    //获取串口发送来的数据
const char *receive_data=rec_buffer.data(); //保存串口发送来的数据
  • 22
    点赞
  • 97
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
以下是一个基于ROS的三层小车机器人的xacro代码示例,可以根据实际需要进行修改: ```xml <?xml version="1.0"?> <robot xmlns:xacro="http://ros.org/wiki/xacro"> <xacro:include filename="$(find xacro)/xacro.py" /> <!-- 定义小车机器人类型 --> <xacro:property name="robot_name" value="three_layer_robot" /> <xacro:property name="robot_description" value="This is a three-layer robot." /> <!-- 定义小车机器人尺寸和形状 --> <xacro:property name="robot_width" value="0.5" /> <xacro:property name="robot_length" value="0.8" /> <xacro:property name="robot_height" value="0.4" /> <!-- 定义小车机器人底盘 --> <xacro:macro name="base_link"> <link name="${robot_name}_base_link"> <visual> <geometry> <box size="${robot_width} ${robot_length} ${robot_height}" /> </geometry> <material name="blue"> <color rgba="0 0.5 1 1" /> </material> </visual> </link> </xacro:macro> <!-- 定义小车机器人轮子 --> <xacro:macro name="wheel"> <joint name="${robot_name}_wheel_joint" type="continuous"> <parent link="${robot_name}_base_link" /> <child link="${robot_name}_wheel_link" /> <origin xyz="0 0 0" rpy="0 0 0" /> <axis xyz="0 0 1" /> </joint> <link name="${robot_name}_wheel_link"> <visual> <geometry> <cylinder radius="0.1" length="0.05" /> </geometry> <material name="black"> <color rgba="0 0 0 1" /> </material> </visual> </link> </xacro:macro> <!-- 定义小车机器人层级和运动结构 --> <xacro:macro name="robot"> <xacro:include filename="$(find urdf)/urdf.xacro" /> <robot name="${robot_name}" description="${robot_description}"> <xacro:base_link /> <!-- 第一层 --> <joint name="${robot_name}_layer1_joint" type="prismatic"> <parent link="${robot_name}_base_link" /> <child link="${robot_name}_layer1_link" /> <origin xyz="0 0 ${robot_height / 2}" rpy="0 0 0" /> <axis xyz="0 0 1" /> <limit lower="0" upper="0.2" effort="1000" velocity="0.1" /> </joint> <link name="${robot_name}_layer1_link"> <visual> <geometry> <box size="${robot_width} ${robot_length} 0.1" /> </geometry> <material name="gray"> <color rgba="0.5 0.5 0.5 1" /> </material> </visual> </link> <!-- 第二层 --> <joint name="${robot_name}_layer2_joint" type="prismatic"> <parent link="${robot_name}_layer1_link" /> <child link="${robot_name}_layer2_link" /> <origin xyz="0 0 0" rpy="0 0 0" /> <axis xyz="0 0 1" /> <limit lower="0" upper="0.2" effort="1000" velocity="0.1" /> </joint> <link name="${robot_name}_layer2_link"> <visual> <geometry> <box size="${robot_width} ${robot_length} 0.1" /> </geometry> <material name="gray"> <color rgba="0.5 0.5 0.5 1" /> </material> </visual> </link> <!-- 第三层 --> <joint name="${robot_name}_layer3_joint" type="prismatic"> <parent link="${robot_name}_layer2_link" /> <child link="${robot_name}_layer3_link" /> <origin xyz="0 0 0" rpy="0 0 0" /> <axis xyz="0 0 1" /> <limit lower="0" upper="0.2" effort="1000" velocity="0.1" /> </joint> <link name="${robot_name}_layer3_link"> <visual> <geometry> <box size="${robot_width} ${robot_length} 0.1" /> </geometry> <material name="gray"> <color rgba="0.5 0.5 0.5 1" /> </material> </visual> </link> <!-- 运动结构 --> <joint name="${robot_name}_wheel1_joint" type="continuous"> <parent link="${robot_name}_layer3_link" /> <child link="${robot_name}_wheel1_link" /> <origin xyz="0.2 0 0" rpy="0 0 0" /> <axis xyz="0 0 1" /> </joint> <link name="${robot_name}_wheel1_link"> <xacro:wheel /> </link> <joint name="${robot_name}_wheel2_joint" type="continuous"> <parent link="${robot_name}_layer3_link" /> <child link="${robot_name}_wheel2_link" /> <origin xyz="-0.2 0 0" rpy="0 0 0" /> <axis xyz="0 0 1" /> </joint> <link name="${robot_name}_wheel2_link"> <xacro:wheel /> </link> </robot> </xacro:macro> <!-- 加载小车机器人 --> <xacro:robot /> </robot> ``` 此代码定义了一个名为“three_layer_robot”的三层小车机器人,具有基础底盘、三个升降层和两个轮子。可以根据需要对其进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Forrest-Z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值