1. wb_supervisor_node_get_field(WbNodeRef, "translation"):
查找WbFieldRef在指定的节点中。“”字段表示机器人在全球(世界)坐标系中的位置。
2. wb_supervisor_node_get_from_def():
调用在场景树中搜索名为“MY_ROBOT”的对象
1 WbNodeRef robot_node = wb_supervisor_node_get_from_def("MY_ROBOT");
2 WbFieldRef trans_field = wb_supervisor_node_get_field(robot_node, "translation");
3. wb_supervisor_field_get_sf_vec3f():
用于读取指定字段的最新值。请注意,与传感器或执行器功能不同,wb_supervisor_field _ *()函数会立即执行:它们的执行不会推迟到下一个wb_robot_step()调用。
1 const double *trans = wb_supervisor_field_get_sf_vec3f(trans_field);
4. resetRobot():
move robot to initial position
5.评估的参数集
不同控制器将在单独的系统进程中运行,它们无法访问彼此的变量。虽然,他们将不得不通过其他方式进行沟通,以便指定需要评估的参数集。有可能并推荐使用Webots Emitter和Receiver来在Supervisor和其他控制器之间交换信息。例如,在典型的情况下,主管将向机器人控制器发送评估参数(例如,基因型)。机器人控制器收听他们的接收器s,等待一组新的参数。一旦收到,机器人控制器开始执行由该组参数指定的行为。在这种情况下,主管需要一个发射器,每个机器人都需要一个接收器。
6.重置机器人的方法
使用优化算法时,您可能需要在每次适应评估之前或之后重置机器人。有几种重置机器人的方法:
使用wb_supervisor_field_set _ *()和wb_supervisor_simulation_physics_reset()函数
您可以使用wb_supervisor_field_set ...()和 wb_supervisor_simulation_physics_reset()函数轻松重置机器人的位置,方向和物理特性,下面是一个示例:
1 // get handles to the robot's translation and rotation fields
2 WbNodeRef robot_node = wb_supervisor_node_get_from_def("MY_ROBOT");
3 WbFieldRef trans_field = wb_supervisor_node_get_field(robot_node, "translation");
4 WbFieldRef rot_field = wb_supervisor_node_get_field(robot_node, "rotation");
5
6 // reset the robot
7 const double INITIAL_TRANS[3] = { 0, 0.5, 0 };
8 const double INITIAL_ROT[4] = { 0, 1, 0, 1.5708 };
9 wb_supervisor_field_set_sf_vec3f(trans_field, INITIAL_TRANS);
10 wb_supervisor_field_set_sf_rotation(rot_field, INITIAL_ROT);
11 wb_supervisor_simulation_physics_reset();
上述方法的缺点是它只能重置机器人的主要位置和方向。对于某些类型的优化,这可能很好,但对于其他类型则不够。尽管可以向要重置的一组数据添加更多参数,但有时很难重置所有内容。伺服位置和机器人控制器都不是以这种方式重置。的伺服 位置应被重置使用 wb_servo_set_position()和机器人控制器应当通过从管理进程将消息发送到机器人控制器过程(使用Webots重置 发射器 / 接收器通讯系统)。机器人控制器程序应该能够处理这样的消息并相应地重置其状态。
7. wb_supervisor_simulation_revert():
该功能从头开始重新启动物理模拟和所有控制器。用这种方法,所有的东西都会重置,包括物理位置,伺服位置和控制器。但是这个函数也会重新启动调用wb_supervisor_simulation_revert()的控制器,这通常是运行优化算法的控制器,因此优化状态会丢失。因此,为了使用这种技术,有必要开发可以保存和恢复优化算法的完整状态的函数。在调用wb_supervisor_simulation_revert()之前应保存优化状态,并在Supervisor时重新加载控制器重新启动。
8. wbu_motion_new,wbu_motion_delete :
获取并释放一个动作文件句柄
1 #include
2
3 WbMotionRef wbu_motion_new(const char *filename);
4
5 void wbu_motion_delete(WbMotionRef motion);
在filename可以以绝对路径或相对于控制器目录的路径来指定。
9. wbu_motion_play,wbu_motion_stop,wbu_motion_set_loop,wbu_motion_set_reverse :
控制运动文件回放
1 #include
2 void wbu_motion_play(WbMotionRef motion);
3 void wbu_motion_stop(WbMotionRefmotion);
4 void wbu_motion_set_loop(WbMotionRef motion, bool loop);
5 void wbu_motion_set_reverse(WbMotionRefmotion, bool reverse);
请注意,wb_robot_step()
运动文件中的功能步骤和姿势间隔可能不同。在这种情况下,Webot通过线性插值计算中间关节位置。
wbu_motion_stop()
中断指定的运动的再现但保留当前位置。中断后,播放可以继续wbu_motion_play()
。
该wbu_motion_set_loop()
套环模式的指定的运动的。如果 循环模式为true
,则当文件到达文件的结束或开始(反向模式)时,动作重复。的循环模式都可以使用,例如,让一个机器人重复一系列步骤在行走序列。请注意,循环模式可以在动作播放时更改。
wbu_motion_set_reverse()
设定倒档模式指定的运动。如果反转模式是true
,则动作文件向后播放。例如,通过使用反向模式,可以将步行运动转变为向后步行运动。该反向模式是可以改变的,而运动是打,在这种情况下,动作会从当前位置回。
默认情况下,运动的循环模式和反向模式是false
10. wbu_motion_is_over,wbu_motion_get_duration,wbu_motion_get_time,wbu_motion_set_time :
控制播放位置
1 #include
2 bool wbu motion_is_over(WbMotionRef motion);
3 int wbu_motion_get_duration(WbMotionRefmotion);
4 int wbu_motion_get_time(WbMotionRef motion, bool loop);
5 void wbu_motion_set_time(WbMotionRefmotion, int t);
当播放位置到达动作文件的结尾时,该wbu_motion_is_over()
功能返回true
。那就是当最后的姿势已经使用该功能发送到电机节点时wb_motor_set_position()
。但这并不意味着电机尚未达到规定的位置; 它们可能很慢或被障碍物,机器人,墙壁,地板等阻挡。如果运动处于循环模式,则此功能始终返回false
。请注意, wbu_motion_is_over()
取决于反转模式。wbu_motion_is_over()
返回true
时反向模式是true
和重放位置是在文件的开头或当反向模式是false
和重放位置是在文件的结尾。
该wbu_motion_get_duration()
函数以毫秒为单位返回运动文件的总持续时间。
该wbu_motion_get_time()
函数以毫秒为单位返回当前播放位置。
该wbu_motion_set_time()
功能可以及时更改播放位置。这允许用户向前或向后跳过。请注意,无论正在播放还是停止,时间位置都可以更改。最小值是0(运动开始),最大值是函数返回的值 wbu_motion_get_duration()
(运动结束)。时间位置以毫秒表示
11. wb_robot_step():
可同步Webots和控制器之间的传感器和执行器数据。如果该wb_robot_step()功能未被调用,则Webots中将不会启动,并且控制器中的传感器也不会更新。
1 int wb_robot_step(int duration)
该duration参数指定以毫秒为单位的时间量,在wb_robot_step()函数返回之前必须模拟该时间量。请注意,这不是实时的,而是虚拟的(模拟)时间,所以这不像调用系统的时间 sleep()。根据模拟和执行模式的复杂程度,该功能可能会很快返回。当它返回时,模拟时间的请求持续时间已过。换句话说,物理运行指定的持续时间:对象可能会移动,电机可能运行,传感器值可能会发生变化等。请注意,duration 参数必须是其倍数WorldInfo.basicTimeStep。
如果此函数返回-1,则表示Webots希望终止控制器。当用户点击Revert按钮或退出Webots 时会发生这种情况。所以如果你的代码需要做一些清理工作,例如刷新或关闭数据文件等,就必须测试这个返回值并采取适当的行动。控制器终止不能被否决:一秒钟后,控制器被Webots终止。所以只有一秒可用于清理。
12. wb_robot_get_device :
获取设备的唯一标识符
13. wb_robot_get_device_by_index :
通过自省获取设备
14. wb_robot_battery_sensor_enable,wb_robot_battery_sensor_disable,wb_robot_get_battery sampling_period,wb_robot_battery_sensor_get_value :
电池传感器功能
这些功能可以让您测量机器人电池当前的能量水平。首先,需要通过调用该wb_robot_battery_sensor_enable()功能来启用电池传感器测量。该sampling_period参数以毫秒表示,并定义了执行测量的频率。电池传感器启用后,通过调用该wb_robot_battery_sensor_get_value()函数可以从中读取一个值 。返回值对应于以焦耳(J)表示的当前电池能量水平。
该wb_robot_battery_sensor_disable()功能应该用于停止电池传感器测量。
该wb_robot_get_battery_sampling_period()函数返回函数给定的时间段wb_robot_battery_sensor_enable(),如果设备被禁用,则返回0。
15. wb_robot_get_basic_time_step:
返回WorldInfo节点的basicTimeStep字段的值
16. wb_robot_get_mode :
获取操作模式,模拟与真实机器人
17. wb_robot_get_name :
返回机器人节点中定义的名称