基于ros_control使用真实硬件odrive搭建两轮差分小车

1.硬件及结构件

2.标定电机

参考:
标定电机,配置can接口

3.ros_control

参考
ros control介绍博客
ros control代码 GIT

  1. 配置车体参数
  1. 配置手柄
  1. ros control 模板 结构说明

代码:main.cpp

#include <ros/ros.h>
#include <controller_manager/controller_manager.h>
#include <dynamic_reconfigure/server.h>
#include "odrive_diff.h"

int main(int argc, char **argv) {
    ros::init(argc, argv, "odrive_driver");
    
    // Create and initialize driver
    odrive_diff robot; //初始化 差分小车控制对象  TODO: 需要自定义
    printf("Create and initialize driver.\n");

    controller_manager::ControllerManager cm(&robot); //控制器对象 
    printf("Create and initialize controller_manager.\n");
    
    ros::AsyncSpinner spinner(1);
    spinner.start();

    ros::Time prev_time = ros::Time::now();
    ros::Rate rate(50.0);

    while (ros::ok()) {
        const ros::Time time = ros::Time::now();
        const ros::Duration period = time - prev_time;
        robot.read(); // TODO:需要自定义
        cm.update(time, period);
        robot.write(); // TODO:需要自定义
        rate.sleep();
        //robot.updateWD(); // TODO:喂狗 需要自定义
    }
    return 0;
}

从模板里可以看出只要对robot类进行相应的编写即可,这个类需要重写read函数、write函数、updateWD函数。

代码:odrive_diff.h中编写底盘控制指令的代码即可

#include <controller_manager/controller_manager.h>
#include <hardware_interface/joint_command_interface.h>
#include <hardware_interface/joint_state_interface.h>
#include <hardware_interface/robot_hw.h>

using namespace odrive_can_ros;

class odrive_diff : public hardware_interface::RobotHW {
public:
    odrive_diff(); 
    ~odrive_diff();
    void read(); 
    void write();
    void updateWD();

private:
    hardware_interface::JointStateInterface joint_state_interface;
    hardware_interface::VelocityJointInterface velocity_joint_interface;
    // The units for wheels are radians (pos), radians per second (vel,cmd), and Netwton metres (eff)
    //单位
    struct Joint {
        std_msgs::Float64 pos; //反馈的转
        std_msgs::Float64 vel; //反馈的速度
        std_msgs::Float64 eff; //力矩
        std_msgs::Float64 cmd; //速度指令
    } joints[2];  //对于控制器
    /******************************/
    // ODRIVE CAN SETUP VARIABLES //
    CANSimple master; //CAN解析的程序
    /******************************/
    ros::Time current_time;
    ros::Time last_read;
    ros::Time startTime;
};

继承 hardware_interface::RobotHW类,重写其中的发送控制函数以及读取反馈的函数即可实现控制
odrive_diff.cpp中编写底盘控制指令的代码即可

odrive_diff::odrive_diff()
{ 
  hardware_interface::JointStateHandle left_wheel_state_handle(
    "left_wheel", &joints[0].pos.data, &joints[0].vel.data, &joints[0].eff.data);

  hardware_interface::JointStateHandle right_wheel_state_handle(
    "right_wheel", &joints[1].pos.data, &joints[1].vel.data, &joints[1].eff.data);

  joint_state_interface.registerHandle(left_wheel_state_handle);
  joint_state_interface.registerHandle(right_wheel_state_handle);
  registerInterface(&joint_state_interface);

  hardware_interface::JointHandle left_wheel_vel_handle(
    joint_state_interface.getHandle("left_wheel"), &joints[0].cmd.data);

  hardware_interface::JointHandle right_wheel_vel_handle(
    joint_state_interface.getHandle("right_wheel"), &joints[1].cmd.data);
W
  velocity_joint_interface.registerHandle(left_wheel_vel_handle);
  velocity_joint_interface.registerHandle(right_wheel_vel_handle);
  registerInterface(&velocity_joint_interface);
  /****** ODRIVE CAN SETUP *******/
    master.init();
}

odrive_diff::~odrive_diff()
{
  // Set velocity 关闭设置速度为0 
}

void odrive_diff::read()
{
  /****** ODRIVE CAN Collect data 读取电机驱动器数据 *******/
  vel0 = left_vel;
  vel1 = right_vel;
  pos0 = left_pos;
  pos1 = right_pos;
  //printf("****************robot in read FINSH wheel line vel;反馈的速度添到vel**********************.\n");
  joints[0].vel.data = -1*DIRECTION_CORRECTION * (vel0) * 2*PI*wheel_radius;   
  joints[1].vel.data = DIRECTION_CORRECTION * (vel1) * 2*PI*wheel_radius;

  joints[0].pos.data = -1*DIRECTION_CORRECTION * (pos0) * 2*PI*wheel_radius;
  joints[1].pos.data = DIRECTION_CORRECTION * (pos1) * 2*PI*wheel_radius;
}

