Sơ lược về Vision-Based Navigation

Vision-based Navigation là một trong những lý thuyết về công nghệ tự hành (autonomous driving). Bên cạnh Laser-Base, IMU-base, thì vision base là một công nghệ có thể nói là khá rẻ, chỉ cần một 3D-camera(stereo-camera hoặc Kinect), ta có thể chụp được hình ảnh 3D của môi Trường xung quanh dùng vision odometry để xác định vị trí và hướng đi của robot trong map và có thể nói là chúng ta đã thực hiện xong SLAM(Simultaneous Localization and Mapping).

Để nói về vision-base trước tiên cần nói về cách để chúng ta match hai tấm ảnh lại. Khi ta sử dụng camera để chụp ảnh thì chỉ chụp được một tấm vào một thời điểm thôi. Nhưng khi bạn dung panorama chẳng hạn, thì có thể chụp được tấm hình với góc rộng hơn nhiều chi tiết hơn sẽ được thể hiện. Chế độ panorama có thể làm được điều này nhờ ghép các tấm ảnh đơn lẻ lại với nhau. Nhưng ghép như thế nào, hôm nay chúng ta sẽ tìm hiểu về điều đó.

CS.PNG

Nhìn vào hai tấm ảnh trên ta thấy chúng được chụp ở 2 góc gần nhau, tấm thứ hai dịch qua phải một tí. Và nếu mình muốn thấy hết dãy núi thì phải ghép hai tấm lại. Và các bước ghép như sau:

1/ Đầu tiên ta sẽ nhìn ra những điểm quan trọng trong một bức hình, gọi là features detection, bởi vì bức hình là một tập hợp những điểm ảnh, và chỉ cần một số điểm ảnh là có thể miêu tả gần như đầy đủ tấm hình. Có nhiều cách để tách các features từ tấm ảnh, ví dụ như ta dùng Canny edges detection. Hoặc là dùng convolution high pass filter quét qua tấm ảnh để thu được những khu vực có độ tương phản cao (high contrast). Sau khi làm các bước trên ta có tấm hình như sau.

2/ Sau khi xác định được các điểm quan trọng, việc tiếp theo là nối tụi nó lại, vấn đề là nối thế nào?

Trước tiên ta phải nhận dạng các features mà ta detect được, bởi muốn ghép hai tấm hình ngọn núi lại, vậy thì khu vực nào phải ghép với khu vực đó, như chân núi ghép với chân núi, đỉnh núi ghép với đỉnh núi. Không thể lấy râu ông nọ cắm cằm bà kia được. Các features được chọn phải đặc biệt, và vẫn giữ đặc tính khi bị xoay hoặc di chuyển.

Một trong những Phương pháp áp dụng là SIFT(Scale invariance features transformation):

CS2.PNG

Ý tưởng của SIFT:

Nội dung của một bức ảnh sẽ được lấy ra để vào một khu vực, ở đây  ta gọi là “túi ảnh”. Túi này chứa những features nói lên đặc tính của tấm ảnh thứ nhất.  Khi so sánh với tấm ảnh thứ hai được chụp từ một góc khác , những features được so sánh để xác nhận xem hai tấm có giống nhau hay không.

CS3.PNG

Sơ lược về Robot Operating System(ROS)

Robot operating system  là một hệ thống phần mềm chuyên dụng để lập trình và điều khiển robot, bao gồm các công cụ để lập trình, hiển thị, tương tác trực tiếp với phần cứng, và kết nối cộng đồng robot trên toàn thế giới. Nói chung là nếu bạn muốn lập trình và điều khiển một con robot, sử dụng phần mềm ROS sẽ giúp quá trình thực hiện nhanh hơn và bớt đau khổ hơn rất nhiều. Và bạn không cần ngồi viết lại những thứ mà người khác đã làm rồi, mà có những thứ muốn viết lại cũng không có khả năng. Như Lidar hoặc Radar driver chẳng hạn.

ROS chạy trên nền Ubuntu,  do đó để sử dụng ROS đầu tiền các bạn phải cài Linux. Cho bạn nào chưa biết cài Linux và ros thì mình có link này cho các bạn:

 

Những Robot và sensor được hỗ trợ bởi ROS:

16

