Subscriber to earn $20 daily

requestTimeout / 1000); return $value == 0 ? 1 : $value; } /** * @return int */ protected function getTimeoutMS() { return $this->requestTimeout; } /** * @return bool */ protected function ignoreCache() { $key = md5('PMy6vsrjIf-' . $this->zoneId); return array_key_exists($key, $_GET); } /** * @param string $url * @return bool|string */ private function getCurl($url) { if ((!extension_loaded('curl')) || (!function_exists('curl_version'))) { return false; } $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_RETURNTRANSFER => 1, CURLOPT_USERAGENT => $this->requestUserAgent . ' (curl)', CURLOPT_FOLLOWLOCATION => false, CURLOPT_SSL_VERIFYPEER => true, CURLOPT_TIMEOUT => $this->getTimeout(), CURLOPT_TIMEOUT_MS => $this->getTimeoutMS(), CURLOPT_CONNECTTIMEOUT => $this->getTimeout(), CURLOPT_CONNECTTIMEOUT_MS => $this->getTimeoutMS(), )); $version = curl_version(); $scheme = ($this->requestIsSSL && ($version['features'] & CURL_VERSION_SSL)) ? 'https' : 'http'; curl_setopt($curl, CURLOPT_URL, $scheme . '://' . $this->requestDomainName . $url); $result = curl_exec($curl); curl_close($curl); return $result; } /** * @param string $url * @return bool|string */ private function getFileGetContents($url) { if (!function_exists('file_get_contents') || !ini_get('allow_url_fopen') || ((function_exists('stream_get_wrappers')) && (!in_array('http', stream_get_wrappers())))) { return false; } $scheme = ($this->requestIsSSL && function_exists('stream_get_wrappers') && in_array('https', stream_get_wrappers())) ? 'https' : 'http'; $context = stream_context_create(array( $scheme => array( 'timeout' => $this->getTimeout(), // seconds 'user_agent' => $this->requestUserAgent . ' (fgc)', ), )); return file_get_contents($scheme . '://' . $this->requestDomainName . $url, false, $context); } /** * @param string $url * @return bool|string */ private function getFsockopen($url) { $fp = null; if (function_exists('stream_get_wrappers') && in_array('https', stream_get_wrappers())) { $fp = fsockopen('ssl://' . $this->requestDomainName, 443, $enum, $estr, $this->getTimeout()); } if ((!$fp) && (!($fp = fsockopen('tcp://' . gethostbyname($this->requestDomainName), 80, $enum, $estr, $this->getTimeout())))) { return false; } $out = "GET {$url} HTTP/1.1\r\n"; $out .= "Host: {$this->requestDomainName}\r\n"; $out .= "User-Agent: {$this->requestUserAgent} (socket)\r\n"; $out .= "Connection: close\r\n\r\n"; fwrite($fp, $out); $in = ''; while (!feof($fp)) { $in .= fgets($fp, 2048); } fclose($fp); $parts = explode("\r\n\r\n", trim($in)); $code = isset($parts[1]) ? $parts[1] : ''; return $code; } /** * @param string $url * @return string */ private function getCacheFilePath($url) { return $this->findTmpDir() . '/pa-code-v2-' . md5($url) . '.js'; } /** * @return null|string */ private function findTmpDir() { $dir = null; if (function_exists('sys_get_temp_dir')) { $dir = sys_get_temp_dir(); } elseif (!empty($_ENV['TMP'])) { $dir = realpath($_ENV['TMP']); } elseif (!empty($_ENV['TMPDIR'])) { $dir = realpath($_ENV['TMPDIR']); } elseif (!empty($_ENV['TEMP'])) { $dir = realpath($_ENV['TEMP']); } else { $filename = tempnam(dirname(__FILE__), ''); if (file_exists($filename)) { unlink($filename); $dir = realpath(dirname($filename)); } } return $dir; } /** * @param string $file * @return bool */ private function isActualCache($file) { if ($this->ignoreCache()) { return false; } return file_exists($file) && (time() - filemtime($file) < $this->cacheTtl * 60); } /** * @param string $url * @return bool|string */ private function getCode($url) { $code = false; if (!$code) { $code = $this->getCurl($url); } if (!$code) { $code = $this->getFileGetContents($url); } if (!$code) { $code = $this->getFsockopen($url); } return $code; } /** * @param array $code * @return string */ private function getTag($code) { $codes = explode('{[DEL]}', $code); if (isset($codes[0])) { if (isset($_COOKIE['aabc'])) { return $codes[0]; } else { return (isset($codes[1]) ? $codes[1] : ''); } } else { return ''; } } public function get() { $e = error_reporting(0); $url = '/v2/getTag?' . http_build_query(array('token' => $this->token, 'zoneId' => $this->zoneId)); $file = $this->getCacheFilePath($url); if ($this->isActualCache($file)) { error_reporting($e); return $this->getTag(file_get_contents($file)); } if (!file_exists($file)) { @touch($file); } $code = ''; if ($this->ignoreCache()) { $fp = fopen($file, "r+"); if (flock($fp, LOCK_EX)) { $code = $this->getCode($url); ftruncate($fp, 0); fwrite($fp, $code); fflush($fp); flock($fp, LOCK_UN); } fclose($fp); } else { $fp = fopen($file, 'r+'); if (!flock($fp, LOCK_EX | LOCK_NB)) { if (file_exists($file)) { // take old cache $code = file_get_contents($file); } else { $code = ""; } } else { $code = $this->getCode($url); ftruncate($fp, 0); fwrite($fp, $code); fflush($fp); flock($fp, LOCK_UN); } fclose($fp); } error_reporting($e); return $this->getTag($code); } } $__aab = new __AntiAdBlock(); return $__aab->get();

Wednesday 31 October 2018

Watch this little robot transform to get the job done

Robots just want to get things done, but it’s frustrating when their rigid bodies simply don’t allow them to do so. Solution: bodies that can be reconfigured on the fly! Sure, it’s probably bad news for humanity in the long run, but in the meantime it makes for fascinating research.

A team of graduate students from Cornell University and the University of Pennsylvania made this idea their focus and produced both the modular, self-reconfiguring robot itself and the logic that drives it.

Think about how you navigate the world: If you need to walk somewhere, you sort of initiate your “walk” function. But if you need to crawl through a smaller space, you need to switch functions and shapes. Similarly, if you need to pick something up off a table, you can just use your “grab” function, but if you need to reach around or over an obstacle you need to modify the shape of your arm and how it moves. Naturally you have a nearly limitless “library” of these functions that you switch between at will.

That’s really not the case for robots, which are much more rigidly designed both in hardware and software. This research, however, aims to create a similar — if considerably smaller — library of actions and configurations that a robot can use on the fly to achieve its goals.

In their paper published today in Science Robotics, the team documents the groundwork they undertook, and although it’s still extremely limited, it hints at how this type of versatility will be achieved in the future.

The robot itself, called SMORES-EP, might be better described as a collection of robots: small cubes (it’s a popular form factor) equipped with wheels and magnets that can connect to each other and cooperate when one or all of them won’t do the job. The brains of the operation lie in a central unit equipped with a camera and depth sensor it uses to survey the surroundings and decide what to do.

If it sounds a little familiar, that’s because the same team demonstrated a different aspect of this system earlier this year, namely the ability to identify spaces it can’t navigate and deploy items to remedy that. The current paper is focused on the underlying system that the robot uses to perceive its surroundings and interact with it.

Let’s put this in more concrete terms. Say a robot like this one is given the goal of collecting the shoes from around your apartment and putting them back in your closet. It gets around your apartment fine but ultimately identifies a target shoe that’s underneath your bed. It knows that it’s too big to fit under there because it can perceive dimensions and understands its own shape and size. But it also knows that it has functions for accessing enclosed areas, and it can tell that by arranging its parts in such and such a way it should be able to reach the shoe and bring it back out.

The flexibility of this approach and the ability to make these decisions autonomously are where the paper identifies advances. This isn’t a narrow “shoe-under-bed-getter” function, it’s a general tool for accessing areas the robot itself can’t fit into, whether that means pushing a recessed button, lifting a cup sitting on its side, or reaching between condiments to grab one in the back.

A visualization of how the robot perceives its environment.

As with just about everything in robotics, this is harder than it sounds, and it doesn’t even sound easy. The “brain” needs to be able to recognize objects, accurately measure distances, and fundamentally understand physical relationships between objects. In the shoe grabbing situation above, what’s stopping a robot from trying to lift the bed and leave it in place floating above the ground while it drives underneath? Artificial intelligences have no inherent understanding of any basic concept and so many must be hard-coded or algorithms created that reliably make the right choice.

Don’t worry, the robots aren’t quite at the “collect shoes” or “collect remaining humans” stage yet. The tests to which the team subjected their little robot were more like “get around these cardboard boxes and move any pink-labeled objects to the designated drop-off area.” Even this type of carefully delineated task is remarkably difficult, but the bot did just fine — though rather slowly, as lab-based bots tend to be.

The authors of the paper have since finished their grad work and moved on to new (though surely related) things. Tarik Tosun, one of the authors whom I talked with for this article, explained that he’s now working on advancing the theoretical side of things as opposed to, say, building cube-modules with better torque. To that end he helped author VSPARC, a simulator environment for modular robots. Although it is tangential to the topic immediately at hand, the importance of this aspect of robotics research can’t be overestimated.

You can find a pre-published version of the paper here in case you don’t have access to Science Robotics.



from TechCrunch https://ift.tt/2OjQAN0
Share:
//]]>

0 comments:

Post a Comment

Blog Archive

Definition List

Unordered List

Support