在Webots中访问交通灯状态

时间:2017-07-29 02:59:03

标签: c++ webots

我需要访问 Webots 中的交通信号灯的当前状态

检查通用红绿灯的“generic_traffic_light.c”控制器,我们有:

WbDeviceTag red_light;
red_light = wb_robot_get_device("ref light");
...
wb_led_set(red_light, 1);

假设我使用了几个通用红绿灯,是否可以访问每个红绿灯状态?

我可以通过以下方式获取我的通用红绿灯的节点:

Node *traffic_node = supervisor->getFromDef("traffic_light_1");

Node没有任何Device方法或任何与LED相关的Field

非常感谢你的帮助

1 个答案:

答案 0 :(得分:0)

能够从主管获得红绿灯状态的一种解决方案是在“数据”中设置状态。来自控制器的机器人领域。

然后你就可以从主管那里读到它。这是例如' generic_traffic_light.c'的修改版本。 (我刚刚添加了一些电话给' wb_robot_set_data'):

<form name="fos_user_registration_form" method="post" action="/app_dev.php/register/" id="register-form" class="mt-20 fos_user_registration_register">

                    <div class="error"></div>

                    <div class="form-group has-icon">
                        <input id="fos_user_registration_form_email" name="fos_user_registration_form[email]" required="required" placeholder="Adresse e-mail" class=" form-control" type="email">

                        <span class="fa fa-envelope-o form-control-icon" aria-hidden="true"></span>
                    </div>
                    <div class="form-group has-icon">
                        <input id="fos_user_registration_form_nom" name="fos_user_registration_form[nom]" required="required" placeholder="Nom" class=" form-control" type="text">

                        <span class="fa fa-user form-control-icon" aria-hidden="true"></span>
                    </div>

                    <div class="form-group has-icon">
                        <input id="fos_user_registration_form_prenom" name="fos_user_registration_form[prenom]" required="required" placeholder="Prénom" class=" form-control" type="text">

                        <span class="fa fa-user form-control-icon" aria-hidden="true"></span>
                    </div>
                    <div class="form-group has-icon">
                                <select id="fos_user_registration_form_gender" name="fos_user_registration_form[gender]" class="form-control form-control"><option value="0" selected="selected">Sélectionnez</option><option value="1">M</option><option value="2">F</option></select>


                        <span class="fa fa-venus-mars form-control-icon" aria-hidden="true"></span>
                    </div>
                    <div class="col-sm-12">
                        <div class="form-group has-icon col-sm-4">
                                    <select id="fos_user_registration_form_birthday_day" name="fos_user_registration_form[birthday][day]" required="required" class="form-control form-control"><option value="" selected="selected">Jour</option><option value="1">1</option><option value="2">2</option><option value="3">3</option><option value="4">4</option><option value="5">5</option><option value="6">6</option><option value="7">7</option><option value="8">8</option><option value="9">9</option><option value="10">10</option><option value="11">11</option><option value="12">12</option><option value="13">13</option><option value="14">14</option><option value="15">15</option><option value="16">16</option><option value="17">17</option><option value="18">18</option><option value="19">19</option><option value="20">20</option><option value="21">21</option><option value="22">22</option><option value="23">23</option><option value="24">24</option><option value="25">25</option><option value="26">26</option><option value="27">27</option><option value="28">28</option><option value="29">29</option><option value="30">30</option><option value="31">31</option></select>


                            <span class="fa fa-calendar form-control-icon" aria-hidden="true"></span>
                        </div>

                        <div class="form-group has-icon col-sm-4">
                                    <select id="fos_user_registration_form_birthday_month" name="fos_user_registration_form[birthday][month]" required="required" class="form-control form-control"><option value="" selected="selected">Mois</option><option value="1">Jan</option><option value="2">Feb</option><option value="3">Mar</option><option value="4">Apr</option><option value="5">May</option><option value="6">Jun</option><option value="7">Jul</option><option value="8">Aug</option><option value="9">Sep</option><option value="10">Oct</option><option value="11">Nov</option><option value="12">Dec</option></select>


                            <span class="fa fa-calendar form-control-icon" aria-hidden="true"></span>
                        </div>
                        <div class="form-group has-icon col-sm-4">
                                    <select id="fos_user_registration_form_birthday_year" name="fos_user_registration_form[birthday][year]" required="required" class="form-control form-control"><option value="" selected="selected">Année</option><option value="1897">1897</option><option value="1898">1898</option><option value="1899">1899</option><option value="1900">1900</option><option value="1901">1901</option><option value="1902">1902</option><option value="1903">1903</option><option value="1904">1904</option><option value="1905">1905</option><option value="1906">1906</option><option value="1907">1907</option><option value="1908">1908</option><option value="1909">1909</option><option value="1910">1910</option><option value="1911">1911</option><option value="1912">1912</option><option value="1913">1913</option><option value="1914">1914</option><option value="1915">1915</option><option value="1916">1916</option><option value="1917">1917</option><option value="1918">1918</option><option value="1919">1919</option><option value="1920">1920</option><option value="1921">1921</option><option value="1922">1922</option><option value="1923">1923</option><option value="1924">1924</option><option value="1925">1925</option><option value="1926">1926</option><option value="1927">1927</option><option value="1928">1928</option><option value="1929">1929</option><option value="1930">1930</option><option value="1931">1931</option><option value="1932">1932</option><option value="1933">1933</option><option value="1934">1934</option><option value="1935">1935</option><option value="1936">1936</option><option value="1937">1937</option><option value="1938">1938</option><option value="1939">1939</option><option value="1940">1940</option><option value="1941">1941</option><option value="1942">1942</option><option value="1943">1943</option><option value="1944">1944</option><option value="1945">1945</option><option value="1946">1946</option><option value="1947">1947</option><option value="1948">1948</option><option value="1949">1949</option><option value="1950">1950</option><option value="1951">1951</option><option value="1952">1952</option><option value="1953">1953</option><option value="1954">1954</option><option value="1955">1955</option><option value="1956">1956</option><option value="1957">1957</option><option value="1958">1958</option><option value="1959">1959</option><option value="1960">1960</option><option value="1961">1961</option><option value="1962">1962</option><option value="1963">1963</option><option value="1964">1964</option><option value="1965">1965</option><option value="1966">1966</option><option value="1967">1967</option><option value="1968">1968</option><option value="1969">1969</option><option value="1970">1970</option><option value="1971">1971</option><option value="1972">1972</option><option value="1973">1973</option><option value="1974">1974</option><option value="1975">1975</option><option value="1976">1976</option><option value="1977">1977</option><option value="1978">1978</option><option value="1979">1979</option><option value="1980">1980</option><option value="1981">1981</option><option value="1982">1982</option><option value="1983">1983</option><option value="1984">1984</option><option value="1985">1985</option><option value="1986">1986</option><option value="1987">1987</option><option value="1988">1988</option><option value="1989">1989</option><option value="1990">1990</option><option value="1991">1991</option><option value="1992">1992</option><option value="1993">1993</option><option value="1994">1994</option><option value="1995">1995</option><option value="1996">1996</option><option value="1997">1997</option><option value="1998">1998</option><option value="1999">1999</option><option value="2000">2000</option><option value="2001">2001</option><option value="2002">2002</option><option value="2003">2003</option><option value="2004">2004</option><option value="2005">2005</option><option value="2006">2006</option><option value="2007">2007</option><option value="2008">2008</option><option value="2009">2009</option><option value="2010">2010</option><option value="2011">2011</option><option value="2012">2012</option><option value="2013">2013</option><option value="2014">2014</option><option value="2015">2015</option><option value="2016">2016</option><option value="2017">2017</option></select>


                            <span class="fa fa-calendar form-control-icon" aria-hidden="true"></span>
                        </div>
                    </div>
                    <div class="form-group has-icon">
                        <input id="fos_user_registration_form_plainPassword_first" name="fos_user_registration_form[plainPassword][first]" required="required" placeholder="Mot de passe" class=" form-control" type="password">

                        <span class="fa fa-lock form-control-icon" aria-hidden="true"></span>
                    </div>

                    <div class="form-group has-icon">
                        <input id="fos_user_registration_form_plainPassword_second" name="fos_user_registration_form[plainPassword][second]" required="required" placeholder="Vérification" class=" form-control" type="password">

                        <span class="fa fa-lock form-control-icon" aria-hidden="true"></span>
                    </div>

                    <div class="form-group has-icon">
                                <select id="fos_user_registration_form_country" name="fos_user_registration_form[country]" class="form-control form-control"><option value="France">France</option></select>


                        <span class="fa fa-globe form-control-icon" aria-hidden="true"></span>
                    </div>

                    <input class="btn btn-md btn-block btn-base-1 mt-20" id="register-submit" value="Créer un compte" type="submit">
                    <small>En cliquant sur inscription vous acceptez les
                        <a href="">conditions générales</a> de
                        Fitjiva.com.
                    </small>
                    <input id="fos_user_registration_form_mailHidden" name="fos_user_registration_form[mailHidden]" class=" form-control" type="hidden"><input id="fos_user_registration_form__token" name="fos_user_registration_form[_token]" class=" form-control" value="lRL1odxIZVJoJf_Jj3oyjWFW_KHyR8oUrRNzRKRrvGk" type="hidden">
