Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
智能小车_平衡车
RT-Robot机器人框架_小车_机械臂_无人机
狂暴战车 使用 rt-robots 软件包 “组装” car
发布于 2019-07-24 11:30:26 浏览:2606
订阅该版
[tocm] # 狂暴战车 使用 rt-robots 软件包 “组装” car ## 首先需要获取软件包,过程如下 1. 在工程目录打开 env 工具,使用 ”pkgs --upgrade“ 更新软件包索引(ps:此只需要进行一次) 2. env 中使用 ”menuconfig“ 命令选中 rt-botos 软件包,然后退出配置界面并保存 3. 若没有使能 env 的自动更新软件包功能则需要手动更新,在 env 中使用命令 “scons --update” 更新软件包(下载) ## 然后添加应用文件,重新生成工程 在 applications 目录下添加空白文件 car.c 之后就要重新生成工程了,当然如果使用 gcc 编译的话,没有这个需要, 此处我使用 mdk 编译下载,需要生成工程。在 env 中使用命令 “scons --target=mdk5” 生成 mdk 工程。 ## ”组装“ car 在空白的 car.c 中使用 rt-robots “组装” 自己的小车。组装流程大致是: 1. 初始化车轮 (为车轮添加电机、编码器、PID) 2. 初始化动力学模型 3. 初始化车底盘 (为底盘添加车轮、动力学模型) 完成后 car.c 内容如下 (_*当前含有遥控部分*_) ```C #include
#include
#include
#include
#include
#include
#include
#define DBG_SECTION_NAME "car" #define DBG_LEVEL DBG_LOG #include
// MOTOR #define LEFT_FORWARD_PWM "pwm4" #define LEFT_FORWARD_PWM_CHANNEL 3 #define LEFT_BACKWARD_PWM "pwm4" #define LEFT_BACKWARD_PWM_CHANNEL 4 #define RIGHT_FORWARD_PWM "pwm2" #define RIGHT_FORWARD_PWM_CHANNEL 3 #define RIGHT_BACKWARD_PWM "pwm2" #define RIGHT_BACKWARD_PWM_CHANNEL 4 // ENCODER #define LEFT_ENCODER_A_PHASE_PIN 31 // GET_PIN(B, 15) #define LEFT_ENCODER_B_PHASE_PIN 34 // GET_PIN(C, 2) #define RIGHT_ENCODER_A_PHASE_PIN 36 // #define RIGHT_ENCODER_B_PHASE_PIN 8 // #define PULSE_PER_REVOL 2000 // Real value 2000 #define SAMPLE_TIME 50 // CONTROLLER PID #define PID_SAMPLE_TIME 50 #define PID_PARAM_KP 6.6 #define PID_PARAM_KI 6.5 #define PID_PARAM_KD 7.6 // WHEEL #define WHEEL_RADIUS 0.066 #define GEAR_RATIO 1 // CAR chassis_t chas; #define WHEEL_DIST_X 0 #define WHEEL_DIST_Y 0.13 // Car Thread #define THREAD_PRIORITY 10 #define THREAD_STACK_SIZE 512 #define THREAD_TIMESLICE 5 static rt_err_t car_forward(rt_int8_t cmd, void *param); static rt_err_t car_backward(rt_int8_t cmd, void *param); static rt_err_t car_turnleft(rt_int8_t cmd, void *param); static rt_err_t car_turnright(rt_int8_t cmd, void *param); static rt_err_t car_stop(rt_int8_t cmd, void *param); static rt_thread_t tid_car = RT_NULL; void car_thread(void *param) { // TODO struct velocity target_velocity; target_velocity.linear_x = 0.00f; target_velocity.linear_y = 0; target_velocity.angular_z = 0; chassis_set_velocity(chas, target_velocity); while (1) { rt_thread_mdelay(50); chassis_update(chas); } } void car_init(void *parameter) { // 1. Initialize two wheels - left and right wheel_t* c_wheels = (wheel_t*) rt_malloc(sizeof(wheel_t) * 2); if (c_wheels == RT_NULL) { LOG_D("Failed to malloc memory for wheels"); } // 1.1 Create two motors dual_pwm_motor_t left_motor = dual_pwm_motor_create(LEFT_FORWARD_PWM, LEFT_FORWARD_PWM_CHANNEL, LEFT_BACKWARD_PWM, LEFT_BACKWARD_PWM_CHANNEL); dual_pwm_motor_t right_motor = dual_pwm_motor_create(RIGHT_FORWARD_PWM, RIGHT_FORWARD_PWM_CHANNEL, RIGHT_BACKWARD_PWM, RIGHT_BACKWARD_PWM_CHANNEL); // 1.2 Create two encoders ab_phase_encoder_t left_encoder = ab_phase_encoder_create(LEFT_ENCODER_A_PHASE_PIN, LEFT_ENCODER_B_PHASE_PIN, PULSE_PER_REVOL); ab_phase_encoder_t right_encoder = ab_phase_encoder_create(RIGHT_ENCODER_A_PHASE_PIN, RIGHT_ENCODER_B_PHASE_PIN, PULSE_PER_REVOL); // 1.3 Create two pid contollers inc_pid_controller_t left_pid = inc_pid_controller_create(PID_PARAM_KP, PID_PARAM_KI, PID_PARAM_KD); inc_pid_controller_t right_pid = inc_pid_controller_create(PID_PARAM_KP, PID_PARAM_KI, PID_PARAM_KD); // 1.4 Add two wheels c_wheels[0] = wheel_create((motor_t)left_motor, (encoder_t)left_encoder, (controller_t)left_pid, WHEEL_RADIUS, GEAR_RATIO); c_wheels[1] = wheel_create((motor_t)right_motor, (encoder_t)right_encoder, (controller_t)right_pid, WHEEL_RADIUS, GEAR_RATIO); // 2. Iinialize Kinematics - Two Wheel Differential Drive kinematics_t c_kinematics = kinematics_create(TWO_WD, WHEEL_DIST_X, WHEEL_DIST_Y, WHEEL_RADIUS); // 3. Initialize Chassis chas = chassis_create(c_wheels, c_kinematics); // Set Sample time encoder_set_sample_time(chas->c_wheels[0]->w_encoder, SAMPLE_TIME); encoder_set_sample_time(chas->c_wheels[1]->w_encoder, SAMPLE_TIME); controller_set_sample_time(chas->c_wheels[0]->w_controller, PID_SAMPLE_TIME); controller_set_sample_time(chas->c_wheels[1]->w_controller, PID_SAMPLE_TIME); // 4. Enable Chassis chassis_enable(chas); // Register command command_register(COMMAND_CAR_STOP , car_stop); command_register(COMMAND_CAR_FORWARD , car_forward); command_register(COMMAND_CAR_BACKWARD , car_backward); command_register(COMMAND_CAR_TURNLEFT , car_turnleft); command_register(COMMAND_CAR_TURNRIGHT, car_turnright); rt_kprintf("car command register complete
"); // Controller ps2_init(28, 29, 62, 61); // thread tid_car = rt_thread_create("tcar", car_thread, RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); if (tid_car != RT_NULL) { rt_thread_startup(tid_car); } } static rt_err_t car_forward(rt_int8_t cmd, void *param) { struct velocity target_velocity; target_velocity.linear_x = 0.05f; target_velocity.linear_y = 0; target_velocity.angular_z = 0; chassis_set_velocity(chas, target_velocity); LOG_D("forward cmd"); return RT_EOK; } static rt_err_t car_backward(rt_int8_t cmd, void *param) { struct velocity target_velocity; target_velocity.linear_x = -0.05f; target_velocity.linear_y = 0; target_velocity.angular_z = 0; chassis_set_velocity(chas, target_velocity); LOG_D("backward cmd"); return RT_EOK; } static rt_err_t car_turnleft(rt_int8_t cmd, void *param) { struct velocity target_velocity; target_velocity.linear_x = 0.00f; target_velocity.linear_y = 0; target_velocity.angular_z = 0.5; chassis_set_velocity(chas, target_velocity); LOG_D("turnleft cmd"); return RT_EOK; } static rt_err_t car_turnright(rt_int8_t cmd, void *param) { struct velocity target_velocity; target_velocity.linear_x = 0.00f; target_velocity.linear_y = 0; target_velocity.angular_z = -0.5; chassis_set_velocity(chas, target_velocity); LOG_D("turnright cmd"); return RT_EOK; } static rt_err_t car_stop(rt_int8_t cmd, void *param) { struct velocity target_velocity; target_velocity.linear_x = 0.00f; target_velocity.linear_y = 0; target_velocity.angular_z = 0; chassis_set_velocity(chas, target_velocity); LOG_D("stop cmd"); return RT_EOK; } ``` ### 说明: - PULSE_PER_REVOL 车轮转一圈输出的脉冲数 - SAMPLE_TIME 编码器采样时间,现单位为 ms - PID_SAMPLE_TIME PID计算周期,现单位为 ms - WHEEL_RADIUS 车轮半径, 标准单位 m - GEAR_RADIUS 电机减速比,无量纲 - WHEEL_DIST_X X轴方向两轮之间的间距,标准单位 m - WHEEL_DIST_Y Y轴方向两轮之间的间距,标准单位 m _*Command register 和 ps2_init 与 "组装" car 无关,无需关注*_ ## 注意事项 - 关注 rt-robots 软件包文档, 注意小车坐标系等
查看更多
13
个回答
默认排序
按发布时间排序
moss
2019-07-24
这家伙很懒,什么也没写!
那么强大吗?自带两轮差速驱动模型啊
shadowliang
2019-07-25
Hello,world!!!
厉害厉害,正疑问着rt-robots 软件包应该怎样用呢。感谢楼主分享。
sogw
2019-07-25
这家伙很懒,什么也没写!
>那么强大吗?自带两轮差速驱动模型啊 对的, 还有四轮等的动力学模型
AdamShen
2019-07-30
这家伙很懒,什么也没写!
命令是pkgs --upgrade吧?
sogw
2019-07-30
这家伙很懒,什么也没写!
>命令是pkgs --upgrade吧? 是的, 感谢提醒, 我改下
sogw
2019-08-01
这家伙很懒,什么也没写!
rt-robot 软件包有更新,接口变动。更新“组装”过程
ysj
2019-09-13
这家伙很懒,什么也没写!
求助,为啥我电机模型一直失败啊
sogw
2019-10-09
这家伙很懒,什么也没写!
依最新的rt-robot更新“组装”过程 ```c #include
#include
#include
#include
#include
#include
#include
#define DBG_SECTION_NAME "car" #define DBG_LEVEL DBG_LOG #include
// MOTOR #define LEFT_FORWARD_PWM "pwm4" #define LEFT_FORWARD_PWM_CHANNEL 3 #define LEFT_BACKWARD_PWM "pwm4" #define LEFT_BACKWARD_PWM_CHANNEL 4 #define RIGHT_FORWARD_PWM "pwm2" #define RIGHT_FORWARD_PWM_CHANNEL 3 #define RIGHT_BACKWARD_PWM "pwm2" #define RIGHT_BACKWARD_PWM_CHANNEL 4 // ENCODER #define LEFT_ENCODER_A_PHASE_PIN 31 // GET_PIN(B, 15) #define LEFT_ENCODER_B_PHASE_PIN 34 // GET_PIN(C, 2) #define RIGHT_ENCODER_A_PHASE_PIN 38 // GET_PIN(C, 6) #define RIGHT_ENCODER_B_PHASE_PIN 39 // GET_PIN(C, 7) #define PULSE_PER_REVOL 2000 // Real value 2000 #define ENCODER_SAMPLE_TIME 50 // PID CONTROLLER #define PID_SAMPLE_TIME 50 #define PID_PARAM_KP 6.6 #define PID_PARAM_KI 6.5 #define PID_PARAM_KD 7.6 // WHEEL #define WHEEL_RADIUS 0.066 #define GEAR_RATIO 1 // CAR chassis_t chas; #define WHEEL_DIST_X 0 #define WHEEL_DIST_Y 0.13 // PS2 #define PS2_CS_PIN 28 #define PS2_CLK_PIN 29 #define PS2_DO_PIN 4 #define PS2_DI_PIN 36 // Car Thread #define THREAD_PRIORITY 10 #define THREAD_STACK_SIZE 512 #define THREAD_TIMESLICE 5 static rt_thread_t tid_car = RT_NULL; void car_thread(void *param) { // TODO struct velocity target_velocity; target_velocity.linear_x = 0.00f; target_velocity.linear_y = 0; target_velocity.angular_z = 0; chassis_set_velocity(chas, target_velocity); // Open-loop control // controller_disable(chas->c_wheels[0]->w_controller); // controller_disable(chas->c_wheels[1]->w_controller); while (1) { rt_thread_mdelay(ENCODER_SAMPLE_TIME); chassis_update(chas); } // chassis_destroy(chas); } void car_init(void *parameter) { // 1. Initialize two wheels - left and right wheel_t* c_wheels = (wheel_t*) rt_malloc(sizeof(wheel_t) * 2); if (c_wheels == RT_NULL) { LOG_D("Failed to malloc memory for wheels"); } // 1.1 Create two motors dual_pwm_motor_t left_motor = dual_pwm_motor_create(LEFT_FORWARD_PWM, LEFT_FORWARD_PWM_CHANNEL, LEFT_BACKWARD_PWM, LEFT_BACKWARD_PWM_CHANNEL); dual_pwm_motor_t right_motor = dual_pwm_motor_create(RIGHT_FORWARD_PWM, RIGHT_FORWARD_PWM_CHANNEL, RIGHT_BACKWARD_PWM, RIGHT_BACKWARD_PWM_CHANNEL); // 1.2 Create two encoders ab_phase_encoder_t left_encoder = ab_phase_encoder_create(LEFT_ENCODER_A_PHASE_PIN, LEFT_ENCODER_B_PHASE_PIN, PULSE_PER_REVOL, ENCODER_SAMPLE_TIME); ab_phase_encoder_t right_encoder = ab_phase_encoder_create(RIGHT_ENCODER_A_PHASE_PIN, RIGHT_ENCODER_B_PHASE_PIN, PULSE_PER_REVOL, ENCODER_SAMPLE_TIME); // 1.3 Create two pid contollers inc_pid_controller_t left_pid = inc_pid_controller_create(PID_PARAM_KP, PID_PARAM_KI, PID_PARAM_KD, PID_SAMPLE_TIME); inc_pid_controller_t right_pid = inc_pid_controller_create(PID_PARAM_KP, PID_PARAM_KI, PID_PARAM_KD, PID_SAMPLE_TIME); // 1.4 Add two wheels c_wheels[0] = wheel_create((motor_t)left_motor, (encoder_t)left_encoder, (controller_t)left_pid, WHEEL_RADIUS, GEAR_RATIO); c_wheels[1] = wheel_create((motor_t)right_motor, (encoder_t)right_encoder, (controller_t)right_pid, WHEEL_RADIUS, GEAR_RATIO); // 2. Iinialize Kinematics - Two Wheel Differential Drive kinematics_t c_kinematics = kinematics_create(TWO_WD, WHEEL_DIST_X, WHEEL_DIST_Y, WHEEL_RADIUS); // 3. Initialize Chassis chas = chassis_create(c_wheels, c_kinematics); // 4. Enable Chassis chassis_enable(chas); // Remote-control command_init(chas); ps2_init(PS2_CS_PIN, PS2_CLK_PIN, PS2_DO_PIN, PS2_DI_PIN); // thread tid_car = rt_thread_create("tcar", car_thread, RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); if (tid_car != RT_NULL) { rt_thread_startup(tid_car); } } ```
Carry
2019-10-09
这家伙很懒,什么也没写!
学习了!
Carry
2019-10-24
这家伙很懒,什么也没写!
>依最新的rt-robot更新“组装”过程 请问这kinematics_get_velocity函数是不是预留的?demo上没用到过
撰写答案
登录
注册新账号
关注者
0
被浏览
2.6k
关于作者
sogw
这家伙很懒,什么也没写!
提问
17
回答
33
被采纳
0
关注TA
发私信
相关问题
1
RTT软件包做的平衡小车,请教各位大神看看
2
三轮差速智能小车 开发记录
3
[一起DIY智能战车]硬件选择
4
rt-thread智能小车软件环境搭建
5
还在为做平衡小车而烦恼吗? EV来了
6
还在为做平衡小车而烦恼吗? EV 来了
7
狂暴战车 直流电机转速闭环,pid调试过程
8
狂暴战车 开发环境搭建
9
汇总:狂暴战车 开发记录
10
智能战车遥控方案概览
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
7
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部