void odrive_diff::write()
{
  double left_speed =   -1*DIRECTION_CORRECTION * (joints[0].cmd.data); 
  double right_speed =    DIRECTION_CORRECTION * (joints[1].cmd.data) ;
  /* 设置控制 左右轮速 joints[*].cmd.data */
}

void odrive_diff::updateWD(void){
  // update watchdog
}

4.odrive协议替换

can 教程

使用odrive 驱动 解析can数据

5.实车测试

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: `ros_control`是ROS中的一个控制框架,用于实现机器人的高级控制。它提供了一套抽象的控制接口,使得机器人的硬件控制和软件控制可以被分离开来。`ros_control`框架包含了多个组件,例如控制器(controller)、硬件接口(hardware interface)、传感器接口(sensor interface)等,这些组件可以按照需要组合在一起,构出适合不同机器人和应用场景的控制系统。 在`ros_control`框架下,机器人的控制器可以通过订阅机器人状态信息(如关节角度、速度、加速度等),并根据控制策略发布控制指令,控制机器人的运动。同时,硬件接口可以将控制指令转化为实际的电机控制信号,从而控制机器人的运动。 `ros_control`框架的优势在于它提供了一套标准化的控制接口,使得不同类型的机器人可以使用同一套控制器进行控制。这样,开发者可以更加专注于机器人的应用开发,而不必关注底层的硬件控制细节。 ### 回答2: ros_control是一个在ROS(机器人操作系统)中用于控制机器人的软件包。它提供了一种标准化的方法来控制不同类型的机器人,包括机械臂、移动机器人和其他类型的机器人。 ros_control的设计目标是提供一个灵活且可扩展的控制架构,以满足不同机器人的控制需求。它将机器人控制分为硬件接口和控制器两个层次。硬件接口层负责处理机器人硬件和传感器的数据交互,包括读取传感器数据和发送控制命令到机器人硬件。控制器层则负责实现控制算法,根据硬件接口提供的数据计算出适当的控制命令,并发送给硬件接口层执行。 通过ros_control使用者可以很容易地编写自己的硬件接口和控制器。它提供了一套标准化的接口和类来处理机器人控制相关的操作。使用标准化接口可以使不同类型的硬件接口和控制器之间可以互相替换,而无需修改其他部分的代码。这使得开发者可以更加专注于控制算法的设计和实现,而不需要关注细节的硬件接口实现。 此外,ros_control还提供了一些常用的控制器实现,如PID控制器、位置控制器和速度控制器等。这些控制器可以直接用于控制机器人,而无需用户自己实现。同时,它也支持用户自定义控制器,使开发者可以根据自己的需求实现更复杂的控制策略。 总而言之,ros_control是一个在ROS中控制机器人的重要软件包。它提供了一套灵活且可扩展的控制架构,使开发者可以更加方便地设计和实现机器人控制算法。 ### 回答3: ros_control是一个ROS(Robot Operating System)软件包,用于控制机器人硬件。它提供了一个灵活和通用的框架,用于在ROS中实现各种机器人控制算法和架构。 ros_control主要由以下几个组件组成: 1. 硬件接口(Hardware Interface):该组件定义了机器人硬件和控制系统之间的接口,包括传感器和执行器。它允许开发者将具体的机器人硬件ros_control框架进行连接和集成。 2. 控制器(Controller):该组件实现了具体的机器人控制算法,例如PID控制器、状态机控制等。开发者可以根据机器人的需求编写自定义控制器,或者使用已经提供的控制器。 3. 控制器管理器(Controller Manager):该组件负责启动、停止和切换控制器。它允许用户通过ROS话题或服务接口来管理机器人的不同控制器,并实现控制器间的平滑过渡。 4. 硬件接口管理器(Hardware Interface Manager):该组件管理不同硬件接口的初始化和更新。它通过ros_control中定义的硬件接口统一处理传感器和执行器的数据流。 使用ros_control,开发者可以方便地在ROS中实现机器人的控制功能。它提供了一个统一的接口和管理机制,使得不同的控制器和硬件接口能够无缝集成,并能够通过ROS的通信机制进行配置和切换。 总之,ros_control是一个强大而灵活的机器人控制框架,它提供了一个通用的接口和管理机制,方便开发者在ROS中实现机器人的各种控制算法和架构。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值