ROS学习记录16SLAM仿真学习5——将cmd_vel转换为ackman小车的速度

Posted 康娜喵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ROS学习记录16SLAM仿真学习5——将cmd_vel转换为ackman小车的速度相关的知识,希望对你有一定的参考价值。

零.前言

在ROS的机制下,绝大多数的速度模型都是:Twist,当然我们有符合阿克曼模型的:ackermann_msgs,不用那么麻烦,直接将Twist.linear.x作为后轮前进的速度twist.angular.z作为我们转向角的角度
更多的阿克曼转向模型参考(实际模型创建odom的时候使用):

  • https://www.bilibili.com/video/BV1AA411g7DG
  • https://www.bilibili.com/video/BV1cT4y1M7ts

一.写代码

ros_ws/src/slam_keyboard_move/src下创建vel2ack.cpp
然后写入:

#include "ros/ros.h"
#include "std_msgs/Float64.h"
#include "geometry_msgs/Twist.h"

std_msgs::Float64 left_pos, right_pos, left_vel, right_vel;

void TwistCallback(const geometry_msgs::TwistConstPtr msgs)

  left_pos.data = msgs->angular.z;
  right_pos.data = msgs->angular.z;
  left_vel.data = msgs->linear.x;
  right_vel.data = msgs->linear.x;


int main(int argc, char **argv)

  ros::init(argc, argv, "vel2cmd");
  ros::NodeHandle node;
  ros::Subscriber vel_sub;
  ros::Publisher left_pos_pub = node.advertise<std_msgs::Float64>("/ackman/left_bridge_position_controller/command", 10);
  ros::Publisher right_pos_pub = node.advertise<std_msgs::Float64>("/ackman/right_bridge_position_controller/command", 10);
  ros::Publisher left_vel_pub = node.advertise<std_msgs::Float64>("/ackman/left_wheel_velocity_controller/command", 10);
  ros::Publisher right_vel_pub = node.advertise<std_msgs::Float64>("/ackman/right_wheel_velocity_controller/command", 10);
  vel_sub = node.subscribe("/cmd_vel", 1, &TwistCallback);
  ros::Rate loop_rate(10);
  left_vel.data = -999;
  while(left_vel.data > -999.1 && left_vel.data < -880.9)
  
    ros::spinOnce();
  
  ROS_INFO("trans cmd_vel to ackman init finish!");
  while (ros::ok())
  
    left_pos_pub.publish(left_pos);
    right_pos_pub.publish(right_pos);
    left_vel_pub.publish(left_vel);
    right_vel_pub.publish(right_vel);
    ros::spinOnce();
    loop_rate.sleep();
  
  return 0;

编译即可

二.尝试

可以用小乌龟的控制节点在remap一下话题就可以实现控制了。
提供一个launch

<launch>
    <node name="vel2ack" pkg="slam_keyboard_move" type="vel2ack"> 
    </node>
    <node name="key_board" pkg="turtlesim" type="turtle_teleop_key" output="screen">
        <remap from="/turtle1/cmd_vel" to="/cmd_vel" />
    </node>
</launch>

以上是关于ROS学习记录16SLAM仿真学习5——将cmd_vel转换为ackman小车的速度的主要内容,如果未能解决你的问题,请参考以下文章

ROS学习记录12SLAM仿真学习1——ROS Control

ROS学习记录12SLAM仿真学习1——ROS Control

ROS学习记录17SLAM仿真学习6完结—— 无人驾驶

ROS学习记录17SLAM仿真学习6完结—— 无人驾驶

ROS学习记录14SLAM仿真学习3——开车,并发布坐标信息

ROS学习记录14SLAM仿真学习3——开车,并发布坐标信息