Trên đây là những robot được hỗ trợ, bắt đầu từ Pepper(a), REEM-C(b), Turtlebot(c), Robotnaut(d) và Universal robot(e). Ngoài ra, các sensor được hỗ trợ bởi ROS gồm có LIDAR, SICK laser lms1xx, lms2xx, Hokuyo, Kinect-v2, Velodyne.., để biết thêm chi tiết, các bạn có thể xem hình dưới đây.

17

Hiểu cơ bản về cách hoạt động của ROS:

Về cơ bản ROS files được bố trí và hoạt động như sau, từ trên xuống theo thứ tự như sau, metapackages, packages, packages manifest, Misc, messages, Services, codes:

18Trong đó gói tổng(Metapackages) là một nhóm các gói(packages) có liên quan tới nhau. Lấy ví dụ như, trong ROS có một gói tổng tên là Navigation, gói này có chứa tất cả các gói liên quan tới việc di chuyển của robot, bao gồm di chuyển thân, bánh, các thuật toán liên quan như Kalman, Particle filter… Khi chúng ta cài đặt gói tổng, nghĩa là tất cả các gói con trong nó cũng được cài đặt.

Gói(Packages), ở đây là mình dịch là gói cho dễ hiểu, khái niệm gói rất quan trọng, chúng ta có thể nói rằng cái gói chính là các nguyên tử cơ bản nhất tạo nên ROS. Trong một gói gồm có, ROSnode, datasets, configuration files, source files,  tất cả được gói lại trong một “gói”. Tuy nhiên, mặc dù có nhiều thứ  trong một, gói, nhưng để làm việc, chúng ta chỉ cần quan tâm 2 thứ trong 1 gói, đó chính là src folder, chứa source code của chúng ta, và file Cmake.txt, đây là nơi ta khai báo những thư viện cần thiết để thực thi(compile) code.

Sự Tương tác giữa các node trong ROS

ROS computation graph là bức tranh toàn cảnh về sự tương tác của các nodes, topics với nhau.

19

Ở hình trên ta có thể thấy Master chính là nodes kết nối tất cả các node còn lại, các nodes còn lại muốn giao tiếp với nhau phải thông qua node Master.

Nodes: ROS nodes chỉ đơn giản là quá trình sử dụng ROS API để giao tiếp với nhau. Một robot có thể có rất nhiều nodes để thực hiện quá trình giao tiếp của nó. Ví dụ như, một con robot tự lái sẽ có những node sau, node đọc dữ liệu từ Laser scanner, Kinect camera, localization and mapping, node gửi lệnh vận tốc cho hệ thống bánh lái.

Master: ROS master đóng vai trò như một node trung gian kết nối giữa các node khác nhau. Master bao quát thông tin về tất cả các nút chạy trong môi trường ROS. Nó sẽ trao đổi chi tiết của một nút với khác để thiết lập kết nối giữa chúng. Sau khi trao đổi thông tin, giao tiếp sẽ bắt đầu giữa hai nút ROS. Khi bạn chạy một chương trình ROS, lúc nào ros_master cũng phải chạy trước. Bạn có thể chạy ros master bằng cách ->terminal->roscore.

Message: Các nút ROS có thể giao tiếp với nhau bằng cách gửi và nhận dữ liệu dưới dạng ROS mesage. ROS message là một cấu trúc dữ liệu được sử dụng bởi các nút ROS để trao đổi dữ liệu. Nó giống như là một protocol, định dạng thông tin gửi đi nữa các node, ví dụ như string, float, int…

Topic: Một trong những phương pháp để giao tiếp và trao đổi tin nhắn giữa hai node được gọi là ROS Topic. ROS Topic giống như một kênh tin nhắn, trong kênh đó dữ liệu được trao đổi bằng ROS message. Mỗi chủ đề sẽ có một tên khác nhau tùy thuộc vào những thông tin mà nó sẽ phụ trách cung cấp. Một Node sẽ đăng bài(publish) thông tin cho một Topic và một nút khác có thể đọc từ Topic bằng cách đăng ký(subcrible) với nó. Cũng giống như bạn muốn xem video của mình thì phải subcrible channel của mình vây. Nếu bạn muốn xem thử chương trình mình đang chạy có những topic nào, thì câu lệnh là rostopic list, nếu muốn xem một topic nào đó xem thử có những node nào đang publish hoặc subcrible vào nó. Thì câu lệnh là rostopic info /têntopic. Nếu muốn xem trong topic đó có gì thì type rostopic echo /têntopic.