</form>

然后你需要改变&#39; GenericTrafficLight&#39; PROTO为了呈现数据&#39;字段可见,这是一个修改版本:

#include <webots/robot.h>
#include <webots/led.h>

#include <stdio.h>
#include <string.h>

#define TIME_STEP 512
enum {GREEN_STATE, RED_STATE, ORANGE_STATE_TO_RED, ORANGE_STATE_TO_GREEN};

int main(int argc, char **argv) {
  wb_robot_init();
  double red_time = 20.0;
  double green_time = 20.0;
  double orange_time = 1.5;
  int current_state = GREEN_STATE;

  if (argc > 1) {
    sscanf(argv[1],"%lf",&red_time);
    if (argc > 2) {
      sscanf(argv[2],"%lf",&green_time);
      if (argc > 3) {
        if (strcmp(argv[3], "r") == 0)
          current_state = RED_STATE;
        else if (strcmp(argv[3], "g") == 0)
          current_state = GREEN_STATE;
        else if (strcmp(argv[3], "og") == 0)
          current_state = ORANGE_STATE_TO_GREEN;
        else if (strcmp(argv[3], "or") == 0)
          current_state = ORANGE_STATE_TO_RED;
      }
    }
    else
      green_time = red_time;
  }

  WbDeviceTag red_light, orange_light, green_light;
  red_light = wb_robot_get_device("red light");
  orange_light = wb_robot_get_device("orange light");
  green_light = wb_robot_get_device("green light");
  double last_phase_change_time = 0.0;

  if (current_state == GREEN_STATE) {
    wb_led_set(green_light, 1);
    wb_robot_set_data("green");
  } else if (current_state == RED_STATE) {
    wb_led_set(red_light, 1);
    wb_robot_set_data("red");
  } else {
    wb_led_set(orange_light, 1);
    wb_robot_set_data("orange");
  }

  while (wb_robot_step(TIME_STEP) != -1) {
    double current_time =  wb_robot_get_time();

    if (current_state == GREEN_STATE) {
      if ((current_time - last_phase_change_time) >=  green_time) {
        current_state = ORANGE_STATE_TO_RED;
        last_phase_change_time = current_time;
        wb_led_set(green_light, 0);
        wb_led_set(orange_light, 1);
        wb_robot_set_data("orange");
      }
    } else if (current_state == RED_STATE) {
      if ((current_time - last_phase_change_time) >=  red_time) {
        current_state = ORANGE_STATE_TO_GREEN;
        last_phase_change_time = current_time;
        wb_led_set(red_light, 0);
        wb_led_set(orange_light, 1);
        wb_robot_set_data("orange");
      }
    } else if (current_state == ORANGE_STATE_TO_RED) {
      if ((current_time - last_phase_change_time) >=  orange_time) {
        current_state = RED_STATE;
        last_phase_change_time = current_time;
        wb_led_set(orange_light, 0);
        wb_led_set(red_light, 1);
        wb_robot_set_data("red");
      }
    } else { //current_state == ORANGE_STATE_TO_GREEN
      if ((current_time - last_phase_change_time) >=  orange_time) {
        current_state = GREEN_STATE;
        last_phase_change_time = current_time;
        wb_led_set(orange_light, 0);
        wb_led_set(green_light, 1);
        wb_robot_set_data("green");
      }
    }
  };

  wb_robot_cleanup();

  return 0;
}

此致

大卫