从本机连接到远程机,发起SSH连接,执行命令cd ~/Downloads;ls
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# router parameters
ROUTER_USER="xiaoqiang"
ROUTER_HOST="192.168.0.110"
ROUTER_PASSWORD="1"
ROUTER_PORT="22" # default
# start except
expect <<-EOF
set timeout -1
spawn ssh $ROUTER_USER@$ROUTER_HOST -p $ROUTER_PORT -o StrictHostKeyChecking=no -C "cd ~/Downloads;ls"
expect "*password:"
send "$ROUTER_PASSWORD\n\r\n"
expect eof;
EOF
首次远程连接时,会提示公钥确认,远程IP改变时,会提示公钥不一致,这种情况有时非常烦人。对于自动化任务,我们希望跳过公钥确认,修改/etc/ssh/ssh_config
,加入:1
StrictHostKeyChecking no
或者在命令行中使用-o
参数: ssh -o StrictHostKeyChecking=no
运行结果:1
2
3
4
5
6
7spawn ssh xiaoqiang@192.168.0.110 -p 22 -o StrictHostKeyChecking=no -C cd ~/Downloads;ls
xiaoqiang@192.168.0.110's password:
c-ares-1.17.0.tar.gz
cd1folder.zsh
CursorTheme
darcula.css
g2o_curve_fitting
在password一行之后为命令执行的结果,一直没法实现换行,不太完美
编译xvisio相机驱动时,遇到了这样的错误
显然是ddynamic_reconfigure
包的问题,于是安装对应的ROS包,但是问题依旧,真是奇怪
于是在cmake中使用MESSAGE(${catkin_LIBRARIES})
看看链接的文件有什么问题,结果发现其他的ROS库都是链接到了ROS安装目录,比如 /opt/ros/noetic/lib/libcamera_info_manager.so
, /usr/lib/x86_64-linux-gnu/libtinyxml2.so
。 唯独ddynamic_reconfigure
链接到了我之前放的库文件: /home/user/catkin_ws/devel/lib/libddynamic_reconfigure.so
这真是太奇怪了,环境变量catkin_LIBRARIES
是如何换到另一个so库文件的??? 于是我把ROS安装目录的libddynamic_reconfigure.so
覆盖catkin_ws
的so库文件,重新编译成功了,相机驱动可以正常运行。
但是这样其实没有解决根本问题,最后只好把target_link_libraries
的${catkin_LIBRARIES}
换成一个个的so文件,在开头要LINK_DIRECTORIES(/opt/ros/noetic/lib)
detect_floors.h定义了关于3D扫描楼层的数据结构。1
2
3
4
5
6
7
8
9
10struct Timespan {
common::Time start;
common::Time end;
};
Timespan表征扫描的时间范围。
struct Floor {
std::vector< Timespan> timespans;
double z; //z轴的中值
};
一个楼层对应多个扫描timespan:有可能重复的扫描多次,但只有一个高度z。
std::vector DetectFloors(const proto::Trajectory& trajectory);
使用启发式搜索寻找building的不同楼层的z值。
用于计算TSDF地图中的点云法向量,可以不看。 normal_estimation_2d_test.cc
是测试文件,但是没有在CMakeLists
中设置 。
这段代码其实是模仿cartographer的LaunchSubscribers
函数,订阅多个传感器的数据话题,同时可以获得主函数里多个参数的赋值
主函数长这样1
2
3
4
5
6
7
8int main(int argc, char** argv)
{
ros::init(argc, argv, "launch_subscribers");
ros::NodeHandle nh;
Node node;
node.LaunchSubscribers("base_scan", 1, "/base_odometry/odom", 1, "/torso_lift_imu/data", 1);
ros::spin();
}
1 | void Node::LaunchSubscribers(const std::string& scan_topic, const int scan_num, |
Gazebo对电脑显卡有一定要求,不能太差了。另外对Nvidia显卡支持较好,对AMD的显卡支持较差,如果是AMD的显卡,复杂的世界模型一般加载不出来。
根据官方文档配置
最好添加一行remap: < remap from
这里的报错很正常,不用管
不知道为什么Rviz里有两个很大的圆,不是话题,应该是Rviz的配置
参考:官方文档
R树是为了加快地理方面的计算,构建一颗R树,然后非常方便的往R树里添加矩形索引。
namespace bgi = bg::index;
using RTree = bgi::rtree
1 |
|
注意直线的初始化和线段是不一样的
头文件: #include <algorithm>
返回范围 [first, last)
中满足特定判别标准的首个元素:
find: 搜索等于 value 的元素
find_if: 根据指定的查找规则,在指定区域内查找第一个符合该函数要求(使函数返回 true)的元素。如果查找成功,该迭代器指向的是查找到的那个元素;反之,如果查找失败,该迭代器的指向和 last 迭代器相同
find_if_not: 与find_if相反
示例代码:1
2
3
4
5
6
7
8
9
10
11std::vector<int> score{ 10, 20, 30, 40 };
auto it_1 = std::find(score.begin(), score.end(), 30 );
if(it_1 != score.end() )
qDebug()<< "found !";
else qDebug()<< "no found !";
auto it_2 = std::find_if(score.begin(), score.end(), [](int& m){return m>20;} );
if(it_2 != score.end() )
qDebug()<< "found: " << *it_2;
else qDebug()<< "no found !";