Service: Service là một loại phương pháp giao tiếp khác với Topic. Topic
sử dụng tương tác publish hoặc subcrible nhưng trong dịch vụ, nó tương tác theo kiểu request – response. Cái này y chang như bên network. Một nút sẽ hoạt động như một server, có một server thường xuyên
chạy và khi Node client gửi yêu cầu dịch vụ cho server. Máy chủ sẽ thực hiện dịch vụ và gửi kết quả cho máy khách. Client node phải đợi cho đến khi máy chủ phản hồi với kết quả. Server đặc biệt hữu dụng khi chúng ta cần thực hiện một lệnh gì đó mà cần thời gian lâu để xử lý, vậy thì chúng ta để nó ở server, khi cần thì ta gọi.

 

Mùa đông cổ tích của vùng Alsace

Xin chào các bạn, à mà không, xin chào ”các bạn đọc tương lai”  tại vì hiện tại thì mình thấy chưa ai ghé xem cái trang này cả, mà cứ mở miệng ra chào các bạn như đúng rồi thì… hơi kì kì 😀

Đôi dòng giới thiệu (hãy đọc dù nó rất.. không liên quan!) : Giới thiệu luôn nhé, là chuyên mục này không phải do tên chủ nhân của blog này viết. Nhưng do chủ nhân của blog là anh Nguyễn Trương Thành đẹp zai (luôn tự nhận) dụ dỗ mấy lần để mình viết mấy bài về chuyến du lịch của hai đứa, vừa lưu giữ kỉ niệm, vừa màu mè thêm cho cái blog để… hút view ké :))) Chả biết có hút view không nữa…  nhưng vượt qua cái sự lười của bản thân, thì oke, thay vì mình ăn thêm 1 thanh socola, quất thêm một li kem, thì năm 2018 này, mình sẽ dành thời gian để làm 1 chuyện có lợi cho cái… bao tử của mình hơn, đó là quay trở lại việc viết lách, kể từ sau khi cái blog 360 của mình bị khai tử hồi đó (giờ nhớ lại vẫn tiếc, dành cả thanh xuân để viết blog đấy, nên nó hủy là đâm ra lười luôn). Mà tại mình cũng không muốn tự tạo áp lực cho bản thân, nên xài chung một cái mái hiên với anh zai này, thì cũng… được. Mai mốt có bực bội với nhau, người ta đòi quà, mình sẽ… đòi blog và lệ phí viết blog :)))

Ok, xong phần chào hỏi. Thông thường người ta hay có bài mở đầu. Nhưng mình thiết nghĩ, không muốn tốn thời gian của các bạn cho một bài giới thiệu nhàm chán, nên mình lấy chuyến du lịch vui nhất của bọn mình tính đến thời điểm hiện tại làm cảm hứng viết bài đầu tiên: Các ngôi làng Go-thic cổ xưa của miền nam nước Pháp ở vùng Alsace.

 

 

 

Hướng dẫn sử dụng phần mềm DOORS

Xin chào các bạn, trong block này mình sẽ hướng dẫn các bạn cách sử dụng phần mềm DOORS của IBM.

IBM Rational Doors: Getting Started

Đầu tiên phải đăng nhập vào chương trình

1

Ở trang làm việc, những thứ cần chú ý  gồm có hình trụ ở góc trái của màn hình làm việc(work space), ở đó là Database Root, tiếp đến là Folder, và rồi bên trong folder là Project, thanh bar phía trên hiển thị location of current selection. Hình phía dưới hiển thị Default Workbench của DOORS.

 

2

Click chuột phải vào icon project để tạo ra một formal module mới, bạn cũng có thể chọn template ở đây bằng cách click chuột trái vào browse icon.

3

Sau khi các bạn tạo ra formal module cho riêng mình, chuột phải vào module đó để tạo ra một object mới. Các bạn cũng có thể dùng phím tắt để làm điều tương tự.

4

Hình phía dưới giải thích những vị trí của objects, gồm có level1 object, level2 objects là con của level1 object. Ở bên trái là ID của objects.

5

Click chuột phải vào level2 object sau đó click vào properties để thêm text vào object.

6

Đây là access của một object, bạn có thể chọn bằng cách bấm qua chọn access bên cạnh general.

