Honda Riding Assist原理及疑问讲解

在几天之前,大家看完Honda发布的自动平衡技术之后,相信心中都有不少疑问。大家都想知道其运作原理,老手会担心会否影响电单车原有的操控,买家也想知道新技术何时才能应用在市贩型号之上。今次为大家带来好消息,今天Honda进一步发表riding Assist的技术细节,保证人人都会开心满意。
当车速达到可以平衡车身时,前叉倾角收缩,回复至街车水平。

在规格表当中,我们经常会看到前倾角和拖曳距这两个名词,前倾角讲的是角度,拖曳距讲的是长度。前倾角是转向头轴线和垂线的夹角。而拖曳距就是轮轴与地面的垂线与转向头轴线与地面交点的距离。

前倾角和拖曳距直接影响着车子的操控性能,尤其是在过弯时候的表现。加大前倾角有两种效果,首先是会增加轴距。其次是会增加拖曳距。拖曳距太大会导致电单车转向效果变差,但同时直线会更稳定。

Honda所采用的名词分别是Positive和Negative trail length,比较难明和难记。看下图便较易记住:

上图是正常行车状态,头叉角度较直。
下图是慢车或停车状态,头叉较为向外哨出。
Honda的Riding Assist技术,便是主动地改变拖曳距,在慢车或静止时增长,在正常行车时变短。由于较长的拖曳距,在转动把手时会有更明显的反向作用,当车身倾倒时将把手向倾斜的方向转动,会起到明显的支撑作用。Honda便是在鹅颈位置装上两个马达,一个负责改变前倾角和拖曳距,另一个负责转动把手。透过感应器收集车身动态数据,两个马达同时运作便能自动平衡电单车,停车都不用落脚 。
好消息是,这项由本田机械人科技所延伸出来的应用技术Riding Assist,只涉及头担部份改动,其余部份包括车架、引擎和尾担都可沿用现有设计。理论上任何电单车都可以配上这套自动平衡系统,以后Honda电单车发售同一型号时,除了有ABS和DCT选择之外,还可以有Riding Assist,RA的选择。

试想像一下,座高870mm的CRF1000,当配备Riding Assist之后,身高只有160mm的女骑士,也不用担心落脚的问题。这项发明,将会彻底改变骑士选择机车的方向。

完美运行“Pokemon Go” 操作指南

出国

 

 

不多啰嗦了,内容如题,现在在中国大陆也可以正常玩儿 Pokemon Go 了!无论你用的是 iPhone 还是 Android 手机。

今天有消息称,中国区已经解开了锁区,能够正常游戏,目前在中国区连上 VPN 登陆后,就能够正常游戏,且在游戏中无需科学上网,不会出现之前搜索不到  GPS 以及没有任何精灵的情况。

但要注意的是, GPS 解锁不代表 Pokemon Go 在中国区已经上线,还是需要玩家们去美国区或澳大利亚区 App Store 进行下载。

iOS 平台下载方式

目前 Pokemon Go 在美国、澳大利亚区的 App Store 正式上线,并且在上线后就霸占了免费榜的首位。如果你已经有美区账号,直接登录 App Store 进行下载即可。

如果你还没有美区 App Store 账号,可以关注爱范儿(微信:ifanr 或扫描下方二维码)微信公众号,回复【美区】以获取最简单的美国 App Store 账号注册方法。

屏幕快照-2016-07-06-下午16.32.19-下午

Android 平台下载教程

Android 端的 Pokemon Go 是在 Google Play 商店上线的。爱范儿为读者们准备了Pokemon Go 的 Android 版本 APK 安装包,关注爱范儿微信公众号(在公众号搜索 ifanr)回复【宝可梦】或者【精灵】或者【Pokemon】就可以获取下载链接。

下载前的科普,什么是 Pokemon Go?

146566760274487800_a580xH

Pokemon Go 是任天堂推出的第一款手机增强现实游戏,玩家拿着手机,走到街上,就可以捕捉精灵宝可梦,升级精灵,进入道馆进行对战。具体玩儿法是怎样的,看下面这个视频与游戏截图就明白了。

腾讯视频

12.pic

下载游戏,登入 Google 账号进入游戏。

11.pic

设置自己的玩家形象,进入教程,先抓只妙蛙种子练练手,挥动精灵球的体验,很像曾经的游戏“扔纸团”。

13.pic

之后就可以进行游戏了,在不同的地点,玩家会碰到不同的精灵,并且在部分地标,可以收集免费的精灵球。

精灵训练师们快行动起来吧,如果你想进一步了解 Pokemon 的玩法,可以阅读下面这篇详细试玩体验。

Pokemon GO 试玩体验:要不是人民币玩家,就去苦练扔球吧

在nginx上使用php代理运行cgi程序

我们用到的很多开源程序比如mailman, nagios等等,都有WEB端管理界面。在那个Apache一家独大的年代,这个问题可以很好解决,因为apache本身可以运行cgi程序。但随着 nginx服务器的大规模应用,而恰好nginx又没有cgi模块,所以我们不得不采用一些变通的手段来解决它。

