$conf, $time;
$_uid = user_token_get_do();
empty($_uid) and user_token_clear(); // 退出登录
return $_uid;
}
// 用户
function user_token_get_do()
{
global $conf, $time, $ip, $useragent;
$token = param($conf['cookie_pre'] . 'token');
if (empty($token)) return FALSE;
$tokenkey = md5(xn_key());
$s = xn_decrypt($token, $tokenkey);
if (empty($s)) return FALSE;
$arr = explode("\t", $s);
if (count($arr) != 5) return FALSE;
list($_ip, $_time, $_uid, $_pwd, $ua_md5) = $arr;
if (array_value($conf, 'login_ip') && $ip != $_ip) return FALSE;
if (array_value($conf, 'login_ua') && md5($useragent) != $ua_md5) return FALSE;
$_user = user_read($_uid);
if (empty($_user)) return FALSE;
if (array_value($conf, 'login_only') && $_user['login_date'] != $_time) return FALSE;
// 密码是否被修改
if (md5($_user['password']) != $_pwd) return FALSE;
return $_uid;
}
// 设置 token,防止 sid 过期后被删除
function user_token_set($uid)
{
global $conf, $time;
if (empty($uid)) return '';
$token = user_token_gen($uid);
setcookie($conf['cookie_pre'] . 'token', $token, $time + 86400000, $conf['cookie_path'], $conf['cookie_domain'], '', TRUE);
return $token;
}
function user_token_clear()
{
global $conf, $time;
setcookie($conf['cookie_pre'] . 'token', '', $time - 8640000, $conf['cookie_path'], $conf['cookie_domain'], '', TRUE);
}
function user_token_gen($uid)
{
global $conf, $time, $ip, $useragent;
$key = 'user_token' . $uid;
static $cache = array();
if (isset($cache[$key])) return $cache[$key];
$user = user_read($uid);
$pwd = md5($user['password']);
$ua_md5 = md5($useragent);
$tokenkey = md5(xn_key());
$cache[$key] = xn_encrypt("$ip $time $uid $pwd $ua_md5", $tokenkey);
return $cache[$key];
}
// 前台登录验证
function user_login_check()
{
global $user;
empty($user) and http_location(url('user-login'));
}
// 获取用户来路
function user_http_referer()
{
global $conf;
$referer = param('referer'); // 优先从参数获取 | GET is priority
empty($referer) and $referer = array_value($_SERVER, 'HTTP_REFERER', '');
$referer = str_replace(array('\"', '"', '<', '>', ' ', '*', "\t", "\r", "\n"), '', $referer); // 干掉特殊字符 strip special chars
if (
!preg_match('#^(http|https)://[\w\-=/\.]+/[\w\-=.%\#?]*$#is', $referer)
|| FALSE !== strpos($referer, url('user-login'))
|| FALSE !== strpos($referer, url('user-logout'))
|| FALSE !== strpos($referer, url('user-create'))
|| FALSE !== strpos($referer, url('user-setpw'))
|| FALSE !== strpos($referer, url('user-resetpw_complete'))
) {
$referer = $conf['path'];
}
return $referer;
}
function user_auth_check($token)
{
global $time, $ip;
$auth = param(2);
$s = xn_decrypt($auth);
empty($s) and message(-1, lang('decrypt_failed'));
$arr = explode('-', $s);
count($arr) != 4 and message(-1, lang('encrypt_failed'));
list($_ip, $_time, $_uid, $_pwd) = $arr;
$_user = user_read($_uid);
empty($_user) and message(-1, lang('user_not_exists'));
$time - $_time > 3600 and message(-1, lang('link_has_expired'));
return $_user;
}
?>
录制rosbag的ios app-阿南达文事网
录制rosbag的ios app
编程日记100
更新时间:2025-05-10 18:41:59
录制rosbag的ios app
目的:
- 使用苹果手机把imu,图像以及gps录制成rosbag格式,共算法研究使用
功能:
- 修改topic功能。
- 录制文件自动命名
- 实时wifi传输数据
- 上传bag文件功能
- 录制:图像,IMU,Gps
- 输出图像尺寸设置功能
- 输出图像格式(彩色/黑白)
- 输出频率设置
- 录制文件查看,文件名修改和删除
- 在地图上显示gps
- 同步显示图像,gps和imu滤波出来的姿态
- 显示bag属性:topic名字,msg数量等
- 光流跟踪测试
- imu视觉计算速度,和gps的速度对比
- 传感器数据质量评估
- 上传后自动生成地图功能
- 可视化生成的地图
- 下载定位地图
- 描述符匹配测试
- 调整曝光时间,ISO
- 调整焦距
- 调整色调
- 录制rosbag
细节:
- 因为需要实时在手机和pc间传输数据,所以直接把ros的核心程序编译成ios的静态库。
- ios程序中接收到各种传感器数据后,还做了时间对齐。
- 如果用户选择录制rosbag,就把数据存成bag。如果用户选择发布,就通过ros的消息机制把数据广播出去。
- 手机和pc必须要在一个网关的局域网内,可以使用手机的usb线模拟网线,不过这样好像只有在mac电脑上才性,所以用处不太大。
- 录制的bag放在共享目录里面,使用itune就能取出来。
讨论:
- 编译ros的core到ios真的废了我好多时间,不过借此对编译的理解又深了一步。
- ios的界面布局也是适应了好半天。
- 采用敏捷开发,最后的版本感觉还是挺好用的。
代码:
本文发布于:2023-12-06,感谢您对本站的认可!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:录制rosbag的ios app
发布评论