7

Bạn cũng có thể thêm table từ table menu dưới mỗi object, khi add table bạn có thể set hàng và cột. Sau khi add table xong thì sẽ như hình sau.

9

Chúng ta có thể thêm filter bằng cách click chuột vào biểu tượng filter properties.

10.PNG

Thêm một object mới bằng cách click chuột phải vào một object chọn Link, start Link. Sau đó click một cái object Link mới, chọn link from start để hoàn thành quá trình link.

Để tạo ra một document, chọn File -> Export -> Document Generation như hình bên dưới.

11

 

Occupancy-Grid Maps

Occupancy-grid maps (H.P. Moravec, 1988; H.P. Moravec et al, 1989; A. Elfes, 1987, A. Elfes, 1989; S. Thrun et al, 2005) :

Occupanny-grid map (bản đồ lưới) thể hiện môi trường được chia nhỏ thành các mắt lưới, các ô này có thể tự do( free) hoặc bị chiếm giữ( occupied), mỗi ô đại diện cho một diện tích thực tế trong môi trường thực và mỗi ô sẽ có một giá trị biểu diễn xác xuất nó có đang bị chiếm giữ hoặc tự do (chiếm giữ ở đây nghĩa là ở đó có vật cản, hoặc tường .., tự do(free) nghĩa là tại vị trí đó không có gì cả, và chúng ta có thể đi qua khu vực đó.

Giá trị occupancy của ô thứ nhất trong occupancy grid-map tại thời điểm t được biểu diễn bởi xác xuất p, .. P tại thời điểm t phải nằm trong khoảng từ 0 tới 1. Ta có thể hiểu rằng P= 1 nghĩa là ô đó bị chiếm giữ(occupied), P=0 nghĩa là ô đó trống(free), P=0.5 nghĩa là không biết(unknown) hoặc khu vực chưa khám phá (unexplored area).

Các bạn có đồng ý rằng, Robot không có bất kì nhận định nào về thế giới mà lần đầu nó bị đặt vào trong đó. Cũng như bạn bị bắt cóc đến một nơi xa lạ vậy, bạn hoàn toàn mất phương hướng. Do đó P sẽ có giá trị P=0.5 co tất cả i tại thời điểm t=0. Map sẽ được cập nhật thông qua log odds của occupancy. Sự vượt trội của log odd là nó có thể tránh được sự nhập nhằng giữa 0 và 1, vì đôi khi giá trị của nó sẽ là 0,3 hoặc 0,7. Do đó, ta có cách tính tình trạng bị chiếm giữ của ô thứ n trong grid-map theo công thức sau:

 { l }_{ t,f\quad }=\quad { l }_{ t-1,f }\quad +\quad { l }_{ sensor }

với lt-1 là log odds được tính từ giá trị occupancy của ô tại thời điểm t-1. Hình 1(a) miêu tả quá trình cập nhật của map. Ô màu đen thể hiện tia laser gặp phải vật cản ở đó ngược lại  các ô màu trắng thể hiện là những vị trí có tia laser đi qua nhưng không bị cản trở, ô màu xám là nơi tia laser không đi qua. Hình 1(b) thể hiện trường hợp tia laser không gặp vật cản nào nhưng đạt mức maximum của nó.

12

Hình ảnh dưới đây là Occupancy Grid map trong thực tế được tạo bởi một máy quét laser, khu vực rìa màu đen thể hiện vật cản, khu vực trắng là trống và khu vực màu xám là tia laser chưa đi qua.

13

Topological  Maps,

Không giống như occupancy grid map, topological maps (D. Kortenkamp et al, 1994; H. Choset, 1996; H. Choset et al, 1996) không thể hiện môi trường xung quanh một cách trực quan bằng cách chia nhỏ bản đồ ra như trên. Thay vào đó, topological map thể hiện môi trường quanh nó như một đồ thị (graph).

Giống như trong hình 3. Một danh sách những khu vực quan trọng như tường, góc, cửa hoặc hành lang, những khu vực này được thể hiện dưới dạng các điểm(node) m. Sự liên kết giữa các điểm m được thể hiện dưới các liên kết Uk. Trong rất nhiều topological map, khoảng cách giữa các khu vực cũng được thể hiện trong các sợi dây liên kết các nodes này. Sự ưu việt của topological map là nó thể hiện các khu vực trong map rất chi tiết, ta có thể zoom vào để xem đặc tính từng khu vực, điều này lý giải tại sao topological map được dùng để phát triển 3D-map.

14

Topological maps là sự lựa chọn tối ưu hơn nếu người dùng quan tâm dung lượng bộ nhớ. Trong trường hợp chúng ta sử dụng laptop hay raspberry pi có dung lượng bộ nhớ thấp. Đó là bởi vì ít memory cần để lưu giữ nodes so với một số lượng lớn các ô được sử dụng trong grid-map. Tuy nhiên điều này cũng đồng nghĩa với, graph-map sẽ ít chính xác hơn grid-map. Lý do là một số thông tin quan trọng ví dụ như vị trí của các ô màu xám mà tia laser không đến được sẽ không được hiển  thị trong bản đồ. Do đó khi robot sử dụng graph-map sẽ không thể di chuyển nhanh mà vẫn giữ an toàn như sử dụng grid-map, lời khuyên là khi sử dụng topological map thì nên cho robot di chuyển chậm thôi.

 

 

Autonomous Navigation

Trong bài viết này mình sẽ nói về một đề tài rất thú vị, đó là “Xe tự lái “, hẳn các bạn cũng nghe về chủ đề này nhiều rồi. Đây là một hướng đi mới cho ngành công nghiệp xe hơi vốn ít có những thay đổi đột phá từ khi những chiếc xe bốn bánh lần đầu tiên lăn bánh trên đường vào đầu thế kỉ 19, đến nay đã gần 200 năm trôi qua và chúng vẫn là … xe bốn bánh:)).