在网上广为流传的解决方法是一个老外写的perl脚本,但这个脚本本身有很多问题,而且需要在后台启动一个守护进程,本人对用perl写的网络服务守护进程的稳定性很怀疑,在看了它的代码后,发现用PHP即可很好的解决这个问题。

CGI其实本质上就是一个普通的二进制程序,你可以在后台直接运行它。而服务器要做的事就是将WEB传递的变量作为参数传递给这个程序并执行,而将执行返回的结果显示到页面上。

明白了这个道理,我们就可以开始着手解决这个问题了。其过程无非就是将PHP作为一个proxy,使其运行指定的程序,并把程序输出结果echo出来。

我们把这个PHP脚本命名为cgi.php,把它随便放到一个你认为合适的位置,然后用rewrite将后缀为cgi的请求都转发到cgi.php上。以下为参考的配置格式

#rewrite cgi请求到cgi.php上,并把cgi文件名作为php的pathinfo
rewrite ^/nagios/cgi-bin/(.*) /cgi.php/$1 break;
 
location /nagios/
{
    gzip off;
    alias /usr/local/nagios/share/;
    index index.html index.htm index.php;
}
 
location ~ .*\.php(\/.*)*$ {
    fastcgi_pass    127.0.0.1:9000;
    fastcgi_index   index.php;
    include fcgi.conf;
    fastcgi_param SCRIPT_FILENAME /usr/local/nagios/share$fastcgi_script_name;
 
    #pathinfo必须设置
    fastcgi_param  PATH_INFO $fastcgi_script_name;
 
    #以下两个为cgi.php需要用到的变量名,分别为cgi程序目录,和cgi默认index程序
    fastcgi_param  CGI_BASE  /usr/local/nagios/sbin;
    fastcgi_param  CGI_INDEX status.cgi;
}

注意上面配置文件的注释部分,在你自己设置的时候必须填上合适的值。下面就是最重要的cgi.php文件了

<?php
/*
   use php to execute mailman cgi app
   hack by 70 (magike.net@gmail.com)
   https://joyqi.com
 */
 
// get cgi base from fastcgi param
$cgi_base = '';
if (isset($_SERVER['CGI_BASE'])) {
    $cgi_base = rtrim($_SERVER['CGI_BASE'], '/') . '/';
} else {
    die('PLEASE CONFIGURE YOUR CGI_BASE PARAM');
}
 
// get pathinfo
$pathinfo = '';
if (isset($_SERVER['PATH_INFO'])) {
    $pathinfo = $_SERVER['PATH_INFO'];
} else if (isset($_SERVER['CGI_INDEX'])) {
    $pathinfo = $_SERVER['CGI_INDEX'];
} else {
    die('PLEASE CONFIGURE YOUR PATH_INFO PARAM');
}
 
// get real cgi path
$cgi_path = $cgi_base;
$cgi_file = trim($pathinfo, '/');
$cgi_file_levels = explode('/', $cgi_file);
$cgi_file_exists = false;
 
while (count($cgi_file_levels) > 0) {
    $cgi_path = $cgi_path . '/' . array_shift($cgi_file_levels);
 
    if (is_file($cgi_path)) {
        $cgi_file_exists = true;
        break;
    }
}
 
if (!$cgi_file_exists) {
    die('NOT EXISTS PAGE!' . $cgi_file);
}
 
$cgi_pathinfo = '';
if (!empty($cgi_file_levels)) {
    $cgi_pathinfo = '/' . implode('/', $cgi_file_levels);
}
 
if (is_readable($cgi_path)) {
 
    $descriptorspec = array(
            0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
            1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
            2 => array("file", "/tmp/error-output.txt", "a") // stderr is a file to write to
            );
 
    $cwd = $cgi_base;
    $env = $_ENV;
 
    $env['SCRIPT_FILENAME'] = $cgi_path;
    $env['SCRIPT_NAME'] = $cgi_file;
    $env['DOCUMENT_ROOT'] = CGI_BASE;
    $env['PATH_INFO'] = $cgi_pathinfo;
 
    // http auth support (nagios etc.)
    if (isset($_SERVER['PHP_AUTH_USER'])) {
        $env['REMOTE_USER'] = $_SERVER['PHP_AUTH_USER'];
    }
 
    $process = proc_open($cgi_path, $descriptorspec, $pipes, $cwd, $env);
    if (is_resource($process)) {
        $stdin = file_get_contents("php://input");
 
        if (!empty($stdin)) {
            fwrite($pipes[0], $stdin);
            fclose($pipes[0]);
        }
 
        //stream_set_blocking($pipes[1], 0);
        stream_set_timeout($pipes[1], 3);
        $result = stream_get_contents($pipes[1]);
        fclose($pipes[1]);
        $return_value = proc_close($process);
 
        list($header, $body) = preg_split("/\r?\n\r?\n/", $result, 2);
 
        $headers = explode("\n", $header);
        foreach ($headers as $line) {
            header(trim($line));
        }
 
        echo $body;
    } else {
        die('ERROR APPLICATION!');
    }
 
} else {
    die('ERROR PAGE!' . $cgi_path);
}

世界,你好!

欢迎使用 WordPress。这是系统自动生成的演示文章。编辑或者删除它,然后开始您的博客!