webots笔记 第二天

webots 笔记 第二天

1. Actuator(执行机构)的使用

  • 执行机构也跟传感器差不多,用的标签也是 Wb_Device_Tag,调用函数也是 wb_robot_get_device() ,但是不需要调用开启函数 wb_*_enable()
  • 为了进行运动控制,动作分解成若干个步骤进行控制。

wb_motor_set_position()给电机相应的位置请求。

#include <webots/robot.h>
#include <webots/motor.h>
#include <math.h>

#define TIME_STEP 32

int main() {
wb_robot_init();

WbDeviceTag motor = wb_robot_get_device("my_motor");

double F = 2.0; // frequency 2 Hz
double t = 0.0; // elapsed simulation time

while (1) {
double pos = sin(t * 2.0 * M_PI * F);
wb_motor_set_position(motor, pos);
wb_robot_step(TIME_STEP);
t += (double)TIME_STEP / 1000.0;
}

return 0;
}
  • webots/motor.h里有电机的速度,加速度,力和各种参数的定义。
  • wb_motor_set_position() 只指定期望目标值,跟实际机器人相似,电机的转角也达不到预期值,因为电机的转矩不够反抗重力。如果想要同时控制多个电机的转角的话,需要针对每个电机的转角设定期望值。

2. wb_robot_step()的使用

Webots有两个不同时候的用法,就是控制延时和模拟延时。

  • 控制延时(wb_robot_step()的使用)
  • 模拟延时(在场景树里的定义:WorldInfo.basicTimeStep

每个控制器都需要调用wb_robot_step(), 要不然传感器和执行机构都不更新数据并卡住(仅在同步模式里)

3. 一起使用传感器和执行机构

Webots和每个机器人控制器都运行在个别的过程里。比如,仿真中包括连个机器人,总共有三个过程:一个是Webots的,其他两个是机器人的。每个控制器过程在调用wb_robot_step()时交换传感器和执行机构数据。比如,wb_motor_set_position也不能即时发送数据给Webots。

请看下面的代码:

while(1){
    double d1 = wb_distance_sensor_get_value(ds1);
    double d2 = wb_distance_sensor_get_value(ds2);
    if(d2<d1)                //WRONG: d2 will always equal to d1 here
        avoidCollision();
    wb_robot_step(40);
}

因为两个传感器数据读取函数中间没有wb_robot_step()函数,所以两个值不能同时被变的。

这是正确的代码:

while(1){
    double d1 = wb_distance_sensor_get_value(ds1);
    wb_robot_step();
    double d2 = wb_distance_sensor_get_value(ds2);
    if (d2<d1)
        avoidCollision();
    wb_robot_step();
}

但是一般推荐在主控制循环里只包含一个|wb_robot_step()函数来同时更新所有传感器和执行机构数据。如下:

while(1){
    readSensors();
    actuateMotors();
    wb_robot_step(TIME_STEP);
}

这里可以把wb_robot_step()函数放在循环的开头处。这样可以让传感器已经有有效的数据在读取传感器数据之前。否则,传感器可能未定义的情况下进行第一次迭代。

while(1){
    wb_robot_step(TIME_STEP);
    readSensors();
    actuateMotors();
}

实例:

#include <webots/robot.h>
#include <webots/differential_wheels.h>
#include <webots/distance_sensor.h>

#define TIME_STEP 32

int main() {
wb_robot_init();

WbDeviceTag left_sensor = wb_robot_get_device("left_sensor");
WbDeviceTag right_sensor = wb_robot_get_device("right_sensor");
wb_distance_sensor_enable(left_sensor, TIME_STEP);
wb_distance_sensor_enable(right_sensor, TIME_STEP);

while (1) {
	wb_robot_step(TIME_STEP);
    
    // read sensors
	double left_dist = wb_distance_sensor_get_value(left_sensor);
	double right_dist = wb_distance_sensor_get_value(right_sensor);
	
    // compute behavior
    double left = compute_left_speed(left_dist, right_dist);
    double right = compute_right_speed(left_dist, right_dist);
    
    // actuate wheel motors
    wb_differential_wheels_set_speed(left, right);
}
    
return 0;
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在人工智能研究中,状态空间法是一种基于解空间的问题表示和求解方法。该方法通过在可能的解空间内寻找一个解来求解问题。状态空间法以状态和算符为基础来表示和求解问题。在传统人工智能问题中,复杂的求解技术都离不开表示与搜索这两个方面的内容,其中状态空间表示是其中的一个重要概念。状态空间法采用试探搜索方法,在某个可能的解空间内寻找一个解来求解问题。图解人工智能第二章学习笔记中可能会涉及到状态空间法的概念和问题状态描述。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [人工智能及其应用——第二章学习笔记(上)](https://blog.csdn.net/JallinRicher/article/details/122752897)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [《人工智能及其应用》课程笔记(二)第2章 知识表示方法](https://blog.csdn.net/qq_46485137/article/details/122101559)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值