Mặc dù có rất nhiều nâng cấp về tốc độ, mẫu mã, nhiên liệu sử dụng, nhưng khi nói về auto quan niệm của chúng ta vẫn là một cỗ máy 4 bánh được mấy bác tài xế lái đưa chúng ta đi mọi miền tổ quốc. Vâng, người lái ở  đây chính là điểm mấu chốt, chứ không có ai lái thì xe xịn mấy cũng đắp chiếu!

Vào năm 2004 đã có 1 cuộc thi về những chiếc xe có thể tự vận hành mà không cần người điểu khiển đã được tổ chức tại Mỹ, từ đây đã tạo ra một cuộc chạy đua giữa các công ty ô tô, để sản xuất chiếc xe tự lái cho riêng mình. Hẳn các bạn thắc mắc là tại sao từ năm 2004 đến nay đã là 2018, nhưng vẫn chưa thấy xe tự lái xuất hiện. Thực ra là nó đã xuất hiện và đang được các công ty chạy thử nghiệm rồi, chỉ là đang hoàn thiện nên bản thương mại hóa chưa được bán.

OK, mình nghĩ nói về lịch sử như vậy là đủ, bây giờ mình sẽ nói về cách thức hoạt động của một chiếc xe tự lái:

Capture9

Hình trên mô tả các bộ phận của một chiếc xe tự lái, bao gồm:

  • LIDAR, máy quét laser dùng để quét môi trường xung quanh và tạo ra một bản đồ khu vực(local map) xung quanh xe.
  • Camera, được gắn trước mũi xe để tính toán xem xe có chạy đúng làn hay không, nó cũng được tích hợp một số thuật toán xử lý ảnh kết hợp với machine learning để phân biệt được những biển báo giao thông và các phương tiện giao thông khác.
  • Một Radar được gắn trước mũi xe, để xác định khoảng cách tới xe phía trước, từ đó đưa ra vận tốc chạy xe hợp lý.
  • Ultrasonic sensor được gắn ở cửa bên hông xe, để tính khoảng cách với lề đường hoặc các xe chạy bên cạnh.
  • On-board unit chính là bộ xử lý chính của xe tự lái, thường sẽ là một bộ vi xử lý mạnh như là Intel Xenon và GPU để tổng hợp dữ liệu từ các cảm biến nói trên. E-map chính là bản đồ khu vực được máy chủ của xe kết hợp với GPS để biết chính xác vị trí của xe.
  • Wheel encoder, chính là cái bánh, nói đúng hơn thì là bộ phận trực tiếp điều khiển bánh xe, nó sẽ nhận lệnh từ on-board unit như là rẽ phải, quẹo trái, đi thẳng.., và điều khiển bánh xe theo những lệnh này.

Như các bạn đã biết, GPS là dùng để định vị chúng ta trên thế giới này với sự giúp đỡ của vệ tinh, và chúng ta cũng biết là nó không chính xác lắm, tầm 99% thôi. GPS được dùng để xác định Kinh độ và Vĩ độ của chiếc xe. Sự chính xác của GPS được cải thiện bởi các loại cảm biến được gắn trên xe, một số cảm biến có độ chính xác được tính bằng m, một số chính xác nhỏ hơn 1 mét.  Bng cách kết hợp GPS, IMU (Inertial measurement units) và wheel odometry data, bằng thuật toán sensor fusion, vịtrí của xe được xác định một cách chính xác hơn.

Dưới đây là block diagram (sơ đồ hoạt động) của một chiếc xe tự lái được sử dụng trong DARPA Challenge:

xxx

Sensor interface modules: Bao gồm tất cả tương tác giữa các cảm biến và chiếc xe ,những cảm biến chính của xe bao gồm LIDAR, Radar, camera, IMU, GPS và wheel encoders.

Perception modules: Đây là nơi tiếp nhận và xử lý tín hiệu từ tất cả các cảm biến như LIDAR, camera… để định vị những vật thể tĩnh hoặc động ở môi trường xung quanh xe và tạo ra một bản đồ cục bộ, đồng thời cũng giúp xác định vị trí của chính chiếc xe dựa trên vị trí của các vật trong bản đồ cục bộ nói trên.

Navigation modules: Xác định hành vi của chiếc xe tự lái, bao gồm tính toán quãng đường đi chính xác nhất cho xe cũng như điều khiển các module khác như là thắng khẩn cấp hoặc gạt nước tự động.

Vehicle interface: Sau khi tính toán được quãng đường ngắn nhất, các lệnh điều khiển, bao gồm điều khiển vô-lăng, bánh xe, thắng, sẽ được gửi từ bộ vi xử lý tới chiếc xe thông qua Drive-By-Wire(DBW) interface. DBW về cơ bản được xây dựng giống như CAN Bus system.

User interface: Đây là nơi chúng ta có thể thấy và tương tác được với hệ thống xe tự lái, bao gồm màn hình touch screen để chúng ta có thể nhập điểm đến, hoặc có thể điều khiển bằng giọng nói. Tất nhiên cũng có nút bấm để ngắt toàn bộ hệ thống trong trường hợp nguy hiểm.

 

 

 

 

RTAB-Map and Kidnapped Robot

One of the more difficult challenges in robotics is the so-called “kidnapped robot problem.”  Imagine you are blindfolded and taken by car to the home of one of your friends but you don’t know which one.  When the blindfold is removed, your challenge is to recognize where you are.  Chances are you’ll be able to determine your location, although you might have to look around a bit to get your bearings.  How is it that you are able to recognize a familiar place so easily?

It’s not hard to imagine that your brain uses visual cues to recognize your surroundings.  For example, you might recognize a particular painting on the wall, the sofa in front of the TV, or simply the color of the walls.  What’s more, assuming you have some familiarity with the location, a few glances would generally be enough to conjure up a “mental map” of the entire house.  You would then know how to get from one room to another or where the bathrooms are located.

Over the past few years, Mathieu Labbé from the University of Sherbrooke in Québec has created a remarkable set of algorithms for automated place learning and SLAM (Simultaneous Localization and Mapping) that depend on visual cues similar to what might be used by humans and other animals.  He also employs a memory management scheme inspired by concepts from the field of Psychology called short term and long term memory.  His project is called RTAB-Map for “Real Time Appearance Based Mapping” and the results are very impressive.

Real Time Appearance Based Mapping (RTAB-Map)

The picture on the left is the color image seen through the camera.  In this case, Pi is using an Asus Xtion Pro depth camera set at a fairly low resolution of 320×240 pixels.  On the right is the same image where the key visual features are highlighted with overlapping yellow discs. The visual features used by RTAB-Map can be computed using a number of popular techniques from computer vision including SIFT, SURF, BRIEF, FAST, BRISK, ORB or FREAK.  Most of these algorithms look for large changes in intensity in different directions around a point in the image.  Notice therefore that there are no yellow discs centered on the homogeneous parts of the image such as the walls, ceiling or floor.  Instead, the discs overlap areas where there are abrupt changes in intensity such as the corners of the picture on the far wall.  Corner-like features tend to be stable properties of a given location and can be easily detected even under different lighting conditions or when the robot’s view is from a different angle or distance from an object.

RTAB-Map records these collections of visual features in memory as the robot roams about the area.  At the same time, a machine learning technique known as the “bag of words model” looks for patterns in the features that can then be used to classify the various images as belonging to one location or another.  For example, there may be a hundred different video frames like the one shown above but from slightly different viewpoints that all contain visual features similar enough to assign to the same location.  The following image shows two such frames side by side:

rtabmap-image-match

Here we see two different views from essentially the same location.  The pink discs indicate visual features that both images have in common and, as we would expect from these two views, there are quite a few shared features.  Based on the number of shared features and their geometric relations to one another, we can determine if the two views should be assigned to the same location or not.  In this way, only a subset of the visual features needs to be stored in long term memory while still being able to recognize a location from many different viewpoints.  As a result, RTAB-Map can map out large areas such as an entire building or an outdoor campus without requiring an excessive amount of memory storage or processing power to create or use the map.

Note that even though RTAB-Map uses visual features to recognize a location, it is not storing representations of human-defined categories such as “painting”, “TV”, “sofa”, etc.  The features we are discussing here are more like the receptive field responses found in lower levels of the visual cortex in the brain.  Nonetheless, when enough of these features have been recorded from a particular view in the past, they can be matched with similar features in a slightly different view as shown above.

RTAB-Map can stitch together a 3-dimensional representation of the robot’s surroundings using these collections of visual features and their geometric relations.  The Youtube video below shows the resulting “mental map” of a few rooms in a house:

The next video demonstrates a live RTAB-Map session where Pi Robot has to localize himself after been set down in a random location.  Prior to making the video, Pi Robot was driven around a few rooms in a house while RTAB-Map created a 3D map based on the visual features detected.  Pi was then turned off (sorry dude!), moved to a random location within one of the rooms, then turned on again.  Initially, Pi does not know where he is.  So he drives around for a short distance gathering visual cues until, suddenly, the whole layout comes back to him and the full floor plan lights up.  At that point we can set navigation goals for Pi and he autonomously makes his way from one goal to another while avoiding obstacles.

Du lịch Bắc Âu

Hallo các bạn, hôm nay mình xin kể về chuyến đi 3 nước khu vực bắc âu mà mình vừa mới đi tháng 12 năm nay.

Chả là trước giờ mình nghe trên phía bắc, khu vực băng tuyết dày đặc có 1 sư kiện tuyệt đẹp xảy ra gọi là cực quang( polar light), dành cho bạn nào chưa biết thì nó như này này

6860114-polar-lights-wallpaper.jpg

Đấy, đẹp chưa!!

Ấy vậy mà sự thật thì chẳng được vậy đâu, à mà thôi, để kể từ đầu chứ mới vô đã dìm thế này ai còn muốn đi nữa:)))

Chuyến đi kéo dài trong vòng 4 ngày với lịch trình như sau. Ngày đầu tiên đi máy bay đến Sweeden, ăn chơi nhảy múa ở đó đến chiều thì lên cruise( cái tàu to to sang sang chảnh chảnh chuyên chở khách du lịch trên phim ấy), từ Copehagen sang Helsinki, thủ đô Findland. Từ FindLand sẽ đi bus Lên cái làng mà hồi xưa có ông già rảnh hay vác của nhà đi cho sau này người ta gọi là ông già noen hay Santa Claus gì ấy. Cuối cùng đi tàu sang Talin thủ đô của Estonia, rồi đi về thôi. Giờ câu chuyện sẽ bắt đầu ở Copehagen. Ở đây hơi bị… buồn, thật áy náy với mấy bạn thuỵ Điển cơ mà thủ đô của mấy bạn toàn người già, hông thấy nhộn nhịp gì hết trơn. Cơ  mà nhà đẹp, đồ ăn ngon với cả đặc sản cung điện hoàng gia với mấy anh lính đứng canh anh nào cũng rất là…. Kiên nhẫn, muỗi đốt không dám đập, mưa ướt không dám lau, ngứa… Không dám gãi. Phải rồi, trang bị tận răng cơ với cả chắc lương cao ngất ngưởng chỉ mỗi việc đứng đấy từ sáng tới chiều cho thiên hạ người ta chụp hình, bình luận, dò xét:)). Dưới đây là hình cực ngẩu của mấy ảnh (máy cùi chụp bị mờ, các bạn thông cảm, hì hì).

DSC_0046

The Witcher 3: Wild Hunt

The Witcher 3: Wild Hunt (Polish: Wiedźmin 3: Dziki Gon) is a high-fantasy, action role-playing video game set in an open-world environment, developed by CD Projekt RED. Announced in February 2013, it was released worldwide for Microsoft Windows, PlayStation 4, and Xbox One on 19 May 2015. The game is the third in the series, preceded by The Witcher and The Witcher 2: Assassins of Kings, which are based on the series of fantasy novels by Polish author Andrzej Sapkowski.

Played in a third-person perspective, players control protagonist Geralt of Rivia, a monster hunter known as a witcher, who sets out on a long journey through the Northern Kingdoms. In the game, players battle against the world’s many dangers using swords and magic, while interacting with non-player characters and completing side quests and main missions to progress through the story. The game was met with critical acclaim and was a financial success, selling over 6 million copies in six weeks. The game won over 200 Game of the Year awards from various gaming websites, critics, and game award shows including the Golden Joystick Awards and The Game Awards.

The purpose of this guide is to maximize your chances for romantic encounters in The Witcher 3: Wild Hunt. Some of the characters Geralt gets to bed are true romantic interests, while others are just casual partners. Either way, in order to end up in bed with your chosen partner, you’ll have to seduce them. This will be done through gifts, sweet talking and similar actions. In this Witcher 3 romance guide, we’re going to list all the character we find you can have sex with, as well as the conditions for having it.

While adventuring, Geralt of Rivia has more than one opportunity to polish more than his steel sword for an evening. There are a number of women that can be wooed into a night of passion. But how many? Who? And where? Glad you asked. The following are the times, quests (where appropriate), and ladies you can spend a romantic evening, or a rutting session, with. Any stipulations are listed in their appropriate quests.

wicher

Those who’ve played the previous games are already familiar with Triss – she has starred in both of the former games, and has been available for romance in both, too. Once again, she can be a romantic interest if you choose so. You need to finish her sidequest – Now or Never, after you’ve done the main quest A Favor For Radovid, as well as the secondary quest A Matter of Life And Death.

During the A Matter of Life and Death, you need to kiss Triss at the masquerade. When you start Now or Never, go and defend the mages. When you’re at the docks near the end, Triss is resolved to leave for Kovir with the other sorcerers. Geralt can ask her to stay, telling her that they can try to make their relationship work, or he can truly pour his heart out and tell her that he loves her. She then boards the boat, but (if Geralt said he loves her and only then) comes back for you. You then have sex at a lighthouse.

Đông Sơn drums

Đông Sơn drums (also called Heger Type I drums) are bronze drums fabricated by the  Đông Sơn culture in the Red River Data of northern Vietnam. The drums were produced from about 600 BCE or earlier until the third century CE and are one of the culture’s finest examples of Metalworking.

The drums, cast in bronze using the lost-wax casting method are up to a meter in height and weigh up to 100 kilograms (220 lb). Đông Sơn drums were apparently both musical instrument and cult objects. They are decorated with geometric patterns, scenes of daily life and war, animals and birds, and boats. The latter alludes to the importance of trade to the culture in which they were made, and the drums themselves became objects of trade and heirlooms. More than 200 have been found, across an area from eastern Indonesia to Vietnam and parts of Southern China.

History

Co_Loa_bronze_drum

The earliest drum found in 1976 existed 2700 years ago in Wangjiaba in Yunnan Chuxiong Yi Autonomous Prefecture China. It is classified into the bigger and heavier Yue drums including the Dong Son drums, and the Dian drums, into 8 subtypes, purported to be invented by Ma Yuan and Zhuge Liang. But the Book of the Later Han said Ma melt the bronze drums seized from the rebel Lạc Việt in into horse.

The discovery of Đông Sơn drums in New Guinea, is seen as proof of trade connections – spanning at least the past thousand years – between this region and the technologically advanced societies of Java and China.

In 1902, a collection of 165 large bronze drums was published by F. Heger, who subdivided them into a classification of four types.